Broker API ## Sections • [Introduction](https://app.theneo.io/match-trade/broker-api/introduction.md): The Broker API is a versatile API platform designed for various integrations, enabling streamlined management and interaction with multiple services through a single access point. This API supports REST and gRPC protocols, providing flexibility in integration and ensuring compatibility with diverse client systems. It facilitates secure, efficient administrative operations and service management, making it an essential tool for clients looking to optimise their operational workflows. 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 request limit is 500 requests/minute. • [Integration Guide for CRM with Match-Trader Platform](https://app.theneo.io/match-trade/broker-api/introduction/crm-integration.md): This comprehensive integration guide provides external CRM providers with the necessary instructions for connecting their systems with the Match-Trader Platform. The following sections outline the architecture, step-by-step integration process, authentication methods, and best practices to ensure a seamless connection between your CRM solution and our trading ecosystem. • [Architecture and Data Flow](https://app.theneo.io/match-trade/broker-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: When integrating your system, you only need to connect with Broker-API. There is no need to directly integrate with other components as they are already interconnected. Role of Individual Components Match-Trade CRM User account management (accounts) Mapping of offers with groups created in the admin panel Ability to check client details and platform logs (also available via API) 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: As a CRM Provider, you must integrate with offers in the CRM, not with groups in the Backend. This is a critical distinction as your integration will interact 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/broker-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. Example URL for the UAT environment: https://broker-api-demo.match-trader.com/ The API key should be kept secure and not shared publicly API Overview The Match-Trade Broker 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/broker-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 Platform. 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) 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 ensure that your CRM system correctly interacts with all critical Match-Trader 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/broker-api/introduction/crm-integration/financial-stream.md): This section describes all available API methods that external CRM providers (including PROP firms) can use to retrieve and monitor the status of trading accounts. Real-time balance and equity stream CRM providers 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 PROP trading CRM providers, 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}} Bash { "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: Bash { "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) Integration Guide for External Applications](https://app.theneo.io/match-trade/broker-api/introduction/sso.md): Single Sign-On (SSO) Process Between external applications and MTT Platform. The SSO mechanism is designed for external application → MTT platform login flow, not the other way around We have added this endpoint to the Broker-API to support external integrations that do not store or manage user passwords. This endpoint allows generating a One-Time Token (OTT), which lets a user log in to the platform without needing their password. This solution enables seamless redirection of an authenticated user from an external application (e.g. Client Office) 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: https://broker-api-demo.match-trader.com/ APIKey: XXX Demo platform test credentials Link: https://mtr-demo-prod.match-trader.com/ Login: test@match-trade.com Password: abcd1234 How to Test the One-Time Token After generating a token, open this link in your browser: {platformURL}/?auth={oneTimeToken} 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/broker-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 The authentication token is obtained from our Customer Relationship Management (CRM) system. You must first authenticate yourself within the CRM to receive a token. 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. Using the Token for Access Once the token is obtained, it must be included in the request to access secured resources within our system. The token is added to the HTTP request's header as follows: Plain text Authorization: Bearer <Your_Token_Here> Incorporating Authorization in gRPC Requests In gRPC, the traditional concept of HTTP headers is abstracted through metadata, allowing for the transmission of key-value pairs alongside RPC calls. To secure gRPC services with token-based authentication, the Authorization metadata (with the Bearer prefix) must be included with each call. This process is similar to using the Authorization header in HTTP requests but is adapted to fit the gRPC framework. Adding the Authorization Metadata To include an authentication token in a gRPC request, the token must be added as metadata using the 'Authorization' key, followed by the Bearer token value. This ensures that the server side of the gRPC service can authenticate the request by validating the token. 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 # Create a secure gRPC channel (recommended) channel = grpc.secure_channel('your_grpc_service_endpoint:443', grpc.ssl_channel_credentials()) # Prepare metadata with the Authorization token metadata = [('Authorization', 'Bearer <Your_Token_Here>')] # Create a stub (client) stub = YourServiceStub(channel) # Make a call with the Authorization metadata response = stub.YourRpcMethod(request, metadata=metadata) Replace <Your_Token_Here> with the actual token obtained from your CRM system, and adjust YourServiceStub and YourRpcMethod to match your gRPC service definition. • [gRPC](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/errors/grpc-error-handling.md): This section describes the standard gRPC error codes returned by Match-Trade streaming services (Broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/accounts/update.md): With this endpoint, you can update and modify Account details. In version 1.15 email update was added • [Change Account's Password](https://app.theneo.io/match-trade/broker-api/accounts/change-password.md): Using this endpoint, you can change the Account's password. • [Bulk Delete Accounts](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/payments/manual-deposit.md): Using this endpoint, you can deposit funds to a Trading Account. • [Manual Withdrawal](https://app.theneo.io/match-trade/broker-api/payments/manual-withdrawal.md): Using this endpoint, you can withdraw funds from a Trading Account. • [Credit In](https://app.theneo.io/match-trade/broker-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/broker-api/payments/credit-out.md): Using this endpoint, you can remove a credit from a Trading Account. • [Trading](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/prop/challenges/statistics.md): This endpoint retrieves statistics of given challenges • [Get Challenge by Uuid](https://app.theneo.io/match-trade/broker-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/broker-api/prop/challenges/get-challenge-by-uuid-copy.md): This endpoint retrieves a oen selected challenge available on the platform with their details. • [Create Challenge](https://app.theneo.io/match-trade/broker-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/broker-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/broker-api/prop/challenges/get-challenge-by-uuid-copy-1.md): This endpoint retrieves a oen selected challenge available on the platform with their details. • [Trading Accounts](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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. • [Challenge Statistics (v1)](https://app.theneo.io/match-trade/broker-api/prop/targets.md): In the Trading Accounts section you can find endpoints for: Get targets Get targets by Id • [Get Challenge Statistics](https://app.theneo.io/match-trade/broker-api/prop/targets/targets.md): With the Get Targets endpoint, you can retrieve information about max daily loss, max loss, profit target for all accounts in queried challenges. • [Get Challenge Statistics by Id](https://app.theneo.io/match-trade/broker-api/prop/targets/id.md): With the Get Targets by Id endpoint, you can retrieve information about max daily loss, max loss, profit target for one selected account. • [Payments](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/prop/competitions/competition-accounts/competition-update.md) • [Targets (v1)](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/prop/discounts/get-discounts.md): With the Get Discounts endpoint, you can retrieve information about all Prop Trading Discounts. • [Retrieve Money Managers Leaderboard](https://app.theneo.io/match-trade/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-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/broker-api/faq.md): This section contains frequently asked questions about integrating with the Match-Trader platform. Here you'll find concise answers to common technical questions that arise during implementation. The FAQ will be 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: Bash 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. The 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 will lose $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 to retrieve the systemUuid and the trading account login. Then, send the following request: Bash 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, account type (Demo or Real) and more, are determined by the settings of the group and the corresponding offer in the Match-Trader 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 usser account: Bash POST {{baseURL}}/v1/accounts For a trading account under an exsiting 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 : Created to handle 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 : Created to confirm 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 between FAILED and FAILED_PAYMENT 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 Broker 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 application are generated in the Admin panel under the Special Accounts section. There, Admin and Manager accounts are created and granted access to the Admin and Manager applications. The token and HMAC generated in Special Accounts should not be used in Broker API queries These tokens act as login credentials (similar to a username and password) and are used to authenticate.