{"openapi":"3.0.0","paths":{"/api":{"get":{"description":"Returns server status. No authentication required.","operationId":"AppController_getHealth","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"operationId":"McpUserController_subscribe","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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).","operationId":"McpUserController_patchSubscription","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUpdateAgentSubscriptionBodyDto"},"examples":{"minimal":{"summary":"Pause agent subscription","value":{"isPaused":true}},"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}}}}}},"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 (mirrors GraphQL `UnsubscribeFromAgentInput`).","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. Defaults to true (keep open trades).","schema":{"default":true,"type":"boolean"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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/activations":{"get":{"operationId":"McpUserController_activations","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"AUTO_TRADING","allocationMode":"USD_AMOUNT","allocationAmountUsd":50}},"fullAllFields":{"summary":"All activation fields (incl. deprecated)","value":{"agentId":"507f1f77bcf86cd799439011","tradingBotId":"507f1f77bcf86cd799439012","executionMode":"AUTO_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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","operationId":"McpUserController_patchActivation","parameters":[{"name":"strategyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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}}}}}},"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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","operationId":"DeveloperController_register","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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"}}}}}}},"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.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"Creates a Connect Express account when missing, then returns a hosted onboarding URL. Required before paid agent subscriptions can route creator share (80%) via `transfer_data`. Status updates via `account.updated` webhook.","operationId":"DeveloperController_startStripeConnectOnboarding","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stripe Connect onboarding URL.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/StripeConnectOnboardingResponseDto"}}}]}}}},"400":{"description":"Email required for new Connect account.","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":"Start Stripe Connect onboarding","tags":["Developer"]}},"/api/developers/stripe-connect/summary":{"get":{"description":"Returns Connect account status, USD balances, next payout estimate, lifetime paid payouts, and subscription MRR / churn metrics for the authenticated developer.","operationId":"DeveloperController_getStripeConnectSummary","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stripe Connect summary.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/StripeConnectSummaryDto"}}}]}}}},"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":"Stripe Connect payout summary","tags":["Developer"]}},"/api/developers/stripe-connect/dashboard-link":{"post":{"description":"Returns a short-lived Stripe Express dashboard URL for the connected account. Requires `stripeConnectStatus=active`.","operationId":"DeveloperController_createStripeExpressDashboardLink","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stripe Express dashboard URL.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/StripeConnectDashboardLinkDto"}}}]}}}},"400":{"description":"Connect account not ready.","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":"Stripe Express dashboard login link","tags":["Developer"]}},"/api/v1/developers/earnings":{"get":{"description":"Success-fee totals from post-cap settled trade fees (`totals`, `byAgent`; USDC-denominated), weekly closed periods (`byPeriod`), subscription ledger (`fromSubscriptions`), and Payouts-ledger claimable balances (`claimableUsd`, `totalClaimableUsd`). Requires developer registration.","operationId":"DeveloperRevenueController_earnings","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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/payouts":{"get":{"description":"Paginated weekly payout rows for the authenticated developer (gross, platform fee, net).","operationId":"DeveloperRevenueController_payouts","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"Marks all CLAIMABLE subscription CREATOR earnings as CLAIMED for the authenticated developer. Returns the total USD claimed and number of ledger rows updated. Call GET /v1/developers/earnings first to check `fromSubscriptions.claimableUsd`.","operationId":"DeveloperRevenueController_claimSubscriptionEarnings","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"Aggregates unified per-agent claimable USD (subscriber success fees, `subscription-earnings` CLAIMABLE ledger, legacy `TradingBot.feeEarnings`). Same claim rail as Main App `claimAgentFees`.","operationId":"DeveloperClaimsController_strategyFeesSummary","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 success-fee balances (Payouts Float USDC transfer), marks subscription-ledger rows CLAIMED, and supports legacy bot feeEarnings — capped at `CLAIM_MAX_USD` per agent per call.","operationId":"DeveloperClaimsController_claimStrategyFeesForAgent","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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`, 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","skipped","rate_limited","deduped","no_rule","prefix_skip","error"]}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 or Discord channel)","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"riskLevel","required":false,"in":"query","schema":{"type":"string","enum":["low","medium","high"]}},{"name":"pricingModel","required":false,"in":"query","schema":{"type":"string","enum":["subscription","success-fee","both","free"]}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"riskLevel","required":false,"in":"query","schema":{"type":"string","enum":["low","medium","high"]}},{"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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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-07-25T23:58:01.102Z","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 / unmatched / skipped / soft error payload).","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"filter","required":false,"in":"query","schema":{"$ref":"#/components/schemas/McpTradeFilterQueryDto"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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. 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","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"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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/strategies/status-counts":{"get":{"description":"Mirrors GraphQL `botStatusCounts` / `getBotStatusCounts`.","operationId":"McpStrategyController_statusCounts","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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","HYPERLIQUID"]}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tag names","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"AUTO_TRADING","environment":"REAL"},"executionMode":"AUTO_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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"$ref":"#/components/schemas/Object"}},{"name":"includeWarnings","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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/themes":{"get":{"description":"Mirrors GraphQL `onboardingThemes` (BotInterest enum values).","operationId":"McpAgentController_themes","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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`.","operationId":"McpAgentController_explore","parameters":[{"name":"limit","required":false,"in":"query","schema":{"$ref":"#/components/schemas/Object"}},{"name":"offset","required":false,"in":"query","schema":{"$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","HIGHEST_ALLOCATION"]}},{"name":"sortDirection","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"performanceTimeframe","required":false,"in":"query","description":"Window for TOP_PERFORMING / PERFORMANCE sort (default MONTH)","schema":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]}},{"name":"filter","required":false,"in":"query","description":"Nested filter (bracket query: filter[field]=...)","schema":{"$ref":"#/components/schemas/ExploreAgentsFilterInput"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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,"isDraft":false}}}}}},"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/{id}":{"get":{"description":"Mirrors GraphQL `agent` / `getAgent`.","operationId":"McpAgentController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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\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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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"}},"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"}}}}}},"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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 published persona version for LLM-authored activity feed posts. Agent owner only.","operationId":"McpAgentController_getPersonaLatest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 or no persona published.","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. Publish gate: `persona` and `examples` must be non-empty. Agent owner only.","operationId":"McpAgentController_publishPersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPersonaBodyDto"}}}},"responses":{"201":{"description":"Published persona version.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaVersionDto"}}}]}}}},"400":{"description":"Publish gate 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"}}}},"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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 feed post-writer prompts for each update type using your persona text (or optional custom scenarios JSON). Ephemeral — nothing is saved to the activity feed. Rate-limited per agent.","operationId":"McpAgentController_previewPersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPersonaDraftDto"}}}},"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/{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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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 Stripe Connect `active` when `monthlyPriceUsd` > 0.","operationId":"McpAgentController_setSubscriptionPrice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"Stripe Connect not ready 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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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}/pin":{"post":{"description":"Mirrors `pinAgent`.","operationId":"McpAgentController_pin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"AUTO_TRADING","environment":"REAL"},"executionMode":"AUTO_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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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. MFA session verification from JWT is not available via API key; `verified` is passed as `false` (withdrawals that require MFA may return an error — use the main app after MFA when required).","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletBuySellBodyDto`. GraphQL: `WalletBuySellOperationArgs`. Sell with SL/TP requires exactly one open 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).","operationId":"McpWalletController_addVirtualFunds","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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","schema":{"default":"_id","type":"string","enum":["_id","sendsAt","markAsRead"]}},{"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. `NEW_PICKS,WALLET_UPDATE`)","schema":{"type":"string"}},{"name":"unreadOnly","required":false,"in":"query","description":"true = unread only, false = read only, omit = all","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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/mark-all-read":{"post":{"description":"Mirrors GraphQL `markAllNotificationsAsRead`.","operationId":"McpNotificationController_markAllRead","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":{"botAlerts":true}}},"fullAllFields":{"summary":"All app and email permission keys","value":{"appPermission":{"newsAndOffers":true,"tipsAndHelp":true,"tradeExecution":false,"agentUpdates":true,"botAlerts":true},"emailPermission":{"newsAndOffers":false,"tipsAndHelp":true,"tradeExecution":false,"agentUpdates":true,"botAlerts":true}}}}}}},"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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":"Small verification endpoint for CLI and AI setup flows after OAuth login.","operationId":"McpOAuthController_status","parameters":[{"name":"x-signature","in":"header","required":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Verify OAuth bearer token","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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.","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","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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":false,"description":"HMAC-SHA256 signature: HMAC-SHA256(secretKey, timestamp + METHOD + path + body). Required for API-key authenticated requests (JWT/OAuth session auth is exempt).","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":false,"description":"Request timestamp in epoch milliseconds. Required with x-signature for API-key auth. Rejected if drift exceeds 5 minutes.","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"}}},"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. Defaults to true (keep open trades).","default":true}}},"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"}},"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":"Reserved capital for this agent in USD (computed)"},"inUseUsd":{"type":"number","description":"Open position value for this agent in USD (computed)"},"withdrawableUsd":{"type":"number","description":"Withdraw-able reserved capital (allocated − inUse)"},"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"]},"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"}]}},"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"]},"StripeConnectOnboardingResponseDto":{"type":"object","properties":{"url":{"type":"string","description":"Stripe-hosted Connect onboarding URL"},"stripeConnectAccountId":{"type":"string","description":"Stripe Connect account id (acct_…)"}},"required":["url","stripeConnectAccountId"]},"StripeConnectSubscriptionMetricsDto":{"type":"object","properties":{"activeSubscribers":{"type":"number","description":"Active Stripe-backed subscribers across your agents"},"mrrUsd":{"type":"number","description":"Monthly recurring revenue (USD) from active subscriptions"},"churnedSubscribers":{"type":"number","description":"Canceled Stripe subscriptions (all time)"},"churnRatePercent":{"type":"number","description":"Churn rate: canceled / (active + canceled), percent"}},"required":["activeSubscribers","mrrUsd","churnedSubscribers","churnRatePercent"]},"StripeConnectSummaryDto":{"type":"object","properties":{"connectEnabled":{"type":"boolean","description":"Whether Stripe Connect is enabled on the platform"},"stripeConnectStatus":{"type":"string","enum":["pending","active","restricted"]},"stripeConnectAccountId":{"type":"string"},"availableBalanceUsd":{"type":"number","description":"Available balance on the Connect account (USD)"},"pendingBalanceUsd":{"type":"number","description":"Pending balance not yet available for payout (USD)"},"nextPayoutDate":{"format":"date-time","type":"string","description":"Estimated arrival date for the next pending Stripe payout"},"lifetimePayoutsUsd":{"type":"number","description":"Lifetime paid payouts to the Connect account (USD, recent pages)"},"subscriptions":{"$ref":"#/components/schemas/StripeConnectSubscriptionMetricsDto"}},"required":["connectEnabled","availableBalanceUsd","pendingBalanceUsd","lifetimePayoutsUsd","subscriptions"]},"StripeConnectDashboardLinkDto":{"type":"object","properties":{"url":{"type":"string","description":"Stripe Express dashboard login URL (short-lived)"}},"required":["url"]},"DeveloperEarningsTotalsDto":{"type":"object","properties":{"grossUsd":{"type":"number","description":"Post-cap creator success fees from settled trade closes (USDC-denominated USD)."},"netUsd":{"type":"number"},"platformFeeUsd":{"type":"number"},"claimableUsd":{"type":"number","description":"Outstanding success-fee balance in the Payouts-ledger claimable pool (USDC-denominated USD)."}},"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":"Outstanding success-fee balance in the Payouts-ledger claimable pool (USDC-denominated USD)."}},"required":["developerAgentId","grossUsd","netUsd","platformFeeUsd"]},"DeveloperEarningsByPeriodDto":{"type":"object","properties":{"periodLabel":{"type":"string"},"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 from post-cap settled trade fees (`feeSettlement.creatorClaimableUsd`, USDC-denominated).","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."}},"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"},"periodStartUtc":{"format":"date-time","type":"string"},"periodEndUtc":{"format":"date-time","type":"string"},"cumulativeFeesEarnedUsdAtClose":{"type":"number"},"grossRevenue":{"type":"number"},"platformFee":{"type":"number"},"netPayout":{"type":"number"},"developerRevenueSharePercent":{"type":"number"},"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"]},"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":"Sum of unified per-agent claimable USD (subscriber success fees, subscription-earnings ledger, legacy trading-bot feeEarnings)"}},"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"]},"LinkedTradeFromIngestDto":{"type":"object","properties":{"signalId":{"type":"string"},"status":{"type":"string"},"txHash":{"type":"string","description":"On-chain or simulated tx id when executed."}},"required":["signalId","status"]},"DashboardSignalIngestLogItemDto":{"type":"object","properties":{"id":{"type":"string"},"developerAgentId":{"type":"string"},"platform":{"type":"string","enum":["telegram","discord"]},"externalChannelId":{"type":"string","description":"Channel id (Telegram chat id or Discord channel snowflake). 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","skipped","rate_limited","deduped","no_rule","prefix_skip","error"]},"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"},"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"]},"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"]},"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 on-chain trades — agent is bootstrapping)."},"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."}},"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"},"riskLevel":{"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,"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","riskLevel","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 + 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"]},"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"}}},"PublicDeveloperAgentRiskDto":{"type":"object","properties":{"level":{"type":"string","enum":["low","medium","high"]},"botCount":{"type":"number"}},"required":["level","botCount"]},"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"},"riskLevel":{"type":"string","enum":["low","medium","high"]},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"risk":{"$ref":"#/components/schemas/PublicDeveloperAgentRiskDto"},"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,"allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."}},"required":["id","developerId","name","pricingModel","betaStatus","riskLevel","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"},"riskLevel":{"type":"string","enum":["low","medium","high"]},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"risk":{"$ref":"#/components/schemas/PublicDeveloperAgentRiskDto"},"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,"allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."},"subscription":{"$ref":"#/components/schemas/MyDeveloperAgentSubscriptionSnapshotDto"}},"required":["id","developerId","name","pricingModel","betaStatus","riskLevel","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"},"riskLevel":{"type":"string","enum":["low","medium","high"]},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"risk":{"$ref":"#/components/schemas/PublicDeveloperAgentRiskDto"},"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,"allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."}},"required":["id","developerId","name","pricingModel","betaStatus","riskLevel","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":"Minimum SOL the gas wallet should retain (`GAS_WALLET_MIN_SELF_SOL`).","example":1},"isGasWalletLow":{"type":"boolean","description":"True when gas wallet SOL is below the minimum self balance.","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","isGasWalletLow","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: related trade signal id."},"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},"context":{"type":"object"},"confidence":{"type":"number","minimum":0,"maximum":1}}},"AgentInboundWebhookResponseDto":{"type":"object","properties":{"outcome":{"type":"string","enum":["matched","unmatched","skipped","error"]},"signalId":{"type":"string"},"status":{"type":"string"},"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","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"]}},"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"},"tradeStates":{"type":"array","description":"Comma-separated trade states","items":{"type":"string","enum":["OPEN","CLOSED"]}},"tradeOwnerTypes":{"type":"array","description":"Comma-separated trade owner types","items":{"type":"string","enum":["BOT_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","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","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"]},"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,"example":5},"chargeOnPerformance":{"type":"boolean"},"hideFromPublic":{"type":"boolean"}}},"McpCreateAgentBodyDto":{"type":"object","properties":{"name":{"type":"string","example":"My trading agent","description":"Display name"},"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":"Whether the agent is public"},"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":30,"default":20},"listingStatus":{"type":"string","enum":["pending-review","beta","public","rejected"]},"betaStartDate":{"format":"date-time","type":"string"},"maxBetaUsers":{"type":"number","minimum":1},"riskLevel":{"type":"string","enum":["low","medium","high"]},"performanceStats":{"type":"object"},"featured":{"type":"boolean"},"featuredRank":{"type":"number"},"inboundWebhookUrl":{"type":"string"},"signalSourceKind":{"type":"string","enum":["webhook","signal_group"]},"connectedChannels":{"type":"array","items":{"type":"object"}},"signalDetectionRule":{"type":"object"},"signalExecutionDefaults":{"type":"object"},"parserAiMode":{"type":"string","enum":["inherit","off","shadow","fallback"],"description":"Per-agent hybrid parser: inherit (server env), off, shadow, or fallback."},"membershipGated":{"type":"boolean"},"externalSignupUrl":{"type":"string"}},"required":["name"]},"McpDuplicateAgentBodyDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"description":"Name for the duplicate; default is source name + \" (Copy)\" (truncated to 100 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":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"personalization":{"$ref":"#/components/schemas/AgentPersonalizationInput"},"isPublic":{"type":"boolean"},"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":30,"default":20},"listingStatus":{"type":"string","enum":["pending-review","beta","public","rejected"]},"betaStartDate":{"format":"date-time","type":"string"},"maxBetaUsers":{"type":"number","minimum":1},"riskLevel":{"type":"string","enum":["low","medium","high"]},"performanceStats":{"type":"object"},"featured":{"type":"boolean"},"featuredRank":{"type":"number"},"inboundWebhookUrl":{"type":"string"},"signalSourceKind":{"type":"string","enum":["webhook","signal_group"]},"connectedChannels":{"type":"array","items":{"type":"object"}},"signalDetectionRule":{"type":"object"},"signalExecutionDefaults":{"type":"object"},"parserAiMode":{"type":"string","enum":["inherit","off","shadow","fallback"],"description":"Per-agent hybrid parser: inherit (server env), off, shadow, or fallback."},"membershipGated":{"type":"boolean"},"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.","allOf":[{"$ref":"#/components/schemas/McpAgentPersonalityOverrideDto"}]}}},"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"]},"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"]},"McpAgentListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id"]},"OnboardingAgentsFilterInput":{"type":"object","properties":{}},"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"},"updatedAt":{"type":"string","format":"date-time"}},"required":["version","persona","voice","examples","bannedWords","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"}},"required":["eventType","samplePost"]},"AgentPersonaPreviewResponseDto":{"type":"object","properties":{"samples":{"type":"array","items":{"$ref":"#/components/schemas/AgentPersonaPreviewSampleDto"}}},"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":{"persona":{"type":"string"},"voice":{"type":"string"},"examples":{"type":"string"},"bannedWords":{"type":"string"},"style":{"type":"string","description":"Optional BotStyle preset (FRIENDLY, CYNICAL, etc.). Used as the persona base when no custom persona is published.","example":"FRIENDLY"},"scenarios":{"description":"Optional mock scenarios. When omitted, seven built-in sample events are used. 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 to publish.","example":"Conservative swing trader focused on risk-adjusted entries."},"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; owner formats however they like. Required to publish.","example":"Opened SOL long — breakout retest held, SL under 138.\nClosed ETH +8.4% — took profit into resistance."},"bannedWords":{"type":"string","description":"Free text — banned tokens split on commas, newlines, or spaces for the safety filter.","example":"moon, guaranteed, 100x"}},"required":["persona","examples"]},"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"}},"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","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 for buy/sell (open BUY on buy; sell leg or linked open BUY on sell)"},"openTradeUpdatePending":{"type":"boolean","description":"True when a linked open-trade row updates 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"],"default":"_id"},"query":{"type":"string","description":"Search in title and body (same as GraphQL filter.query)"},"types":{"type":"string","description":"Comma-separated `NotificationType` values (e.g. `NEW_PICKS,WALLET_UPDATE`)"},"unreadOnly":{"type":"boolean","description":"true = unread only, false = read only, omit = all"}}},"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":"Bot alerts (canonical)"}}},"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"}]}}},"McpNotificationItemDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"sendsAt":{"format":"date-time","type":"string"},"markAsRead":{"type":"boolean"},"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":["NEW_PICKS","EVENT_STARTED","EVENT_ENDED","EVENT_CLOSE_SOON","CLAIM_REWARDS","WALLET_UPDATE","WALLET_TRANSACTION","TRADE_EXECUTION","NEW_TRADE_RECOMMENDATION","TRADE_UPDATE","SIGNAL_ALERT","TRADE_CLOSED","TRADE_EXECUTION_FAILED","ALERT","NEWS_OFFERS_PROMOTIONS","PRICE_ALERT_TRIGGERED","STOP_LOSS_TRIGGERED","AGENT_WENT_PRIVATE","AGENT_PAUSED","AGENT_DELETED","SIGNAL_GROUP_MEMBERSHIP_LOST"]},"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":["NEW_PICKS","EVENT_STARTED","EVENT_ENDED","EVENT_CLOSE_SOON","CLAIM_REWARDS","WALLET_UPDATE","WALLET_TRANSACTION","TRADE_EXECUTION","NEW_TRADE_RECOMMENDATION","TRADE_UPDATE","SIGNAL_ALERT","TRADE_CLOSED","TRADE_EXECUTION_FAILED","ALERT","NEWS_OFFERS_PROMOTIONS","PRICE_ALERT_TRIGGERED","STOP_LOSS_TRIGGERED","AGENT_WENT_PRIVATE","AGENT_PAUSED","AGENT_DELETED","SIGNAL_GROUP_MEMBERSHIP_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"]},"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"},"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"]}}}}