CRM API ## Sections • [Introduction](https://app.theneo.io/match-trade/crm-api/introduction.md): AI skill.md Match-Trader has built a skill that makes integrating our API faster and easier. It lets you connect our API to your system - or check how your current integration is set up - just by describing what you need in plain language to an AI assistant. This skill teaches an AI assistant (like Claude) how to work with the CRM API. Instead of reading technical docs and writing code yourself, you simply say what you want to do, and the assistant handles the technical details for you. Link to GitHub . To install it: npx skills add https://github.com/match-trade/CRM-API-skill The CRM-API is a REST and gRPC API that exposes the data and operations of the Match-Trade CRM - and, additionally, of the Match-Trade trading backend - to external systems. It is the integration point for third-party tools that need to read from or act on a broker's CRM and trading data through a single access point. Typical integrators include risk-management systems, custom client office and back-office portals, sales and retention tools, lead-management systems and lead providers, and reporting or analytics solutions. In short, any tool that works alongside a broker's existing Match-Trade CRM and needs access to its data can use this API. The CRM-API is not intended for products that build or replace a CRM. If you are delivering your own CRM, or a system that connects directly to the Match-Trader platform without the Match-Trade CRM layer, use Broker-API v2 instead - it integrates with the platform directly and bypasses the CRM. Through one access point, the CRM-API covers account management, offers, payments, trading accounts, positions, orders, market data, and CRM timeline events, over both REST and gRPC. This gives diverse client systems a consistent way to integrate with the Match-Trade CRM and backend. In our system, each broker has a unique partnerID assigned. Every operation via this API is performed within that particular partnerID. Since we encode your partnerID in your Authorization token, you don't have to consider this parameter when sending requests, but you will see this parameter across multiple different endpoints. For the Sandbox environment, partnerID=0 and is shared between every account in the system. It means you will have access to test data added by other integrations. Server time is GMT (UTC+0). All time-related fields accept and return values according to the RFC 3339 standard. For example 2024-01-13T09:20:04.651Z . The API enforces two rate limits: 500 requests/minute for standard endpoints and 200 requests/minute for bulk and resource-intensive endpoints. • [Integration Guide for Third-Party Tools](https://app.theneo.io/match-trade/crm-api/introduction/crm-integration.md): This integration guide explains how third-party tools and external systems connect to a broker's Match-Trade CRM (and trading backend) through the CRM-API . It covers the architecture, the step-by-step integration process, authentication, and best practices for a reliable integration. Typical integrators include risk-management systems, custom client and back-office tools, sales and lead-management systems, and reporting solutions. This guide assumes the broker already runs the Match-Trade CRM; the CRM-API lets your tool read from and act on that deployment. • [Architecture and Data Flow](https://app.theneo.io/match-trade/crm-api/introduction/crm-integration/architecture.md): How the Match-Trader Ecosystem Works The Match-Trader platform operates within an integrated ecosystem of three main components (Platform, Backend, CRM): Important: To integrate your tool, you only need to connect with the CRM-API . There is no need to integrate directly with the individual components - the CRM-API already reaches both the Match-Trade CRM and the Match-Trade Backend on your behalf, and these components are interconnected. Role of Individual Components Match-Trade Backend Consists of two main modules: Match-Trade Admin Configuration-oriented system Group creation and management Symbol, spread, and other parameter configuration Match-Trade Manager Trading accounts overview Open position monitoring Access to ledgers, orders, and other operations Match-Trader Platform Trading interface for end users Utilizes configuration defined in Admin Connected with CRM for account management Key Concepts Relationship Between Groups and Offers In Backend Admin , groups are created with their parameters (symbols, spreads, etc.) In CRM , offers are created that are visible to traders Each group created in the admin panel that is to be made public must be mapped to an offer During registration, traders see and select offers, not groups IMPORTANT NOTE: Your integration works with offers in the CRM , not with groups in the backend . This is a critical distinction: regardless of the type of tool you are building, the CRM-API interacts exclusively with the offer structure in the Match-Trade CRM. Account Structure Account - user profile linked to an email address Contains personal data (first name, last name, country, address, etc.). Only the email, first name, and last name are required; the rest is optional. One user = one Account Password is assigned to the Account (email), not to trading accounts Email is the account login. Trading Account - actual trading account One Account can have multiple Trading Accounts Each Trading Account is assigned to a specific offer Traders can switch between their trading accounts within the platform • [Step-by-Step Integration Process](https://app.theneo.io/match-trade/crm-api/introduction/crm-integration/step-by-step.md): Authentication and API Access To begin integration with the Match-Trade CRM, you need: Bearer Token (APIKey) - obtained from the client (broker) Base URL - specific to the client's environment, provided to you together with your API key (referred to as {baseURL} throughout this documentation) The API key should be kept secure and not shared publicly. API Overview The Match-Trade CRM-API provides two interfaces: REST API - the primary interface for most integration needs gRPC - for streaming live data in advanced scenarios (e.g., monitoring stop-loss events or position openings) Initial Connection Test To verify your connection is working correctly: CURL curl --location '{{baseURL}}/v1/offers' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' A successful response (HTTP 200) indicates that your authentication is working properly. Key Configuration Elements Offers Offers cannot be created via API They must be pre-configured by the client during setup Offers are linked to groups in the backend system You'll need to retrieve available offers UUID to create trading accounts Roles Each trader (account) should have the 'User' role Other roles like 'IB' or 'Sub_IB' exist but are for our internal CRM use For external integration: Always assign the 'User' role when creating accounts Integration Steps 1 Retrieve Available Offers CURL curl --location '{baseURL}/v1/offers' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' The response contains a lot of important information including: offerUuid partnerId groupName branchUuid systemUuid operationUuid Store these values as they will be required for subsequent API calls. 2 Create User Account and Trading Account CURL curl --location '{baseURL}/v1/accounts' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' \ --data-raw '{ "email": "blatata@match-trade.com", "password": "abcd1234", "offerUuid": "offer_uuid_from_step_1", "personalDetails": { "firstname": "Testfirstname", "lastname": "TestLastname" } }' When you specify the offerUuid, a user account will be created along with a trading account under the selected offer. Without this parameter, only the user account will be created. Passwords are encrypted immediately by the system. Neither you nor the Match-Trade system will have access to the user's plain text password after account creation. 3 Optional: Create Only Trading Account CURL curl --location '{baseURL}/v1/accounts/{accountUuid}/trading-accounts' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' \ --data '{ "offerUuid": "offer_uuid_from_step_1" }' This will create a trading account linked to the user account and the specified offer (group). 4 Optional: Check if Account Already Exists Before creating a new account, you may want to check if it already exists: CURL curl --location '{baseURL}/v1/accounts/by-email/blatata@match-trade.com' \ --header 'Authorization: {APIkey}' If the account exists, you'll receive its details. If not, you'll get an error response. 5 Managing Account Deposits and Withdrawals Important notes about payment gateways: Payment gateways are pre-configured by Match-Trade or the client For external integration, use gateways with "method" : "MANUAL" The gateway currency must match the trading account currency (e.g., USD gateway for USD accounts) If a gateway for a specific currency is missing, it must be manually configured by the client For demo accounts: Demo trading accounts can be created on offers with "demo" : true Demo offers typically have a pre-configured "initialDeposit" value (e.g., 1000.00) It is possible to add a deposit to a demo account via the payment gateway It is possible to withdraw funds from the demo account via a payment gateway For handling deposits and withdrawals, you need to use payment gateways, get them by: CURL curl --location '{baseURL}/v1/payment-gateways' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' To add balance to the trading account, you need to send this request: CURL curl --location '{baseURL}/v1/deposits/manual' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' \ --data '{ "systemUuid": "system_uuid_from_step_1", "login": "trading_account_login_from_step_2_or_step_3", "paymentGatewayUuid": "payment_gateway_uuid_from_step_5", "amount": 150, "comment": "testDeposit" }' Withdraw funds (deduct balance) should be used: CURL curl --location '{baseURL}/v1/withdrawals/manual' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIkey}' \ --data '{ "systemUuid": "system_uuid_from_step_1", "login": "trading_account_login_from_step_2_or_step_3", "paymentGatewayUuid": "payment_gateway_uuid_from_step_5", "amount": 100, "comment": "testWithdrawal" }' 6 Optional: Get Open Positions Retrieves the list of currently open trading positions. You can filter by individual logins, groups, and set a maximum number of results. CURL curl --location '{{baseURL}}/v1/trading-accounts/trading-data/open-positions' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' \ --data '{ "systemUuid": "{{systemUuid}}", "logins": ["login1","login2"], "groups": ["group_name"], "limit": 15 }' 7 Optional: Get Closed Positions History Fetches historical data on positions that have been closed. Supports filtering by time range, account logins, groups, and optional locking/blocking flags. CURL curl --location '{{baseURL}}/v1/trading-accounts/trading-data/closed-positions' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' \ --data ‘{ "systemUuid": "{{systemUuid}}", "logins": ["login1", "login2"], "groups": ["group_name"], "from": "2025-06-18T00:00:00.000Z", "to": "2027-05-14T00:00:00.000Z", "includeLocked": "", "includeBlocked": "", "limit": null }' 8 Optional: Get Ledgers Returns a chronological ledger of financial operations (e.g. deposits, withdrawals) on trading accounts. You can filter by operation type, account logins, groups and time window. CURL curl --location '{{baseURL}}/v1/trading-accounts/trading-data/ledgers' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' \ --data '{ "systemUuid": "{{systemUuid}}", "types": ["DEPOSIT","WITHDRAWAL"], "logins": ["login1","login2"], "groups": ["group_name"], "from": "", "to": "", "limit": null }' • [Conformance Testing](https://app.theneo.io/match-trade/crm-api/introduction/crm-integration/conformance.md): Test Your Integration Before proceeding to production deployment, completing the conformance test is a mandatory step to verify your integration with the Match-Trader System. This structured testing process ensures that all critical integration points function correctly. Conformance Test Process Access the Conformance Test Template: Match-Trader Integration Conformance Test Creating Your Test Copy: Open the conformance test spreadsheet link Select File > Make a copy Name your copy and save it to your Google Drive Execute each test case following the provided steps Document actual results in the "Result" column Mark each test as "Passed", "Not passed", or "Unsupported" accordingly Upon completion, share the spreadsheet with our integration team Integration Checklist Obtained API key and base URL from a client Verified API connection Documented available offers for reference Retrieved available payment gateways Verified currency matching between gateways and planned trading accounts Implemented account existence check to prevent duplicates Created test user account successfully Created a trading account linked to the test user account Successfully tested deposits using the manual payment gateway Verified deposit appears correctly in the trading account Successfully tested withdrawals using the manual payment gateway Verified withdrawal was processed correctly Verified login works with the created credentials Implemented error handling for all API calls Verified rate limiting compliance (under 500 req/min or 200 req/min) Set up monitoring for API response times and errors Integration Verification Process To properly verify your integration, complete the conformance test as described above. The test results will be reviewed by our technical team to confirm that your tool correctly interacts with all critical Match-Trade CRM-API endpoints. This verification is the final step before your integration can be approved for production use. • [Retrieving Trading Account Financial Data](https://app.theneo.io/match-trade/crm-api/introduction/crm-integration/financial-stream.md): This section describes all available API methods that third-party systems (including risk-management tools and PROP firms) can use to retrieve and monitor the status of trading accounts. Real-time balance and equity stream Systems operating in the Forex space typically poll accounts in bulk to get up-to-date status information such as profit, loss, and account balance. These systems often use both single-account and group-based data-fetching methods. This process is especially critical for risk-management and PROP-trading tools , which continuously monitor a large number of trading accounts to validate challenge rules - particularly tracking balance and equity in real time. gRPC Stream : getClientEquityStream This stream allows real-time monitoring of equity and balance values for selected trading accounts or entire account groups. Authorization: Bearer {{APIKey}} CURL { "systemUuid": "system_uuid", "logins": ["login1", "login2"], "groups": ["group_name"] } logins : array of specific trading account numbers to monitor. groups : array of group names - recommended: only one group per connection. 💡 Best Practice: Listen to one group per stream connection. This prevents future performance degradation, as a single group can contain up to 10,000 trading accounts. The systemUuid is a unique and immutable identifier for each server. It can be retrieved via the following endpoint : CURL curl --location '{{baseURL}}/v1/offers' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' Stream Response Example: JSON { "equity": { "login": "413586", "equity": "5560.95", "balance": "5560.95", "credit": "0.00" } } Periodic Account Status Fetching via REST API If real-time streaming is not required, and it's sufficient to check account status periodically (e.g., every few minutes), the following REST API endpoint can be used to retrieve current trading account information, including balance and equity. Endpoint: CURL curl --location --globoff '{{baseURL}}/v1/trading-account?systemUuid={{systemUuid}}&login={{login}}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIKey}}' Query Parameters: systemUuid – unique identifier of the trading server (retrievable via /v1/offers ) login – trading account number to be fetched Response example: JSON { "uuid": "3f168829-80a5-48ce-aa11-41cad249dcee", "login": "7198", "created": "2024-05-24T10:42:08.412Z", "accountInfo": { "uuid": "aafff59c-ad8d-41c6-b577-b22d1359f475", "email": "test@match-trade.com" }, "offerUuid": "f6cbaca3-cc96-4275-a784-12659032b544", "systemUuid": "8e9ed851-1e5e-479b-aa19-bade6a67d1d5", "commissionUuid": null, "group": "testUSD", "leverage": 100, "access": "FULL", "accountType": "REAL", "financeInfo": { "balance": 618509.43, "equity": 618720.93, "profit": 0, "netProfit": 0, "margin": 0.00, "freeMargin": 618720.93, "marginLevel": 0, "credit": 211.50, "currency": "USD", "currencyPrecision": 2 } } This method is suitable for integrations where polling is acceptable and instant reaction to changes is not critical. It allows external systems to fetch the full financial snapshot of an individual trading account in a lightweight and reliable way. • [Single Sign-On (SSO)](https://app.theneo.io/match-trade/crm-api/introduction/sso.md): Process Between external applications and the MTT Platform The SSO mechanism is designed for the external application → MTT platform login flow, not the other way around. This endpoint was added to the CRM-API to support external integrations that do not store or manage user passwords. It allows generating a One-Time Token (OTT), which lets a user log in to the platform without needing their password. This enables seamless redirection of an authenticated user from an external application (e.g. a Client Office or other third-party tool) to the platform without re-entering their trading credentials. Security Requirements Access to this endpoint is protected on two levels: Your API Key must have the rights enabled to call this endpoint ( API ACCESS → Create One Time Token for Login ). The IP address used for the request must be whitelisted by our Support Team. Endpoint Details Method: POST Path: /v1/one-time-token Parameters: email - the user’s email address (the account you want to generate the token for) validityTime - token expiration time in seconds Example cURL CURL curl --location '{baseURL}/v1/one-time-token' \ --header 'Content-Type: application/json' \ --header 'Authorization: {APIKey}' \ --data-raw '{ "email": "test@match-trade.com", "validityTime": 30 }' Demo environment details: baseURL: {baseURL} APIKey: xxx Demo platform test credentials Link: https://mtr-demo-prod.match-trader.com/ How to Test the One-Time Token After generating a token, open this link in your browser: {platformURL}/?auth={oneTimeToken} Example: https://mtr-demo-prod.match-trader.com/?auth={oneTimeToken} This will automatically log in the user associated with the given email. Example Scenarios Valid login: You generate a token valid for 30 seconds and log in within that time → login works. Expired token: You generate a token valid for 30 seconds but try after it expires → token is invalid. Generate a new token and repeat. Regenerated token: You generate a token valid for 1 hour, but then issue a new token valid for 15 minutes → the first token becomes invalid, and only the latest one works. • [Authentication](https://app.theneo.io/match-trade/crm-api/authentication.md): Our system implements a security mechanism that utilizes token-based authorization to ensure secure resource access. The authentication process involves using an Authorization header, following the token scheme. This section outlines the steps required for obtaining and using the authentication token to access protected resources. Security Best Practices To ensure the highest security standards, all communication with our services should be performed over encrypted channels (for example, using SSL/TLS protocols). Unencrypted or insecure connections are not recommended and may be rejected by the server. In particular, please make sure to always connect to the secure port (e.g., 443) assigned for encrypted traffic. Note : Attempting to establish unencrypted connections or using insecure credentials may cause authentication or connection failures. Always utilize encrypted methods and secure credentials. Obtaining the Token To obtain the authentication token, please contact our IT-Support team ( itsupport@match-trade.com ). This token acts as a digital key, granting access to the system’s resources for the duration of the token’s validity. Tokens are valid until revoked. The default gRPC port is 8083. Using the Token Include the token as a Bearer credential in every authenticated request. REST : Authorization: Bearer <Your_Token_Here> gRPC : uses metadata instead of HTTP headers. Pass the same value as the authorization metadata key: authorization: Bearer <Your_Token_Here> Code Example (Python) Below is a generic example of how to add the Authorization metadata in a gRPC client application. The implementation may vary depending on the programming language and gRPC library used. Python import grpc # Insecure channel (internal/private hosts only) channel = grpc.insecure_channel("mtr-broker-api:8083") # Secure channel (public hostnames — recommended) channel = grpc.secure_channel("grpc-broker-api-v2.your-domain.com", grpc.ssl_channel_credentials()) # Prepare metadata with the authorization token metadata = [("authorization", "Bearer <Your_Token_Here>")] # Create a stub and make a call stub = YourServiceStub(channel) response = stub.YourRpcMethod(request, metadata=metadata) Replace <Your_Token_Here> with the actual token, and adjust YourServiceStub and YourRpcMethod to match your gRPC service definition. • [gRPC](https://app.theneo.io/match-trade/crm-api/grpc.md): This gRPC model defines several services within a package designed for the Broker API, focusing on positions, ledgers, trading events, and related data. Below is the complete documentation for all services and their methods. The address to connect to the gRPC stream is: grpc-broker-api-demo.match-trader.com. A separate gRPC ping stream sends pings every 30 seconds (configurable) to maintain an active connection. Below is the corresponding Protobuf definition used for the gRPC service. Protocol Buffers syntax = 'proto3'; option java_multiple_files = true; option java_package = 'com.matchtrade.broker_api.grpc'; package com.matchtrade.broker_api.grpc; service AccountInfoServiceExternal { rpc getAccountInfoChangedStream (PBAccountInfoChangedRequestExternal) returns (stream PBAccountInfoChangedStreamResponseExternal) {} } service PositionsServiceExternal { rpc getClientPositionsStream (PBClientPositionRequestExternal) returns (stream PBPositionStreamResponseExternal) { } rpc getOpenPositionsStreamByGroupsOrLogins (PBOpenPositionRequestExternal) returns (stream PBOpenPositionsStreamResponseExternal) { } } service LedgerServiceExternal { rpc getLedgersStreamByLogin(PBLedgerRequestByLoginExternal) returns (stream PBLedgerStreamResponseExternal) { } rpc getLedgersStreamByGroupsOrLogins(PBLedgersRequestByGroupsOrLoginsExternal) returns (stream PBLedgersStreamResponseExternal) { } } service OrderServiceExternal { rpc getOrdersUpdateStreamByGroupsOrLogins(PBOrdersUpdateStreamRequestExternal) returns (stream PBOrdersUpdateStreamResponseExternal) { } } service QuotationsServiceExternal { rpc getQuotationsWithMarkupStream (PBQuotationsWithMarkupStreamRequestExternal) returns (stream PBQuotationSimpleExternal) { } } service GroupServiceExternal { rpc getGroupChangesStream(PBGroupChangeStreamRequestExternal) returns (stream PBGroupChangeStreamResponseExternal) { } } service TradingEventsServiceExternal { rpc getTradingEventsStream (PBTradingEventsStreamRequestExternal) returns (stream PBTradingEventsStreamResponseExternal) { } } service SymbolsServiceExternal{ rpc getSymbolsChangedStream(PBSymbolChangedRequestExternal) returns (stream PBSymbolChangedStreamResponseExternal) {} } service EquityServiceExternal{ rpc getClientEquityStream (PBEquityRequestExternal) returns (stream PBEquityStreamResponseExternal) {} } message PBAccountInfoChangedRequestExternal { string systemUuid = 1; repeated string groups = 2; bool includeBlocked = 3; bool includeLocked = 4; } message PBAccountInfoChangedStreamResponseExternal { oneof msg { PBAccountInfoUpdated userUpdated = 1; PBAccountInfoDeleted userDeleted = 2; bool heartbeat = 3; } } message PBAccountInfoDeleted { int64 login = 1; string group = 2; AccountInfoDeletedReason reason = 3; enum AccountInfoDeletedReason { ACCOUNT_INFO_DELETED_REASON_UNKNOWN = 0; ACCOUNT_INFO_DELETED_REASON_ACCOUNT_DELETED = 1; ACCOUNT_INFO_DELETED_REASON_RIGHTS_REVOKED = 2; ACCOUNT_INFO_DELETED_REASON_ACCOUNT_INTERNAL_ERROR = 3; } } message PBAccountInfoUpdated { int64 login = 1; optional PBAccountInfoUpdatedDetails prev = 2; PBAccountInfoUpdatedDetails current = 3; } message PBAccountInfoUpdatedDetails { optional string uuid = 1; optional string group = 2; optional int32 leverage = 3; optional bool isRetail = 4; optional bool isProView = 5; optional bool isBlocked = 6; optional bool isLocked = 7; optional string country = 8; optional string name = 9; optional string address = 10; optional string email = 11; optional string phone = 12; optional string province = 13; optional string zipCode = 14; optional string city = 15; optional string remarks = 16; optional string bankAccount = 17; optional string accountCurrency = 18; optional int32 accountCurrencyPrecision = 19; optional int64 registrationDate = 20; optional int64 agentId = 21; optional PBClientAccessRightsType accessRightsType = 22; } enum PBClientAccessRightsType { CLIENT_ACCESS_RIGHTS_TYPE_UNSPECIFIED = 0; CLIENT_ACCESS_RIGHTS_TYPE_FULL_ACCESS = 1; CLIENT_ACCESS_RIGHTS_TYPE_CLOSE_ONLY = 2; CLIENT_ACCESS_RIGHTS_TYPE_TRADING_DISABLED = 3; CLIENT_ACCESS_RIGHTS_TYPE_LOGIN_DISABLED = 4; CLIENT_ACCESS_RIGHTS_TYPE_LOCKED_CLOSE_ONLY = 5; } message PBOrdersUpdateStreamRequestExternal { string systemUuid = 1; repeated int64 logins = 2; repeated string groups = 3; bool includeBlocked = 4; bool includeLocked = 5; } message PBOrdersUpdateStreamResponseExternal { oneof msg { PBOrder order = 1; bool heartbeat = 2; } } message PBOrder { string orderId = 1; string symbol = 2; string alias = 3; string volume = 4; PBPendingTypeExternal type = 5; string creationTime = 6; string activationPrice = 7; PBOrderSideExternal side = 8; string stopLoss = 9; string takeProfit = 10; string comment = 11; PBRequestUpdateTypeExternal requestUpdateType = 12; string groupName = 13; int64 login = 14; } enum PBPendingTypeExternal { UNTYPE = 0; LIMIT = 1; STOP = 2; } message PBDailyStatisticsExternal { double change = 1; double high = 2; double low = 3; } message PBClientPositionRequestExternal { string systemUuid = 1; string login = 2; } message PBPositionStreamResponseExternal { oneof msg { PBPositions positionList = 1; bool heartbeat = 2; } } message PBOpenPositionRequestExternal { string systemUuid = 1; repeated string groups = 2; repeated string logins = 3; } message PBOpenPositionsStreamResponseExternal { oneof msg { PositionsPerClient positionsByLogin = 1; bool heartbeat = 2; } } message PBEquityRequestExternal { string systemUuid = 1; repeated string groups = 2; repeated int64 logins = 3; bool includeBlocked = 4; bool includeLocked = 5; bool includeStateHistory = 6; } message PBEquityResponseExternal { int64 login = 1; string equity = 2; string balance = 3; string credit = 4; } message PBEquityStreamResponseExternal { oneof msg { PBEquityResponseExternal equity = 1; bool heartbeat = 2; } } message PositionsPerClient { map<string, PBPositionWithGroup> positionsByLogin = 1; } message PBPositions { repeated PBPosition positions = 1; } message PBPosition { string id = 1; string symbol = 2; double volume = 3; PBOrderSideExternal side = 4; string open_time = 5; double open_price = 6; double stop_loss = 7; double take_profit = 8; double swap = 9; double profit = 10; double net_profit = 11; double current_price = 12; double commission = 13; repeated PBPartialExternal partials = 14; string alias = 15; PBRequestUpdateTypeExternal request_update_type = 16; } message PBPositionWithGroup { string id = 1; string symbol = 2; double volume = 3; PBOrderSideExternal side = 4; string open_time = 5; double open_price = 6; double stop_loss = 7; double take_profit = 8; double swap = 9; double profit = 10; double net_profit = 11; double current_price = 12; double commission = 13; repeated PBPartialExternal partials = 14; string alias = 15; PBRequestUpdateTypeExternal request_update_type = 16; string group = 17; } enum PBRequestUpdateTypeExternal { NEW = 0; UPDATE = 1; CLOSED = 2; PROFIT_CHANGE = 3; PARTIALLY_CLOSED = 4; } message PBPartialExternal { string id = 1; double volume = 3; double old_partial_volume = 4; string open_time = 6; double open_price = 7; double swap = 8; double profit = 9; double net_profit = 10; double commission = 12; } enum PBOrderSideExternal { BUY = 0; SELL = 1; } message PBOpenPositionsRequest { repeated string groupNames = 1; repeated int64 logins = 2; } enum PBHistoryOperationTypeExternal { DEPOSIT = 0; WITHDRAWAL = 1; CREDIT_IN = 2; CREDIT_OUT = 3; AGENT_COMMISSION = 4; COMMISSIONS = 5; SWAPS = 6; OTHER = 7; CLOSED_POSITION = 8; } message PBLedgerRequestByLoginExternal { string systemUuid = 1; string login = 2; repeated PBHistoryOperationTypeExternal historyOperationType = 3; repeated AdditionalType additionalTypes = 4; } message PBLedgersRequestByGroupsOrLoginsExternal { string systemUuid = 1; repeated string logins = 2; repeated string groups = 3; repeated PBHistoryOperationTypeExternal historyOperationType = 4; repeated AdditionalType additionalTypes = 5; } message PBLedgerStreamResponseExternal { oneof msg { PBLedger ledger = 1; bool heartbeat = 2; } } message PBLedger { string id = 1; PBHistoryOperationTypeExternal historyOperationType = 2; string time = 3; double profit = 4; string comment = 5; string group = 6; int64 login = 7; AdditionalType additionalType = 8; } message PBLedgersStreamResponseExternal { oneof msg { PBLedgers ledgers = 1; bool heartbeat = 2; } } message PBLedgers { repeated PBLedgerStreamResponseExternal ledgers = 1; } message PBQuotationsWithMarkupStreamRequestExternal { string systemUuid = 1; repeated string instruments = 2; optional string group = 3; optional int32 throttlingMs = 4; optional bool smartThrottling = 5; } message PBQuotationSimpleExternal { oneof msg { PBQuotation quotation = 1; bool heartbeat = 2; } } message PBQuotation { string symbol = 1; double bidPrice = 2; double askPrice = 3; int64 timestampInMillis = 4; optional PBDailyStatisticsExternal dailyStatistics = 5; } message PBGroupChangeStreamRequestExternal { string systemUuid = 1; repeated string groups = 2; } message PBGroupChangeStreamResponseExternal { oneof msg { PBGroupUpdated groupUpdated = 1; PBGroupDeleted groupDeleted = 2; bool heartbeat = 3; } } message PBGroupUpdated { string group = 1; string currency = 2; int32 currencyPrecision = 3; string groupOwner = 4; map<string, PBGroupSymbol> symbols = 5; PBMarginCalculationType marginCalculationType = 6; bool isManager = 7; bool isAdmin = 8; bool isBrokerManager = 9; int64 marginCall = 10; int32 depositCurrencyPrecision = 11; int64 swapCalculationTime = 12; PBStopoutAndMarginCallType stopoutAndMarginCallType = 13; bool commissionUpfront = 14; bool islamicSwap = 15; bool demoGroup = 16; PBHedgeMarginCalculationType hedgeMarginCalculationType = 17; int64 eodMode = 18; int64 eomMode = 19; int64 eodSnapshotTime = 20; bool defaultRetailEnabled = 21; bool coverageMode = 22; int64 orderProcessingDelay = 23; double stopoutLevel = 24; bool hedgingEnabled = 25; int64 pendingMultiplierPer1000 = 26; int64 defaultLeverageRatioPercent = 27; int64 commissionPerMillion = 28; int64 agentCommissionPerMillion = 29; } message PBGroupDeleted { string group = 1; GroupDeletedReason reason = 2; enum GroupDeletedReason { GROUP_DELETED_REASON_UNKNOWN = 0; GROUP_DELETED_REASON_DELETED = 1; GROUP_DELETED_REASON_RIGHTS_REVOKED = 2; } } message PBOpenPositionsStreamResponse { map<string, PBPositions> loginToPositions = 1; } message PBGroupSymbol { string symbol = 1; string bidMarkup = 2; string askMarkup = 3; double leverage = 4; string swapBuy = 5; string swapSell = 6; int64 freezeLevel = 7; int64 stopsLevel = 8; PBSwapType swapType = 9; string volumeMin = 10; string volumeMax = 11; string minCommission = 12; bool fixedLeverage = 13; int64 rawLeverage = 14; PBCommissionType commissionType = 15; int64 commissionPerMillion = 16; } enum PBMarginCalculationType { UNKNOWN_MARGIN_CALCULATION_TYPE = 0; UNREALIZED_LOSS_ONLY = 1; UNREALIZED_PROFIT_LOSS = 2; } enum PBSwapType { UNKNOWN_SWAP_TYPE = 0; PIPS_SWAP_TYPE = 1; PERCENTS = 2; NOT_DEFINED = 3; } enum PBCommissionType { UNDEFINED = 0; USD_PER_MILLION = 1; USD_PER_CONTRACT = 2; USD_PER_LOT = 3; PERCENTAGE = 4; PIPS_COMMISSION_TYPE = 5; } enum PBStopoutAndMarginCallType { STOPOUT_TYPE_UNDEFINED = 0; STOPOUT_TYPE_MARGIN_LEVEL_PERCENTAGE = 1; STOPOUT_TYPE_ABSOLUTE_EQUITY_USD = 2; STOPOUT_TYPE_OFF = 3; } enum PBHedgeMarginCalculationType { HEDGE_MARGIN_CALCULATION_TYPE_UNSPECIFIED = 0; HEDGE_MARGIN_CALCULATION_TYPE_NETTING = 1; HEDGE_MARGIN_CALCULATION_TYPE_LARGER_LEG = 2; } message PBTradingEventsStreamRequestExternal { string systemUuid = 1; repeated int64 logins = 2; repeated string groups = 3; bool includeBlocked = 4; bool includeLocked = 5; } message PBTradingEventsStreamResponseExternal { oneof msg { TradingEvents tradingEvents = 1; bool heartbeat = 2; } } message TradingEvents { repeated PBTradingEvent tradingEvents = 1; } message PBTradingEvent { oneof msg { PBMarginCallEvent marginCallEvent = 1; PBStopOutEvent stopOutEvent = 2; PBTakeProfitEvent takeProfitEvent = 3; PBStopLossEvent stopLossEvent = 4; PBOrderActivationEvent orderActivationEvent = 5; } int64 login = 6; string group = 7; } message PBMarginCallEvent { int64 login = 1; double marginLevel = 2; } message PBStopOutEvent { int64 login = 1; string orderId = 2; string instrument = 3; double volume = 4; } message PBTakeProfitEvent { int64 login = 1; string orderId = 2; string instrument = 3; PBOrderSideExternal side = 4; double volume = 5; double netProfit = 7; string walletCurrency = 8; } message PBStopLossEvent { int64 login = 1; string orderId = 2; string instrument = 3; PBOrderSideExternal side = 4; double volume = 5; double netProfit = 7; string walletCurrency = 8; } message PBOrderActivationEvent { int64 login = 1; string orderId = 2; string instrument = 3; PBOrderSideExternal side = 4; double volume = 5; double activationPrice = 7; } message PBSymbolChangedRequestExternal{ string systemUuid = 1; } message PBSymbolChangedStreamResponseExternal{ oneof msg { PBSymbolUpdatedOrCreated symbolUpdated = 1; PBSymbolDeleted symbolDeleted = 2; PBSymbolUpdatedOrCreated symbolCreated = 3; bool heartbeat = 4; } } message PBSymbolUpdatedOrCreated{ repeated TradeHoursDto tradingHours = 1; int32 volumePrecision = 2; string volumeMin = 3; string volumeStep = 4; double commission = 5; string sizeOfOnePoint = 6; string symbol = 7; string alias = 8; string baseCurrency = 9; string quoteCurrency = 10; int32 pricePrecision = 11; PBSymbolType type = 12; string swapBuy = 13; string swapSell = 14; string volumeMax = 15; string contractSize = 16; int64 multiplier = 17; int64 divider = 18; double leverage = 19; string description = 20; PBTerminationType terminationType = 21; string terminationDate = 22; repeated string tags = 23; } message PBSymbolDeleted{ string symbol = 1; } message TradeHoursDto { int32 dayNumber = 1; // 0 - Sunday int32 openHours = 2; int32 openMinutes = 3; int32 openSeconds = 4; int32 closeHours = 5; int32 closeMinutes = 6; int32 closeSeconds = 7; } enum PBSymbolType { UNKNOWN_SYMBOL_TYPE = 0; FOREX = 1; CFD = 2; FOREXCFD = 3; } enum PBTerminationType { EXPIRATION = 0; ROLLOVER = 1; } enum AdditionalType { NONE = 0; NEGATIVE_BALANCE_WITHDRAW = 1; CORRECTION = 2; REVENUE_SHARE = 3; INVOICE_PAYMENT = 4; MINIMUM_MONTHLY = 5; AGENT_COMMISSION_LEDGER = 6; NEGATIVE_BALANCE_CORRECTION = 7; SETTLEMENT = 8; INACTIVITY_FEE = 9; BONUS_IN_OUT = 10; STORAGE_FEE = 11; M2P = 12; BANK = 13; CRYPTO = 14; DEPOSIT_CORRECTION = 15; WITHDRAW_CORRECTION = 16; SWAP_CORRECTION = 17; COMMISSION_CORRECTION = 18; AGENT_FEE_CORRECTION = 19; MINIMUM_MONTHLY_FEE_CORRECTION = 20; REVENUE_SHARE_CORRECTION = 21; CPA = 22; DEPOSIT_BONUS = 23; CASHBACK = 24; IB_COMMISSION = 25; INTERNAL_TRANSFER = 26; NORIA_PAYMENT = 27; UNKNOWN_LEDGER = 28; } • [getLedgersStreamByLogin](https://app.theneo.io/match-trade/crm-api/grpc/ledgers/ledgers-by-login.md): Streams ledger entries for a specific trading account, accepts a PBLedgerRequestByLoginExternal message with the systemUuid , login , and historyOperationType , returns a stream of PBLedgerStreamResponseExternal messages with operation type, time, profit, comment, and associated login. • [getLedgersStreamByGroupsOrLogins](https://app.theneo.io/match-trade/crm-api/grpc/ledgers/ledgers-by-groups-or-logins.md): Streams ledger entries filtered by specified groups or account logins, accepts a PBLedgersRequestByGroupsOrLoginsExternal message with the systemUuid , optional logins, groups, and historyOperationType , returns a stream of PBLedgersStreamResponseExternal messages with grouped ledger details. Either logins or groups parameter must be provided. • [GroupServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/groups.md): getGroupChangesStream: Streams updates to group configurations, accepts a GroupChangeStreamRequestExternal message with the systemUuid and monitored groups, returns a stream of GroupChangeStreamResponseExternal messages containing either a PBGroupUpdated object with updated group parameters like margin, commission structure, and symbols, or a PBGroupDeleted object with the reason for group removal. • [TradingEventsServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/trading-events.md): getTradingEventsStream: Streams trading events for specified accounts and groups, accepts a PBTradingEventsStreamRequestExternal message with account logins and group IDs, returns a stream of TradingEventsStreamResponseExternal messages containing events like margin calls, stop-outs, take profits, stop losses, or order activations, each event includes details specific to its type. • [OrderServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/orders.md): getOrdersUpdateStreamByGroupsOrLogins: Streams updates to pending orders for specified accounts and groups, accepts a PBOrdersUpdateStreamRequestExternal message with the systemUuid , logins, groups, and flags for blocked/locked orders, returns a stream of PBOrdersUpdateStreamResponseExternal messages containing order details such as ID, symbol, alias, volume, type, creation time, activation price, side, stop loss, take profit, comment, update type, group, and login. • [QuotationsServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/quotations.md): getQuotationsWithMarkupStream: Streams real-time quotations for specified instruments with markups applied, accepts a PBQuotationsWithMarkupStreamRequestExternal message with the systemUuid , instruments, group, and optional throttling and statistics flags, returns a stream of PBQuotationsWithMarkupStreamResponseExternal messages containing bid and ask prices, timestamps, and optional daily statistics. • [AccountInfoServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/account-info.md): getAccountInfoChangedStream: Streams updates about account information changes, accepts a PBAccountInfoChangedRequestExternal message with the systemUuid , groups, and flags for blocked/locked accounts, returns a stream of PBAccountInfoChangedStreamResponseExternal messages containing either PBAccountInfoUpdated objects with account details like login, group, leverage, status, and currency, or PBAccountInfoDeleted objects with the reason for account deletion. On account update only changed fields are returned (full list of keys in Create Response example). • [SymbolsServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/symbols.md): getSymbolsChangedStream: Streams updates on trading symbols, accepts a PBSymbolChangedRequestExternal message with the systemUuid , returns a stream of PBSymbolChangedStreamResponseExternal messages containing either PBSymbolUpdated objects with symbol details like trading hours, precision, contract size, leverage, and commission, or PBSymbolDeleted objects indicating symbols that were removed. • [getOpenPositionsStreamByGroupsOrLogins](https://app.theneo.io/match-trade/crm-api/grpc/positions/positions-by-groups-or-logins.md): getOpenPositionsStreamByGroupsOrLogins: Streams client positions for multiple accounts, accepts a PBOpenPositionRequestExternal message with the systemUuid and list of logins or groups , returns a stream of PBOpenPositionsStreamResponseExternal messages containing map of client logins and position details such as ID, symbol, alias, volume, side, open time, open price, stop loss/take profit, profit, net profit, swap, commission, and current price. • [getClientPositionsStream](https://app.theneo.io/match-trade/crm-api/grpc/positions/positions-by-login.md): getClientPositionsStream: Streams client positions for a specified trading account, accepts a PBClientPositionRequestExternal message with the systemUuid and login , returns a stream of PBPositionStreamResponseExternal messages containing position details such as ID, symbol, alias, volume, side, open time, open price, stop loss/take profit, profit, net profit, swap, commission, and current price. • [EquityServiceExternal](https://app.theneo.io/match-trade/crm-api/grpc/equity.md): getClientEquityStream: Streams updates of account equity, accepts a PBEquityRequestExternal message with the systemUuid , groups or logins, and flags: includeLocked, includeBlocked and includeStateHistory, returns a stream of PBEquityStreamResponseExternal messages containing PBEquityResponseExternal objects with trading account's login, equity, balance and credit. Please note that the stream can be resource-intensive. Although the default update interval is set to 1000 miliseconds, it can be adjusted to a lower value. We recommend using it with caution, as setting very short intervals or subscribing to too many accounts in a single stream may significantly increase server load, consume memory, and potentially impact overall system stability. The stream allows listening to multiple accounts via groups or logins, so it's advisable to avoid subscribing to all accounts at once through a single connection. Instead, consider splitting the load by creating separate streams per group or segmenting the requests to better manage traffic and reduce strain on the infrastructure. • [Errors](https://app.theneo.io/match-trade/crm-api/errors.md): We use standard HTTP response codes to state the success or failure of API requests. It means that codes in the range 2xx indicate success and usually have response bodies, 4xx indicate errors with detailed answers to why a particular request failed, 5xx indicate errors on our servers. • [gRPC Error Handling](https://app.theneo.io/match-trade/crm-api/errors/grpc-error-handling.md): This section describes the standard gRPC error codes returned by Match-Trade streaming services (CRM-API, Trading-API). These errors represent both business-level validation issues and infrastructure-level problems. Understanding them helps developers quickly identify the root cause of connection failures and build more resilient integrations. Common gRPC Stream Errors Below is a list of the most common errors you may encounter when opening or maintaining a gRPC stream. RESOURCE_EXHAUSTED Status: Status.RESOURCE_EXHAUSTED Example message: Grpc connection limit exceeded What it means: You have reached the maximum number of allowed parallel streams for a given token + permission (e.g., STREAM_QUOTES ). Typical causes: The connection limit (usually around 200 concurrent streams unless configured otherwise) has been exceeded. The client is opening new streams without closing old ones (missing graceful shutdown). Redis-based connection limiter counted too many active streams associated with the same token. Example scenario: You run multiple microservices subscribing to quotes using the same API token. They restart but do not close their old connections, eventually hitting the limit. UNAUTHENTICATED Status: Status.UNAUTHENTICATED Example message: Invalid or expired token Authentication failed What it means: The token in the gRPC metadata is missing, expired, or invalid. Typical causes: Wrong or expired access token. Metadata header not included. Token revoked on the server side. Notes: The connection is rejected immediately, and this error does not count toward the connection limit. PERMISSION_DENIED Status: Status.PERMISSION_DENIED Example message: Access forbidden: You don't have the required permissions Access forbidden: You don't have access to the following groups: [GROUP] You don't have access to all provided trading account logins What it means: The token is valid, but it does not have the required permission or scope. Typical causes: Missing permission like STREAM_TRADING_EVENTS or STREAM_QUOTES. CRM user trying to read data for groups or trading accounts they are not allowed to access. Example scenario: A CRM user tries to subscribe to events from trading accounts outside of their assigned group. INVALID_ARGUMENT Status: Status.INVALID_ARGUMENT Example message: Invalid argument: Client ID [id] is unknown Unknown group: [group] What it means: The request contains invalid or unknown parameters. Typical causes: Subscribing to a client ID or group that does not exist. Passing incorrect instrument symbols (e.g., typo in a symbol name). Invalid filter values in stream subscriptions. Example scenario: Subscribing to EUR-USD instead of EURUSD causes the server to close the stream with this error. UNKNOWN Status: Status.UNKNOWN Example message: Unsupported stub type Internal server error What it means: The server hit an unexpected internal error. Typical causes: Runtime exceptions like NullPointerException. Incompatibility between gRPC library versions (e.g., Kotlin vs Java stubs). Account status not handled correctly by snapshot logic (e.g., LOCKED_CLOSE_ONLY). Example scenario: The stream is opened for a trading account with a rare status that the server-side mapper does not support yet. UNAVAILABLE Status: Status.UNAVAILABLE Example message: Service unavailable Redis unavailable What it means: The service or one of its infrastructure dependencies is temporarily down. Typical causes: Redis outage (used for connection limiting). API service restart or failover. Network or load-balancer issues. Recommendation: Clients should treat this as a transient failure and retry with exponential backoff. Stream Behavior and Operational Details Heartbeat Messages To avoid silent disconnects caused by proxies (e.g., Cloudflare, Nginx) that close idle connections, all Match-Trade streams send a heartbeat every few seconds. This may be an empty message or a message with heartbeat=true . Server-Side Disconnects on Critical Errors If the server detects a critical inconsistency (e.g., incorrect evaluation status in Prop Trading), it may intentionally close the stream to prevent sending corrupted or partial data. • [Examples](https://app.theneo.io/match-trade/crm-api/errors/examples.md): In this section, you can find examples of error responses for each status code. Successful responses are available in the relevant sections of this documentation. • [Branches, Offers, Roles](https://app.theneo.io/match-trade/crm-api/branches-offers-roles.md): In our system, there is a distinction between multiple layers of account attributes. In general, the account operates within the frames of a given: Branch, Offer(s), and Role. Each section has an explanation of a particular layer. During the initial setup, offers, branches, and roles are created by Match-Trade by default. The broker can manually add more of them at any time from the CRM. It is not possible to create or edit branches, offers, or roles via the broker API. • [Get Branches](https://app.theneo.io/match-trade/crm-api/branches-offers-roles/get-branches.md): Branch represents the geographical or organizational division where the user operates. On the broker's end, it is usually connected to a specific area of responsibility or jurisdiction within the company's structure. This does not have to be fixed and the division can be freely shaped, depending on the business needs. The only requirement is that every account must have a branch assigned, even if there is one branch instance in the system. • [Get Offers](https://app.theneo.io/match-trade/crm-api/branches-offers-roles/get-offers.md): An Offer is a predefined configuration template that determines the parameters of a trading account in the Match-Trader system. Every trading account is linked to an offer, which defines essential attributes such as account currency, leverage, and whether it is a Demo or Real account. Each offer is mapped to a specific group (configured in the admin backend), which controls trading conditions like markups, commissions, swaps, leverage, and more. While groups are managed in the backend, offers are visible to clients on the trading platform. • [Get Roles](https://app.theneo.io/match-trade/crm-api/branches-offers-roles/get-roles.md): Role is connected directly to the user's account. Roles with access to the Match-Trader trading platform are: User, IB, and Sub IB. Other roles are reserved for users with access to the CRM and have different responsibilities and permissions to manage accounts. • [Accounts](https://app.theneo.io/match-trade/crm-api/accounts.md): In the Accounts section, you will find detailed information about user accounts within the system. With this, you can access and update account details and create new accounts. This section serves as a central hub for overseeing and administering user accounts within the system. You can also find a Trading Accounts sub-section within the section with all relevant endpoints to manage Trading Accounts. An Account represents the user, and a Trading Account is needed to perform trading actions. Under one Account, there might be more than one Trading Account. Some actions are performed only on Accounts, while others are on Trading Accounts. In our system, there is a distinction between Leads and Clients. They are both types of user accounts. The difference between Lead and Client is conversion (first deposit) - the user is a Lead by default and becomes a Client after the first successful deposit. • [Get Accounts](https://app.theneo.io/match-trade/crm-api/accounts/accounts.md): With the Get Accounts endpoint, you can retrieve detailed information about all accounts within the system. Since the response is paged, please make sure you are making a valid request. The default request's response (without providing a proper query param) is set to 10 records. • [Get Account by Email](https://app.theneo.io/match-trade/crm-api/accounts/email.md): With the Get Account by Email endpoint, you can retrieve detailed information about a particular Account in the system using the user's email. • [Get Account by UUID](https://app.theneo.io/match-trade/crm-api/accounts/uuid.md): With the Get Account by UUID endpoint, you can retrieve detailed information about a particular Account in the system using the Account's UUID. • [Get Account's Timeline Events](https://app.theneo.io/match-trade/crm-api/accounts/timeline-events.md): With Get Account's Timeline Events endpoint, you can retrieve detailed information about events associated with a specific account. Users can access a timeline of events, including details, creators, and creation timestamps, providing valuable insights into account activities. • [Get Account Managers List](https://app.theneo.io/match-trade/crm-api/accounts/managers-list.md): Using this endpoint, you can acquire list of Account Managers available for assignment filtered by roleUuid (if none provided, the response is not limited). • [Create Account](https://app.theneo.io/match-trade/crm-api/accounts/create.md): In this section, you can find the endpoint for creating new Accounts in the system. The request body cannot include empty or null fields. If you do not intend to use a certain field, please remove it entirely from the JSON rather than providing an empty string • [Update Account Info](https://app.theneo.io/match-trade/crm-api/accounts/update.md): With this endpoint, you can update and modify Account details. • [Change Account's Password](https://app.theneo.io/match-trade/crm-api/accounts/change-password.md): Using this endpoint, you can change the Account's password. • [Bulk Delete Accounts](https://app.theneo.io/match-trade/crm-api/accounts/bulk-delete.md): This endpoint allows deleting multiple CRM accounts in one request by providing a list of accountUuids, removing those accounts together with their associated trading accounts from the CRM database. The deletion happens only in CRM (and Platform), and the endpoint returns information about which accounts were successfully deleted Deletes selected accounts and their linked trading accounts from CRM DB only (accounts can be restored). Cannot delete IB/SUB IB accounts with the existing structure. • [Add Note](https://app.theneo.io/match-trade/crm-api/accounts/add-note.md): This endpoint allows you to add a note to a specific Account, enabling you to store additional information or comments related to the account. • [Add Task](https://app.theneo.io/match-trade/crm-api/accounts/add-task.md): With this endpoint, you can create a task for a specific Account, facilitating task management and follow-up actions. • [Send Inbox Message](https://app.theneo.io/match-trade/crm-api/accounts/send-inbox-message.md): Using this endpoint, you can send custom message to Match Trader users (it will appear in user's inbox on the platform). Message can be in a HTML format. • [Get Lead Statuses](https://app.theneo.io/match-trade/crm-api/accounts/lead-statuses.md): This endpoint returns a list of available statuses that can be assigned to leads in the system (e.g. New contact, Hot, Cold). They help track and manage the sales process by showing the stage a lead is currently in. If you only need specific statuses, you can optionally provide their UUIDs in the request. • [Get Trading Accounts](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/trading-accounts.md): With the Get Accounts endpoint, you can retrieve detailed information about all Trading Accounts within the system. • [Get Trading Account by login](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/logins.md): With the Get Trading Account by login endpoint, you can retrieve detailed information about a particular Trading Account in the system using the Trading Account's login. • [Create New Trading Account](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/create.md): In this section, you can find the endpoint for creating new Trading Accounts in the system. • [Update Trading Account](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/updates.md): With the Update Trading Account endpoint, you can update offer, commission, leverage or access rights of a Trading Account. • [Change Leverage](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/change-leverage.md): In this section, you can find the endpoint to change the leverage of the trading account. • [Bulk Delete Trading Accounts](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/bulk-delete.md): Let's a Broker API user delete multiple trading accounts in one request by providing a systemUuid and a list of trading account logins. The deletion is performed only in the CRM database (not in Manager), and the response indicates which trading accounts were removed and which (e.g. IB/SUB IB with existing IB relationships) could not be deleted and why. Deletes selected trading accounts only from the platform and CRM; the accounts remain stored in the Manager and can be restored if needed. • [Retrieve Trading Accounts](https://app.theneo.io/match-trade/crm-api/accounts/trading-accounts/retrieve-trading-accounts.md): With the Get Accounts endpoint, you can retrieve detailed information about all Trading Accounts within the system. • [Payments](https://app.theneo.io/match-trade/crm-api/payments.md): In the Payments section you can find endpoints for: Retrieving Payment Gateways list with details about each Payment Gateway, Retrieving Deposits and Withdrawals, Making Manual payments, Credit in and out. • [Get Payment Gateways](https://app.theneo.io/match-trade/crm-api/payments/gateways.md): A Payment Gateway is a resource responsible for all payment operations in the system. All Deposits and Withdrawals are processed within the frame of a Payment Gateway and following the Payment Gateway configuration. Payment Gateways must be assigned to a Branch to be visible to users. • [Get Deposits](https://app.theneo.io/match-trade/crm-api/payments/deposits.md): With this endpoint, you can retrieve information about deposits made in the system. You can also request deposits for a specific account using query . Transaction Statuses in Broker API Success/Final Statuses DONE – Transaction completed successfully FULLY_PAID – Final status, equivalent to DONE, introduced with the "Fixed Amount Book" mechanism for Prop Trading. Indicates that the user deposited the exact or higher amount than declared. PARTIALLY_PAID – Final status, equivalent to DONE, used when the deposited amount is lower than declared in "Fixed Amount Book" mode BOOKED – Funds have been booked to the account Pending/In Progress Statuses NEW – New transaction request PROCESSING – Transaction is in progress PROCESSING_PAYMENT – Transaction is being processed by the payment provider AWAITING_CONFIRMATION – Transaction awaits broker confirmation ADMIN_CONFIRMATION – Transaction awaits administrator confirmation (e.g., for crypto withdrawals) Failure/Cancellation Statuses FAILED – Transaction failed (internal system error) FAILED_PAYMENT – Payment failed (payment provider error) REJECTED – Transaction rejected by the broker CANCELLED_BY_USER – Transaction cancelled by the user REFUNDED – Funds were refunded • [Get Withdrawals](https://app.theneo.io/match-trade/crm-api/payments/withdrawals.md): With this endpoint, you can retrieve information about withdrawals made in the system. system. You can also request withdrawals for a specific account using query . • [Manual Deposit](https://app.theneo.io/match-trade/crm-api/payments/manual-deposit.md): Using this endpoint, you can deposit funds to a Trading Account. • [Manual Withdrawal](https://app.theneo.io/match-trade/crm-api/payments/manual-withdrawal.md): Using this endpoint, you can withdraw funds from a Trading Account. • [Credit In](https://app.theneo.io/match-trade/crm-api/payments/credit-in.md): Using this endpoint, you can add a credit to a Trading Account. • [Credit Out](https://app.theneo.io/match-trade/crm-api/payments/credit-out.md): Using this endpoint, you can remove a credit from a Trading Account. • [Trading](https://app.theneo.io/match-trade/crm-api/trading.md): The Trading section allows accessing and managing various trading functionalities within the system. With this section, you can place orders and monitor trading activity seamlessly. This section provides the necessary tools for users to efficiently execute trades and stay informed about market conditions. • [Get Symbols](https://app.theneo.io/match-trade/crm-api/trading/symbols.md): Using this endpoint, you can retrieve information about various symbols (instruments) within the system, including details such as symbol names, currency, trading hours, and more. • [Open Position](https://app.theneo.io/match-trade/crm-api/trading/open-position.md): Using this endpoint, you can open a Position for a specific Trading Account. Typically, the time filter is not used (you retrieve currently open positions), but if present (e.g., in historical/report views), it applies to the opening time (openTime). • [Create Pending Order](https://app.theneo.io/match-trade/crm-api/trading/create-pending-order.md): Using this endpoint, you can open a Position for a specific Trading Account. • [Cancel Pending Order](https://app.theneo.io/match-trade/crm-api/trading/cancel-pending-order.md): Using this endpoint, you can open a Position for a specific Trading Account. • [Create Correction Order](https://app.theneo.io/match-trade/crm-api/trading/create-correction-order.md): Using this endpoint, you can create a correction order (both closing existing position and opening a new one) for a specific Trading Account. • [Edit Position](https://app.theneo.io/match-trade/crm-api/trading/edit-position.md): You can edit (Stop Loss and Take Profit values) an already opened Position for a specific Trading Account using this endpoint. • [Close Position](https://app.theneo.io/match-trade/crm-api/trading/close-position.md): You can close a Position for a specific Trading Account using this endpoint. It is also possible to close multiple positions with one request. • [Close Position (Partially)](https://app.theneo.io/match-trade/crm-api/trading/close-position-partially.md): This endpoint allows you to partially close a Position for a specific Trading Account, reducing the position size while keeping the rest open. • [Close All Positions](https://app.theneo.io/match-trade/crm-api/trading/close-all-positions.md): You can close all positions for a specific Trading Account using this endpoint. It is also possible to close multiple positions with one request. • [Reopen Position](https://app.theneo.io/match-trade/crm-api/trading/reopen-position.md): You can reopen an already closed Position for a specific Trading Account using this endpoint. Take profit and stop loss values are removed for the reopened position. • [Trading Data](https://app.theneo.io/match-trade/crm-api/trading/trading-data.md): The Trading Data section includes endpoints to retrieve Open and Closed Positions, Active Orders, and Ledgers. There is also a “Candles” sub-section, where you can find an endpoint to retrieve Candles data for a specific instrument. • [Get Open Positions](https://app.theneo.io/match-trade/crm-api/trading/trading-data/open-positions.md): With this endpoint, you can retrieve all open positions for a specific trading account. Typically, the time filter is not used (you retrieve currently open positions), but if present (e.g., in historical/report views), it applies to the opening time (openTime). • [Get Closed Positions](https://app.theneo.io/match-trade/crm-api/trading/trading-data/closed-positions.md): With this endpoint, you can retrieve all closed positions for a specific trading account. • [Get Active Orders](https://app.theneo.io/match-trade/crm-api/trading/trading-data/active-orders.md): With this endpoint, you can retrieve all Active Orders for a specific Trading Account. • [Get Ledgers](https://app.theneo.io/match-trade/crm-api/trading/trading-data/ledgers.md): With this endpoint, you can retrieve all Ledgers for a specific Trading Account. • [Get Groups](https://app.theneo.io/match-trade/crm-api/trading/trading-data/groups.md): The “Get Groups” endpoint returns detailed information about specified user groups, including currency, owner, and trading symbol settings. • [Get Group Names](https://app.theneo.io/match-trade/crm-api/trading/trading-data/group-names.md): The “Get Group Names” endpoint returns a list of available user group names in the system. • [Retrieve Orders History by Login List or Groups](https://app.theneo.io/match-trade/crm-api/trading/trading-data/orders-by-logins-or-groups.md): With this endpoint, you can retrieve all Orders History for a specific Trading Account. Either 'logins' or 'groups' (or both) must be provided for the endpoint to work; if neither is specified, the request will fail. • [Retrieve Ledgers by Login List or Groups](https://app.theneo.io/match-trade/crm-api/trading/trading-data/ledgers-by-logins-or-groups.md): With this endpoint, you can retrieve all Ledgers for a specific Trading Account. Either 'logins' or 'groups' (or both) must be provided for the endpoint to work; if neither is specified, the request will fail. • [Retrieve Open Positions by Login List or Groups](https://app.theneo.io/match-trade/crm-api/trading/trading-data/open-positions-by-logins-or-groups.md): Using this endpoint, you can retrieve all open positions based on a list of logins or groups for specific trading accounts. Typically, the time filter is not used (you retrieve currently open positions), but if present (e.g., in historical/report views), it applies to the opening time (openTime). Either 'logins' or 'groups' (or both) must be provided for the endpoint to work; if neither is specified, the request will fail. • [Retrieve Closed Positions by Login List or Groups](https://app.theneo.io/match-trade/crm-api/trading/trading-data/closed-positions-by-logins-or-groups.md): With this endpoint, you can retrieve all Closed Positions by Login List or Groups for a specific Trading Account. Either 'logins' or 'groups' (or both) must be provided for the endpoint to work; if neither is specified, the request will fail. • [Retrieve Orders History by Ids](https://app.theneo.io/match-trade/crm-api/trading/trading-data/orders-by-ids.md): With this endpoint, you can retrieve Orders History for a specific Trading Account by order ids. • [Retrieve Closed Positions by Ids](https://app.theneo.io/match-trade/crm-api/trading/trading-data/closed-positions-by-id.md): With this endpoint, you can retrieve closed positions of a specific trading account by position ids. • [Retrieve Open Positions by Ids](https://app.theneo.io/match-trade/crm-api/trading/trading-data/open-positions-by-id.md): With this endpoint, you can retrieve open positions for a specific trading account by position ids. Typically, the time filter is not used (you retrieve currently open positions), but if present (e.g., in historical/report views), it applies to the opening time (openTime). • [Retrieve Active Orders by Ids](https://app.theneo.io/match-trade/crm-api/trading/trading-data/active-orders-by-id.md): With this endpoint, you can retrieve Active Orders for a specific Trading Account by order ids. • [Retrieve Platform Logs v2](https://app.theneo.io/match-trade/crm-api/trading/trading-data/platform-logs-v2.md): With this endpoint, you can retrieve all Platform Logs using multiple filters. Filters only return results for exact matches • [Retrieve Balance Snapshots](https://app.theneo.io/match-trade/crm-api/trading/trading-data/retrieve-balance-snapshots.md): Using this endpoint, you can acquire list of balance snapshots (created once a day) for requested users. Status PARTIAL means that system could not process all data in the requested time range - narrow the time range to ensure all balance snapshots were received • [Get Candles](https://app.theneo.io/match-trade/crm-api/trading/trading-data/candles/candles.md): Get Candles endpoint allows you to retrieve candle data for a specific symbol and time interval. You will access information on the opening, high, low, and closing prices of candles within the specified time frame. • [Prop Trading](https://app.theneo.io/match-trade/crm-api/prop.md): Prop Trading endpoints have been upgraded to v2 in version 1.28. If you're using v1 endpoints, please refer to version 1.27 documentation and plan your migration. • [Prop gRPC](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc.md): This gRPC model outlines a collection of interconnected services within the Broker API package, enabling seamless real‑time communication and data streaming. The following documentation provides detailed information on each service and its methods, ensuring developers have the guidance they need for efficient integration and interaction with the system. The address to connect to the gRPC stream is: grpc-broker-api-demo.match-trader.com. A separate gRPC ping stream sends pings every 50 seconds (configurable) to maintain an active connection. Prop RPC methods do not require any input parameters. Below is the corresponding Protobuf definition used for the prop gRPC service. Plain text syntax = "proto3"; option java_multiple_files = true; option java_package = 'com.matchtrade.broker_api.prop_grpc'; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "google/protobuf/empty.proto"; service PropAccountExternalStreamService { rpc GetPropAccountsCreated(google.protobuf.Empty) returns (stream PropAccountCreatedResponseExternal) {} rpc GetPropAccountTargetsUpdates(google.protobuf.Empty) returns (stream PropAccountTargetsUpdateResponseExternal) {} rpc GetPropAccountStatusUpdates(google.protobuf.Empty) returns (stream PropAccountStatusUpdateResponseExternal) {} rpc GetPropAccountMaxLossUpdates(google.protobuf.Empty) returns (stream PropAccountMaxLossUpdateResponseExternal) {} } service PropEvaluationExternalStreamService { rpc GetPropEvaluationRequests(google.protobuf.Empty) returns (stream PropAccountEvaluationRequestCreatedResponseExternal) {} rpc GetPropAccountEvaluationStatusUpdates(google.protobuf.Empty) returns (stream PropAccountEvaluationStatusUpdateResponseExternal) {} } enum AccountInChallengeStatus { ACTIVE_PARTICIPATING_IN_CHALLENGE = 0; ACTIVE_FUNDED = 1; CREATED_NOT_YET_PAID_CHALLENGE_FEE = 2; LOCKED_FAILED_CHALLENGE = 3; AWAITING_COMPETITION_START = 4; AWAITING_COMPETITION_FEE_NOT_PAID = 5; ACTIVE_COMPETITION = 6; LOCKED_FINISHED_COMPETITION = 7; LOCKED_FAILED_COMPETITION = 8; } enum AccountEvaluationStatus { MAX_LOSS_REACHED = 0; MAX_DAILY_LOSS_REACHED = 1; PROFIT_TARGET_REACHED_OPEN_TRADES = 2; PROFIT_TARGET_REACHED_NO_OPEN_TRADES = 3; } enum ChallengeType { DEFAULT = 0; COMPETITION = 1; } message PropAccountCreatedResponseExternal { oneof msg { PropAccountCreated propAccountCreated = 1; bool heartbeat = 2; } } message PropAccountCreated { int64 login = 1; string propAccountUuid = 2; string challengeUuid = 3; int64 phaseStep = 4; AccountInChallengeStatus status = 5; google.protobuf.Timestamp created = 6; } message PropAccountTargetsUpdateResponseExternal { oneof msg { PropAccountTargetsUpdate propAccountTargetsUpdate = 1; bool heartbeat = 2; } } message PropAccountTargetsUpdate { int64 login = 1; string propAccountUuid = 2; double maxLossEquityLevel = 3; double maxDailyLossEquityLevel = 4; double profitTargetEquityLevel = 5; int64 tradingPeriod = 6; int64 minimumTradingPeriod = 7; } message PropAccountStatusUpdateResponseExternal { oneof msg { PropAccountStatusUpdate propAccountStatusUpdate = 1; bool heartbeat = 2; } } message PropAccountStatusUpdate { string propAccountUuid = 1; AccountInChallengeStatus status = 2; int64 login = 3; } message PropAccountEvaluationStatusUpdateResponseExternal { oneof msg { PropAccountEvaluationStatusUpdate propAccountEvaluationStatusUpdate = 1; bool heartbeat = 2; } } message PropAccountEvaluationStatusUpdate { int64 login = 1; string propAccountUuid = 2; AccountEvaluationStatus status = 3; } message PropAccountEvaluationRequestCreatedResponseExternal { oneof msg { PropAccountEvaluationRequestCreated propAccountEvaluationRequestCreated = 1; bool heartbeat = 2; } } message PropAccountEvaluationRequestCreated { int64 login = 1; string propAccountUuid = 2; } message PropAccountMaxLossUpdateResponseExternal { oneof msg { PropAccountMaxLossUpdate propAccountMaxLossUpdate = 1; bool heartbeat = 2; } } message PropAccountMaxLossUpdate { string propAccountUuid = 1; double dailyMaxLoss = 2; double maxLoss = 3; int64 login = 4; } • [GetPropAccountsCreated](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/accounts.md): Streams notifications of newly created prop accounts. Returns a stream of PBPropAccountsCreatedResponseExternal messages. • [GetPropAccountTargetsUpdates](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/targets.md): Streams updates of challenge parameters assigned to a prop account: max loss , max daily loss , profit target , trading period and minimum trading period . Updates are triggered by events such as challenge edits, phase changes, or snapshots. • [GetPropAccountStatusUpdates](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/status.md): Streams updates of account status for prop accounts, notifying transitions between statuses like Created not paid, Active, Active Funded, and Failed. • [GetPropAccountMaxLossUpdates](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/max-loss.md): Streams updates of max loss and max daily loss target parameters for prop accounts. Messages are triggered by changes on equity. • [GetPropEvaluationRequests](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/evaluation.md): Streams requests for transitioning a prop account to the next challenge phase. Only new requests are sent (request updates due to accept/reject are not shown) • [GetPropAccountEvaluationStatusUpdates](https://app.theneo.io/match-trade/crm-api/prop/prop-grpc/evaluation-status.md): Streams updates of the evaluation status for prop accounts. Example statuses include Loss Limit Reached, Profit Target Reached Open Trades, and Profit Target Reached No Open Trades . • [Configuration](https://app.theneo.io/match-trade/crm-api/prop/configuration.md): In the challenges section, you will find endpoints that allow you to perform various operations on challenges:Get challengesCreate challengeUpdate challenge • [Get Broker Configuration](https://app.theneo.io/match-trade/crm-api/prop/configuration/general.md): With the General Configuration endpoint, you can retrieve information about prop trading settings related to all challenges and accounts. • [Update Broker Configuration](https://app.theneo.io/match-trade/crm-api/prop/configuration/get-general-configuration-copy.md): With the General Configuration endpoint, you can retrieve information about prop trading settings related to all challenges and accounts. • [Challenges](https://app.theneo.io/match-trade/crm-api/prop/challenges.md): In the challenges section, you will find endpoints that allow you to perform various operations on challenges:Get challengesCreate challengeUpdate challenge • [Get Challenges](https://app.theneo.io/match-trade/crm-api/prop/challenges/challenges.md): This endpoint retrieves a list of all challenges available on the platform with their details • [Get Challenge Statistics](https://app.theneo.io/match-trade/crm-api/prop/challenges/statistics.md): This endpoint retrieves statistics of given challenges • [Get Challenge Statistics For Account](https://app.theneo.io/match-trade/crm-api/prop/challenges/get-challenge-statistics-for-account.md): Returns a single statistics object for only one prop account. • [Get Challenge by Uuid](https://app.theneo.io/match-trade/crm-api/prop/challenges/challenge-id.md): This endpoint retrieves a oen selected challenge available on the platform with their details. • [Get Challenge Add Ons](https://app.theneo.io/match-trade/crm-api/prop/challenges/get-challenge-add-ons.md): Returns the list of add-ons (optional extras) configured for the challenge identified by challengeUuid . It provides the add-ons that are available to be offered for that challenge, including their configuration details such as name, type, price, currency, status, and other relevant attributes defined by the API model. • [Create Challenge](https://app.theneo.io/match-trade/crm-api/prop/challenges/create.md): This endpoint allows administrators to create a new trading challenge on the platform. Each challenge sets specific objectives, rewards, and conditions for traders to meet within a defined timeframe. This endpoint is essential for managing and introducing new challenges to engage traders and enhance their trading skills. • [Update Challenge](https://app.theneo.io/match-trade/crm-api/prop/challenges/update.md): This endpoint allows administrators to update an existing trading challenge on the platform. This endpoint is essential for managing and adjusting challenges to ensure they remain relevant and engaging for traders. • [Delete Challenge](https://app.theneo.io/match-trade/crm-api/prop/challenges/delete-challenge.md): This endpoint deletes (removes) the Prop challenge definition/configuration identified by challengeUuid from the CRM. • [Trading Accounts](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts.md): In the Trading Accounts section you can find endpoints for:Get trading accountsCreate trading accountUpdate trading accountForce snapshot • [Get Prop Trading Accounts](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/prop-trading-accounts.md): With the Get Accounts endpoint, you can retrieve detailed information about all Prop Trading Accounts within the system. • [Get Prop Trading Account by Uuid](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/id.md): With the Get Account endpoint, you can retrieve detailed information about one selected Prop Trading Account. • [Create Prop Trading Account](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/create.md): In this section, you can find the endpoint for creating new Prop Trading Accounts in the system. • [Update Prop Trading Account](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/update.md): With this endpoint, you can update and modify Prop Trading Account details. • [Force Snapshot](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/force-snapshot.md): With the Force Snapshots endpoint, you can reset account max daily loss to not wait to original daily snapshot until the original daily snapshot entire max daily loss is available again. • [Get Failure Snapshot](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/failure-snapshot.md): With the Get Failure Snapshot endpoint, you can retrieve detailed information why the account was failed and what other trading values were in the account at the time it was failed. • [Get Account Targets](https://app.theneo.io/match-trade/crm-api/prop/prop-trading-accounts/get-failure-snapshot-copy.md): With the Get Failure Snapshot endpoint, you can retrieve detailed information why the account was failed and what other trading values were in the account at the time it was failed. • [Payments](https://app.theneo.io/match-trade/crm-api/prop/prop-payments.md): In the Payments section you can find endpoints for:Manual WithdrawalGet max amount to withdrawalGet amount to deposit • [Manual Withdrawal](https://app.theneo.io/match-trade/crm-api/prop/prop-payments/manual-withdrawal.md): Using this endpoint, you can withdraw funds from a Trading Account. It's important to use this withdrawal endpoint for prop trading accounts to automatically calculate new max daily loss. • [Get Max Amount To Withdraw](https://app.theneo.io/match-trade/crm-api/prop/prop-payments/max-amount.md): This endpoint retrieves the maximum amount that the user is eligible to withdraw from their challenge. This takes into consideration factors such as account balance, initial balance, and profit split. This endpoint is essential to understand current withdrawal capacity. • [Get Amount For Deposit](https://app.theneo.io/match-trade/crm-api/prop/prop-payments/amount-for-deposit.md): This endpoint retrieves the required amount that the authenticated user should deposit into their trading account to activate the challenge. • [Evaluation Requests](https://app.theneo.io/match-trade/crm-api/prop/evaluation-requests.md): In the Evaluation Requests section you can find endpoints for:Get evaluation requestsConfirm evaluationReject evaluation • [Get Evaluation Requests](https://app.theneo.io/match-trade/crm-api/prop/evaluation-requests/requests.md): With the Get Evaluation Requests endpoint, you can retrieve information about all Prop Trading Accounts which are currently waiting for the evaluation to the next phase. • [Confirm Evaluation](https://app.theneo.io/match-trade/crm-api/prop/evaluation-requests/confirm.md): With the Confirm Evaluation endpoint, you can confirm pending request to move to next phase. • [Reject Evaluation](https://app.theneo.io/match-trade/crm-api/prop/evaluation-requests/reject.md): With the Reject Evaluation endpoint, you can confirm pending request to move to next phase. • [Competitions](https://app.theneo.io/match-trade/crm-api/prop/competitions.md): All time-related fields accept and return values according to the RFC 3339 standard, without fractions of seconds. For example 2024-01-13T09:20:04Z . • [Details](https://app.theneo.io/match-trade/crm-api/prop/competitions/details.md): In the Evaluation Requests section you can find endpoints for:Get evaluation requestsConfirm evaluationReject evaluation • [Get All Competitions](https://app.theneo.io/match-trade/crm-api/prop/competitions/details/all-competitions.md): The "Get All Competitions" allows users to retrieve a list of all competitions available within the system. By accessing this section, users can view essential information such as competition UUIDs, names, start and end dates, and related branch and system details. This functionality enables users to efficiently manage and monitor various competitions within the platform. • [Get Competition Details by Uuid](https://app.theneo.io/match-trade/crm-api/prop/competitions/details/uuid.md): The "Get Competition Details by Uuid" endpoint enables users to retrieve a specific competition’s information using its unique identifier, ensuring they can effectively monitor and manage competition settings within the platform. • [Create Competition](https://app.theneo.io/match-trade/crm-api/prop/competitions/details/create.md): The "Create Competition" endpoint enables users to create new competitions by specifying essential details, ensuring they can introduce fresh challenges and engage participants effectively within the platform. • [Update Competition](https://app.theneo.io/match-trade/crm-api/prop/competitions/details/update.md): The "Update Competition" endpoint allows administrators to modify existing competition parameters, ensuring they stay relevant and up to date. This functionality is essential for maintaining a fair and engaging user experience within the platform. • [Get Competition Ranking](https://app.theneo.io/match-trade/crm-api/prop/competitions/details/get-competition-details-by-uuid-copy.md): The "Get Competition Details by Uuid" endpoint enables users to retrieve a specific competition’s information using its unique identifier, ensuring they can effectively monitor and manage competition settings within the platform. • [Accounts](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts.md): In the Evaluation Requests section you can find endpoints for:Get evaluation requestsConfirm evaluationReject evaluation • [Get All Competition Accounts](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts/all-competition-accounts.md): The "Get All Competition Accounts" endpoint retrieves a list of accounts participating in competitions. It returns relevant details about each account, including its status and related competitions. • [Get Accounts In Competition](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts/trading-accounts.md): The "Get Accounts In Competition" endpoint retrieves a list of accounts registered for a specific competition. It provides details such as account identifiers, user information, creation date, and current status within the competition. • [Get Competition Account by Uuid](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts/competition-account-uuid.md): The "Get Competition Account by Uuid" endpoint retrieves details of a specific competition account using its unique identifier. It returns information such as the account’s login, user details, competition name, and current status. • [Create Competition Account](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts/competition-create.md): The "Create Competition Account" endpoint creates a new competition account for a specified competition. It requires a CRM account UUID as input and returns details of the newly created competition account, including its unique identifier, login, user information, competition name, and status. • [Update Competition Account](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-accounts/competition-update.md) • [Targets (v1)](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-targets.md): In the Targets Requests section you can find endpoints for: Get Competition Accounts Targets Get Competition Account Targets by Uuid Reject evaluation • [Get Competition Accounts Targets](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-targets/competition-targets.md): The “Get Competition Accounts Targets” endpoint retrieves performance statistics for competition accounts in a specific competition. It provides details such as account balance, equity, profit, and risk metrics. The results are paginated and sorted by creation date in descending order. • [Get Competition Account Targets by Uuid](https://app.theneo.io/match-trade/crm-api/prop/competitions/competition-targets/competition-uuid.md): The “Get Competition Account Targets by Uuid” endpoint retrieves detailed performance statistics for a specific competition account. It includes metrics such as balance, equity, profit, and risk limits. • [Get Add Ons](https://app.theneo.io/match-trade/crm-api/prop/add-ons/add-ons.md): With the Get Add Ons endpoint, you can retrieve information about all Prop Trading Add Ons. • [Get Add On by Uuid](https://app.theneo.io/match-trade/crm-api/prop/add-ons/add-on.md): With the Get Add On by Uuid endpoint, you can retrieve detailed information about Prop Trading Add On. • [Edit Add On](https://app.theneo.io/match-trade/crm-api/prop/add-ons/edit.md): In this section, you can find the endpoint for editing a Prop Trading Add On. • [Create Add On](https://app.theneo.io/match-trade/crm-api/prop/add-ons/create.md): In this section, you can find the endpoint for creating a new Prop Trading Add On. • [Delete Add On](https://app.theneo.io/match-trade/crm-api/prop/add-ons/delete.md): With the Delete Add Ons endpoint, you can delete a Prop Trading Add Ons. • [Get Discounts](https://app.theneo.io/match-trade/crm-api/prop/discounts/get-add-ons-copy.md): With the Get Add Ons endpoint, you can retrieve information about all Prop Trading Add Ons. • [Retrieve Money Managers Leaderboard](https://app.theneo.io/match-trade/crm-api/social-trading/money-managers-leaderboard.md): With the Retrieve Money Managers Leaderboard endpoint, you can acquire information shown in the Match-Trader platform's Social Trading leaderboard, including ROI statistics for each Moeny Manager which can be presented in a chart form. • [Retrieve Single Money Manager Statistics](https://app.theneo.io/match-trade/crm-api/social-trading/money-manager-statistics.md): With the Retrieve Single Money Manager Statistics endpoint, you can acquire detailed statistics of a Money Manager shown in the Match-Trader platform's Social Trading leaderboard. • [CRM Events](https://app.theneo.io/match-trade/crm-api/crm-events.md): CRM Events, such as payment and timeline events are implemented in Broker API via two delivery methods, Webhooks and gRPC, to suit different integration requirements. You will find details for each of the methods in corresponding sections. • [Webhooks](https://app.theneo.io/match-trade/crm-api/crm-events/webhooks.md): To create a Webhook setup, contact with support team is required. Webhook mechanism for CRM events, similarily to the gRPC connection, requires list of account uuids or branch uuids, but, in this case, those elements are provided at the creation of a webhook setup. • [gRPC](https://app.theneo.io/match-trade/crm-api/crm-events/grpc.md): This gRPC model defines several services within a package designed for the Broker API, focusing on crm events, such as timeline and payment events. Below is the complete documentation for all services and their methods. The address to connect to the gRPC stream is: grpc-broker-api-demo.match-trader.com. A separate gRPC ping stream sends pings every 50 seconds (configurable) to maintain an active connection. Below is the corresponding Protobuf definition used for the gRPC service. Protocol Buffers syntax = 'proto3'; option java_multiple_files = true; option java_package = 'com.matchtrade.broker_api.grpc'; package com.matchtrade.broker_api.grpc; service CrmAccountInfoServiceExternal { rpc getAccountEventStream (PBAccountEventRequestExternal) returns (stream PBAccountEventStreamResponseExternal) {} } service PaymentService { rpc StreamWithdrawals (WithdrawalRequestExternal) returns (stream WithdrawalStreamResponseExternal); rpc StreamDeposits (DepositRequestExternal) returns (stream DepositStreamResponseExternal); } service PBTimelineServiceExternal { rpc GetDepositEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); rpc GetWithdrawalEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); rpc GetLoginEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); rpc GetManagerAssignmentEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); rpc GetTaskEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); rpc GetNoteEventsStream(PBTimelineRequestExternal) returns (stream PBTimelineEventResponseExternal); } message PBAccountEventRequestExternal { repeated string accountEmails = 1; repeated string accountUuids = 2; repeated string branchUuids = 3; } message PBAccountEventStreamResponseExternal { oneof msg { PBAccountEvent accountEvent = 1; bool heartbeat = 2; } } message PBAccountEvent { PBAccount account = 1; PBEventType eventType = 2; } enum PBEventType { CREATED = 0; UPDATED = 1; DELETED = 2; } message PBAccount { string uuid = 1; int64 created = 2; int64 updated = 3; string email = 4; string verificationStatus = 5; string type = 6; PBPersonalDetails personalDetails = 7; PBContactDetails contactDetails = 8; PBAccountConfiguration accountConfiguration = 9; PBAddressDetails addressDetails = 10; PBBankingDetails bankingDetails = 11; PBLeadDetails leadDetails = 12; } message PBPersonalDetails { string firstname = 1; string lastname = 2; string dateOfBirth = 3; string citizenship = 4; string language = 5; string maritalStatus = 6; PBPassportDetails passport = 7; string taxIdentificationNumber = 8; } message PBPassportDetails { string number = 1; string country = 2; } message PBContactDetails { string phoneNumber = 1; string faxNumber = 2; PBToContact toContact = 3; string alternativePhoneNumber = 4; } message PBToContact { int64 toContactDate = 1; bool alreadyContacted = 2; } message PBAccountConfiguration { int64 partnerId = 1; string branchUuid = 2; string roleUuid = 3; PBAccountManager accountManager = 4; string ibParentTradingAccountUuid = 5; PBCrmUserScope crmUserScope = 6; bool accountTypeContact = 7; } message PBAccountManager { string uuid = 1; string email = 2; string name = 3; } message PBCrmUserScope { repeated string branchScope = 1; repeated string managerPools = 2; } message PBAddressDetails { string country = 1; string state = 2; string city = 3; string postCode = 4; string address = 5; } message PBBankingDetails { string bankAddress = 1; string bankSwiftCode = 2; string bankAccount = 3; string bankName = 4; string accountName = 5; } message PBLeadDetails { string statusUuid = 1; string source = 2; string providerUuid = 3; int64 becomeActiveClientTime = 4; string status = 5; } message WithdrawalRequestExternal { repeated string accountEmails = 1; repeated string accountUuids = 2; repeated string branchUuids = 3; } message DepositRequestExternal { repeated string accountEmails = 1; repeated string accountUuids = 2; repeated string branchUuids = 3; } message DepositStreamResponseExternal { oneof msg { DepositEvent depositEvent = 1; bool heartbeat = 2; } } message WithdrawalStreamResponseExternal { oneof msg { WithdrawalEvent withdrawalEvent = 1; bool heartbeat = 2; } } message DepositEvent { DepositViewModelExternalResponseDto depositDetails = 1; PBEventType depositEventType = 2; } message WithdrawalEvent { WithdrawViewModelExternalResponseDto withdrawalDetails = 1; PBEventType withdrawalEventType = 2; } message DepositViewModelExternalResponseDto { string uuid = 1; int64 partnerId = 2; string created = 3; string updated = 4; string createdBy = 5; string updatedBy = 6; optional string remark = 7; optional string errors = 8; AccountInfoDto accountInfo = 9; PaymentRequestInfo paymentRequestInfo = 10; } message WithdrawViewModelExternalResponseDto { string uuid = 1; int64 partnerId = 2; string created = 3; string updated = 4; string createdBy = 5; string updatedBy = 6; optional string remark = 7; optional string errors = 8; AccountInfoDto accountInfo = 9; PaymentRequestInfo paymentRequestInfo = 10; } message AccountInfoDto { string accountUuid = 1; string email = 2; PaymentPersonalDetails personalDetails = 3; optional AccountManager accountManager = 4; TradingAccount tradingAccount = 5; PaymentLeadDetails leadDetails = 6; optional string country = 7; optional string branchUuid = 8; optional string parentTradingAccountUuid = 9; } message PaymentPersonalDetails { optional string firstname = 1; optional string lastname = 2; } message AccountManager { optional string uuid = 1; optional string email = 2; optional string name = 3; } message TradingAccount { string uuid = 1; string login = 2; string offerUuid = 3; } message PaymentLeadDetails { optional string source = 1; } message PaymentRequestInfo { FinancialDetails financialDetails = 1; PaymentGatewayDetails paymentGatewayDetails = 2; AdditionalInfo additionalInfo = 3; } message FinancialDetails { string status = 1; optional double amount = 2; optional double netAmount = 3; optional double conversionRate = 4; optional string conversionCurrency = 5; optional string paymentGatewayCurrency = 6; optional string tradingAccountCurrency = 7; } message PaymentGatewayDetails { optional string uuid = 1; optional string name = 2; optional CustomFields customFields = 3; optional string bankAddress = 4; optional string bankName = 5; optional string bankSwiftCode = 6; optional string paymentAccount = 7; optional string accountName = 8; } message CustomFields { map<string, string> fields = 1; } message AdditionalInfo { optional string walletAddress = 1; optional string reference = 2; optional string paymentId = 3; } message PBAccountInfo { optional string uuid = 1; optional string email = 2; optional string name = 3; optional string surname = 4; } message PBTimelineEventAccountInfo { string uuid = 1; string email = 2; string branchUuid = 3; optional string name = 4; optional string surname = 5; optional string accountManagerUuid = 6; } message PBTimelineEventResponseExternal { oneof msg { PBTimelineEvent timelineEvent = 1; bool heartbeat = 2; } } message PBTimelineEvent { string timestamp = 1; PBEventType eventType = 2; PBTimelineEventAccountInfo accountInfo = 3; oneof event_data { PBLoginEvent login = 4; PBDepositEvent deposit = 5; PBWithdrawalEvent withdrawal = 6; PBLeadAssignmentEvent leadAssignment = 7; PBTaskEvent task = 8; PBNoteEvent note = 9; } } message PBLoginEvent { string ipAddress = 1; } message PBDepositEvent { string depositUuid = 1; double amount = 2; string status = 3; } message PBWithdrawalEvent { string withdrawalUuid = 1; double amount = 2; string status = 3; } message PBLeadAssignmentRule { string uuid = 1; string name = 2; } message PBLeadAssignmentEvent { optional PBAccountInfo newManager = 1; optional PBLeadAssignmentRule leadAssignmentRule = 2; } message PBTaskEvent { string taskUuid = 1; string type = 2; optional PBAccountInfo assignedTo = 3; string content = 4; } message PBNoteEvent { string noteUuid = 1; string type = 2; string actionBy = 3; string content = 4; } message PBTimelineRequestExternal { repeated string accountEmails = 1; repeated string accountUuids = 2; repeated string branchUuids = 3; } • [PBTimelineServiceExternal](https://app.theneo.io/match-trade/crm-api/crm-events/grpc/pbtimelineserviceexternal.md): This section contains events of CRM Timeline Events visible on the account details page. One can subscribe on all of the following streams using lists of account emails, uuids or branch uuids. • [Prediction Market](https://app.theneo.io/match-trade/crm-api/prediction-market.md): Prediction Market is a dedicated trading module within the Match-Trader platform that allows brokers to offer their clients the ability to speculate on the outcomes of real-world events - political, economic, sporting, and more. Instead of trading traditional instruments, users take positions on binary outcomes (e.g. "Will candidate X win the election?") by trading YES or NO instruments for each possible outcome. Each event is represented as a Bet . A Bet contains one or more Outcomes , and each Outcome is backed by a pair of native PRED -type instruments in the trading engine - one for the YES side and one for the NO side. Prices on these instruments move in the range of 0 to 1, reflecting the implied probability of that outcome occurring. The endpoints in this section cover data retrieval: browsing available events, viewing event details, and resolving which instruments correspond to each outcome. Actual trading (opening and closing positions on YES/NO instruments) is handled by the standard trading endpoints under the Trading section. A dedicated API permission is required to access the Prediction Market endpoints. • [Get Bets](https://app.theneo.io/match-trade/crm-api/prediction-market/get-bets.md): Returns a paginated list of Bets (events) available on the platform. Results can be filtered by status to show only currently tradeable markets. • [Get Bet by Uuid](https://app.theneo.io/match-trade/crm-api/prediction-market/get-bets-by-uuid.md): Returns full metadata for a single Bet, identified by its UUID. Use this endpoint to build a detail or event view in your project - for example, displaying the event title, description, category, and scheduled close time before a user selects an outcome to trade. • [Get Bet Outcomes](https://app.theneo.io/match-trade/crm-api/prediction-market/get-bet-outcomes.md): Returns the list of possible outcomes for a specific Bet. Each outcome includes the names of its corresponding YES and NO trading instruments in the engine, allowing your project to directly link an outcome to tradeable symbols without any manual symbol mapping. Both active and already-resolved outcomes are returned, each with their respective status, so the full picture of an event can be displayed even after resolution. To open a position on an outcome, use the instrument names returned here ( instrumentYesName or instrumentNoName ) with the standard POST /v1/trading-accounts/positions/open endpoint. Only BUY-side orders are accepted for Prediction Market instruments, and positions must be opened on retail trading accounts. • [FAQ](https://app.theneo.io/match-trade/crm-api/faq.md): This section contains frequently asked questions about integrating third-party tools with the Match-Trade CRM via the CRM-API . Here you'll find concise answers to common technical questions that arise during implementation. The FAQ is regularly updated as new questions emerge from our integration partners. How do I transfer a trading account from one group to another? To change a trading account's group, you need to update its associated offer. Use the following endpoint: CURL curl --location --request PATCH '{{baseURL}}/v1/trading-account?systemUuid={{systemUuid}}&login={{login}}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {{APIkey}}' \ --data '{ "offerUuid": "{{offer_uuid}}" }' This will move the trading account to the new offer (and consequently to the new group). How do I change a trader's password? Passwords are associated with the user account (not with individual trading accounts). To change a password, use: Bash POST /v1/change-password The system will automatically encrypt the new password. Neither you nor the Match-Trade system will have access to the plain text password after this change. How do I retrieve a list of a user's trading accounts? To get all trading accounts associated with a specific user account: Bash GET /v1/trading-accounts?query={{email}} This will return all trading accounts linked to the specified account email. How do I check a trading account's balance? To check the current balance and equity of a trading account: Bash GET /v1/trading-account?systemUuid={{systemUuid}}&login={{tradingAccountLogin}} This will return the current balance, equity, and other financial information for the specified trading account. What are branch, system and operation? Branch is used in our CRM, e.g., for organizing clients by country. For external integrations, the "Default" branch should be used, which is always set up by Match-Trade. System is an internal service that connects the platform to the backend. There is only one, and it is unchangeable per server. The Match-Trade team configures it. Operation is an internal service responsible for the proper creation of accounts. There is only one and it is unchangeable, set up during the client's setup by Match-Trade. Some endpoints require the UUIDs of these services ( systemUuid , branchUuid , operationUuid ), which can be obtained, for example, from the endpoint: Bash GET /v1/offers What is credit? Balance, Credit and Equity Equity = Balance + Credit Balance includes deposits and closed trade results. Credit is extra funds (e.g., bonuses) that cannot be withdrawn. Credit allows an account to have a negative balance if it has been granted. For example, if an account has a balance of $100 and a credit of $50, and loses $130, the balance will be -$30, while the credit will remain $50. How to change leverage on a trading account? To change the leverage on a trading account, you need the systemUuid and the trading account login. Then send the following request: CURL curl --location --request PUT '{{baseURL}}/v1/trading-account/leverage?systemUuid={{systemUuid}}&login={{login}}' \ --header 'Authorization: {{APIkey}}' \ --header 'Content-Type: application/json' \ --data '{ "leverage": "100" }' A 204 status indicates that the leverage has been successfully changed. How to create a trading account with specific parameters (currency, leverage, etc.)? The trading account parameters such as currency, leverage, and account type (Demo or Real) are determined by the settings of the group and the corresponding offer in the Match-Trade system. If you want to create, for example, a Demo trading account with 1:30 leverage and currency set to EUR, you first need to: Create a group in the admin panel (backend) with the desired parameters. Create an offer assigned to that group, with EUR as the currency, leverage set to 30, and the Demo type enabled. Once the group and offer are configured, you can send a request to create the account. For a user account: Bash POST {baseURL}/v1/accounts For a trading account under an existing user account: Bash POST {baseURL}/v1/accounts/{{accountUuid}}/trading-accounts Make sure to include the offerUuid in the request body. The system will then create the trading account using the parameters defined in the selected offer. What is an offer and how do I configure it? An Offer is a trading account configuration created and managed manually in the CRM. It cannot be created or modified via API - the API allows read-only access (GET) to Offer data. An Offer maps to a specific trading group configured in the trading system backend (admin). That group defines all detailed trading conditions for the trader, such as commissions, markups, symbols, execution rules, and other broker-specific settings. For the end user (trader): the Offer name is displayed in the top-left corner of the trading platform, the Offer type (e.g. Demo or Real) is clearly indicated. From a functional perspective, an Offer defines: what type of trading account will be created for the client, with which basic parameters, such as: real or demo account, trading system (e.g. MTT / MT5), account currency, initial leverage and more. An Offer must exist in order to create a trading account correctly. It is mandatory when creating a trading account via API — the request must include a valid offerUuid . Based on the provided offerUuid, the system automatically creates the trading account using the configuration defined in the Offer and its mapped trading group. What is the "Fixed Amount Book" Mechanism for Prop Trading? The "Fixed Amount Book" mechanism for Prop Trading was introduced to handle cryptocurrency payments where the user must pay a precise, fixed amount (e.g., for a challenge fee). The statuses FULLY_PAID and PARTIALLY_PAID were created to handle scenarios where the amount sent to the blockchain wallet does not exactly match the declared amount. Purpose: Designed for Prop Trading challenges where users must pay a specific, fixed fee (e.g., $100 for a challenge) using cryptocurrency. Functionality: It "freezes" the exchange rate for a set time (default 5 minutes) to ensure the user pays the exact required amount in crypto. It allows only one open "Fixed Amount" transaction per trading account at a time. It introduces a "Declared Amount" field to track what the user should pay versus what was actually received. Why new statuses were created? PARTIALLY_PAID : Handles cases where the user sends less crypto than required (e.g., due to network fees or user error). The system marks it as partially paid, and the funds are not fully booked until the remainder is sent. It is considered a final status (like DONE) but indicates incomplete payment. FULLY_PAID : Confirms that the user sent the exact or greater amount than declared. It is equivalent to DONE but specifically signals that the fixed amount condition has been met, triggering actions like account activation or challenge start. What is the difference between deposit status FAILED and FAILED_PAYMENT? The difference lies in the stage of the process where the error occurred. FAILED is a general status indicating that the transaction failed within the internal system (e.g., due to a timeout, validation error, or rejection by the broker), while FAILED_PAYMENT specifically indicates a failure on the payment provider's side (e.g., declined card, payment gateway error). FAILED : Indicates a general failure of the transaction within the broker's system. Can be caused by internal validation errors, timeouts (e.g., trading API timeout), manual rejection by an admin, or system errors. Often used when the transaction logic itself fails or is cancelled internally. FAILED_PAYMENT : Specifically indicates that the payment process failed at the Payment Service Provider (PSP) level. Used when the payment gateway returns an error, declines the transaction, or fails to process the funds. In the CRM/MTR interface, this status informs the user that the issue lies with the payment method rather than the broker's internal logic. API Key, Token & HMAC The API key is the key that authorizes the user and must be sent in the request headers of each CRM-API request. It is assigned to a specific CRM user account and inherits the same permissions as that account. For example, if an API key is generated for an Admin CRM user, it will have Admin-level rights. Additional permission layers and request limits can be configured in CRM Back Office → API Access . This is also where API keys are generated and managed. Tokens and HMACs for the MTR Broker Management applications are generated in the Admin panel under the Special Accounts section. This is where Admin and Manager accounts are created and granted access to the Admin and Manager applications. The generated token and HMAC serve as authentication credentials (similar to a username and password) and are required to sign in to the backend applications. Note: Tokens and HMACs created in the Special Accounts section are intended only for authentication to the Admin and Manager applications and must not be used for CRM API requests. What is an Offer and how does it differ from a Challenge? What is an Offer? An Offer is a trading account template that defines the backend group, currency, leverage, and account type (Real or Demo). It's required every time a trading account is created. How does it differ from a Challenge? An Offer applies to standard brokerage — it defines a single account type. A Challenge is a prop trading product: a multi-phase structure with targets, loss limits, an entry fee, and an optional profit split. Challenges use Offers as building blocks for each phase. How many Offers do I need? One Offer per account type. If you want both Demo and Real accounts, configure at least two Offers — one with demo: true and one with demo: false How do Offers work with Prop Trading phases? Each Challenge phase maps to its own dedicated Offer. Phases 1–4 and Tournament create demo accounts; Funded and Instant Funding create real accounts. A minimal 2-phase challenge requires three Offers: Phase 1, Phase 2, and Funded. If you're using the Match-Trader Prop CRM, Offers become largely irrelevant at this level. The entire Challenge structure — phases, targets, rules, and fees — is configured directly in the Prop CRM, and the system automatically validates each phase progression through to Funded and the client's withdrawal. You don't need to manage or reference Offers manually in that flow. Offers matter primarily when integrating via API outside of the Prop CRM, for example when building a custom frontend or automating account creation programmatically. Roles in the Match-Trader CRM What system-level roles exist? These are assigned only via the database, not through the UI. SUPER ADMIN has full permissions across all partners in the environment. FULL ACCESS is a subset — it covers the most critical operations (e.g. deleting offers, confirming withdrawals/deposits). CRM MANAGER has access across all partners but with a restricted permission set (e.g. cannot process payments). What is the standard admin role? ADMIN has full permissions scoped to a single broker/partner. It's treated as having all entitlements within that partner. Can roles be customized? Yes. Custom roles are configurable in Roles Management in the Back Office. They are limited by entitlements, branch scope, and manager scope. Several predefined templates are available out of the box: Conversion Agent, Retention Agent, Account Manager, Support & CS, KYC, Finance (each also has a Team Leader variant). What roles exist for end clients? USER is a standard trader. IB / SUB IB is an Introducing Broker — the role changes automatically when a user becomes an IB. GUEST is a special token-only role for investor access (read-only). What is a group? Groups are the core trading configuration unit in Match-Trader Admin - every trading account belongs to a group, which defines its trading conditions (leverage, stop-out level, commissions, swaps, deposit currency, and available instruments). Groups are created in the Admin first, then mapped to CRM Offers or Challenges/Competitions, so that when a client opens a trading account under a given Offer/Challenge/Competition, the system automatically assigns them to the corresponding group.