====== T4 Onboarding API ======
===== Introduction =====
The onboarding API endpoint provides a streamlined method for integrators to create fully functional user accounts in the T4 system with a single request. This endpoint is specifically designed for trading platform vendors who build on top of the T4 backend and handle user onboarding through their own website.
By consolidating the four integration steps (user creation, account creation, market data selection, and EULA acceptance) into a single call, this API significantly simplifies the integration process and reduces development overhead.
===== API Endpoint =====
''POST https://api.t4login.com/admin/v1/onboarding''
===== Authentication =====
API requests must include authentication credentials. Contact T4.APISupport@plus500.com for integration specifics and access credentials.
===== Request Format =====
The onboarding request combines all necessary user, account, market data, and EULA information into a single JSON payload:
{
"User": {
"username": "john.smith@example.com",
"password": "SecurePassword123!",
"firstname": "John",
"lastname": "Smith",
"phone": "555-123-4567",
"email": "john.smith@example.com",
"street": "123 Main Street",
"city": "Anytown",
"county": "Anycounty",
"state": "IL",
"postCode": "60001",
"country": "US",
"apptype": "NonProfessional"
},
"Account": {
"account": "jsmith01",
"accountName": "jsmith01",
"templateAccount": "DefaultTemplate",
"displayName": "John Smith Account"
},
"MarketData": {
"updates": [{
"clearingExchange": "DUMMY",
"marketDataType": "Depth"
}]
},
"Eula": {
"collectedBy": "",
"eulaVersion": "2",
"signatures": [
{
"documentName": "LegalEULA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalPP",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalMDSA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalUSA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalNPSCF",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "CMEInformationLicenseAgreement",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "ICESubscriberAgreement",
"signed": "2025-05-01T10:30:15"
}
]
}
}
===== Field Descriptions =====
==== User Object ====
| **Field** | **Type** | **Description** | **Required** |
| username | string | Unique username for the user (typically email address) | Yes |
| password | string | User's password (must meet security requirements) | Yes |
| firstname | string | User's first name | Yes |
| lastname | string | User's last name | Yes |
| phone | string | User's contact phone number | Yes |
| email | string | User's email address | Yes |
| street | string | Street address | Yes |
| city | string | City | Yes |
| county | string | County | Yes |
| state | string | State/Province code | Yes |
| postCode | string | Postal/ZIP code | Yes |
| country | string | Country code (ISO) | Yes |
| apptype | string | User type ("Professional" or "NonProfessional") | Yes |
==== Account Object ====
| **Field** | **Type** | **Description** | **Required** |
| account | string | Unique account identifier | Yes |
| accountName | string | Display name for the account | Yes |
| templateAccount | string | Template account to base settings on | Yes |
| displayName | string | User-friendly display name | No |
==== MarketData Object ====
The MarketData object is optional but recommended for most integrations.
| **Field** | **Type** | **Description** | **Required** |
| updates | array | Array of exchange data subscriptions | No |
Each entry in the updates array contains:
| **Field** | **Type** | **Description** | **Required** |
| clearingExchange | string | Exchange identifier | Yes |
| marketDataType | string | Data subscription type (e.g., "Depth", "TOB", "Delayed") | Yes |
==== Eula Object ====
The Eula object is optional but required for a fully functional user account.
| **Field** | **Type** | **Description** | **Required** |
| collectedBy | string | Entity collecting the EULA (typically empty string) | Yes |
| eulaVersion | string | Version of EULA presented to user | Yes |
| signatures | array | Array of signed document objects | Yes |
Each signature object contains:
| **Field** | **Type** | **Description** | **Required** |
| documentName | string | Identifier for the document | Yes |
| signed | string | Timestamp when the document was signed (ISO 8601 format) | Yes |
===== Response Format =====
A successful response will include comprehensive information about the created user, account, market data subscriptions, and EULA status:
{
"result": {
"value": {
"data": {
"user": {
"userID": "90E53A07-B293-4805-B848-D91919337D0E",
"userName": "john.smith@example.com",
"lastname": "Smith",
"firstname": "John",
"enabled": true,
"message": "",
"company": "",
"phone": "555-123-4567",
"email": "john.smith@example.com",
"firmID": "2884B215-4A4B-4E9D-A40E-F8212D713E13",
"billingRef": "",
"street": "123 Main Street",
"city": "Anytown",
"county": "Anycounty",
"state": "IL",
"postCode": "60001",
"country": "US",
"simFirm": "",
"simUsername": "",
"simLinkedUserID": "",
"userCreationDate": "2025-05-15T00:00:00",
"appType": "NonProfessional",
"cmeMarketDataNetting": "Netting",
"trialExpires": "2025-05-29T00:00:00",
"iceMarketDataAccount": "",
"iceMarketDataParentAccount": "",
"euronextMarketDataAccount": "",
"euronextMarketDataParentAccount": "",
"custOrderHandlingInst": "Electronic",
"applications": [
{
"id": "2B9D2612-7C19-407C-89B4-E813CCD45DD1",
"name": "AppName1"
},
{
"id": "030C8C1E-D1FE-4782-81FC-8BC4D13CB122",
"name": "AppName2"
}
// Additional applications omitted for brevity
],
"roles": [
"TimeEntry",
"QueueOrders",
"ANTSEditor",
"ANTSFastBoard",
"MarketProfile",
"Strategy",
"ModifyOrders",
"BasicCharting",
"Charting",
"ANTS1",
"PitTrades",
"BillingRetail1",
"Trading",
"ANTSAccountNet",
"StrategyQuotes"
],
"accounts": []
},
"account": {
"accountID": "9526FC9A-0500-4261-8BC9-1FB88F537206",
"firmID": "2884B215-4A4B-4E9D-A40E-F8212D713E13",
"account": "jsmith01",
"accountName": "jsmith01",
"displayName": "",
"balance": 0.00000,
"cash": 0.00000,
"maxClipSize": 2000,
"preTradeDisabled": true,
"deleted": false,
"enabled": "Disabled",
"positionRollover": false,
"plRollover": true,
"minBalance": 0.00000,
"marginPC": 100.0,
"overnightMarginPC": 100.0,
"lossLimit": 0.00000,
"lossLimitPC": 0.0,
"dayLossLimit": 0.00000,
"dayLossLimitPC": 0.0,
"maxPosition": -1,
"noBalanceUpdates": false,
"noPositionUpdates": false,
"accountMode": "ByContract",
"orderRouting": false,
"groupName": "",
"activeTimeStart": "",
"activeTimeStop": "",
"strategyMaxClipSize": 2000,
"strategyMaxPosition": -1,
"warningThresholdPL": -1,
"warningThresholdLossLimit": -1,
"warningThresholdMargin": -1,
"boFirmCode": "",
"boOfficeCode": "",
"boSalesCode": "",
"totalPitTrades": -1,
"strategyTotalPitTrades": -1,
"maxContractMargin": -1.00000,
"maxContractDayMargin": -1.00000,
"blockExpiring": -1,
"blockExpiringOptions": -1,
"maxAccountPosition": -1,
"usePLForMargin": true,
"usePremiumForMargin": false,
"riskAlerts": false,
"fees": 0.0,
"commission": 0.00000,
"eMail": "",
"wideMarket": -1,
"priceBanding": -1,
"riskDebug": "None",
"tradeImport": false,
"marginType": "Spec",
"maxDelta": -1.00000,
"maxWorkingLongDelta": -1.00000,
"maxWorkingShortDelta": -1.00000,
"delayed": false,
"assignedType": true,
"optionsSettlement": 0,
"warningThresholdMinNetEquity": 0.00000,
"riskDetails": {
"comparisonRiskNumber": 0.0,
"comparisonNetLiqBalPCRiskNumber": 0.0,
"comparisonPCChangeVolatility": 0.2,
"comparisonPCChangeUnderlying": 0.1,
"comparisonWarningLevel": 0.8,
"maxDailyTheoLoss": 0.0,
"maxDailyTheoLossPCWarning": 0.8,
"greekDelta": 0.0,
"greekDeltaWarning": 0.8,
"greekVega": 0.0,
"greekVegaWarning": 0.8,
"greekGamma": 0.0,
"greekGammaWarning": 0.8,
"greekTheta": 0.0,
"greekThetaWarning": 0.8
},
"firm": "",
"parentFirmID": ""
},
"marketData": {
"exchangeMarketData": [
{
"clearingExchange": "DUMMY",
"description": "DUMMY",
"marketDataType": "Depth",
"options": [
{
"type": "Depth",
"description": "Depth",
"currency": "USD"
},
{
"type": "Delayed",
"description": "Delayed",
"currency": "USD"
}
],
"hasExecutingAccount": true
}
],
"totalCount": 1
},
"eulaSignature": {
"collectedBy": "API",
"eulaVersion": "2",
"signatures": [
{
"documentName": "LegalEULA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalPP",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalMDSA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalUSA",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "LegalNPSCF",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "CMEInformationLicenseAgreement",
"signed": "2025-05-01T10:30:15"
},
{
"documentName": "ICESubscriberAgreement",
"signed": "2025-05-01T10:30:15"
}
]
}
},
"metadata": {
"timestamp": "2025-05-15T21:58:44.5038392Z",
"requestId": "0HNCJVEI883I0:00000001"
}
},
"formatters": [],
"contentTypes": [],
"statusCode": 200
}
}
===== Optional Components =====
The onboarding endpoint provides flexibility by making certain components optional:
* **MarketData**: If omitted, the user will not have market data access until configured separately.
* **Eula**: If omitted, the user will be required to accept EULAs on first login.
Integrators should discuss their specific requirements with T4.APISupport@plus500.com to determine which components are necessary for their implementation.
===== Template Based Provisioning =====
The onboarding process relies on template users and accounts to streamline configuration:
* User properties are derived from the firm's default user template
* Account properties are derived from the specified template account
* Both templates can be overridden using the ''templateUser'' and ''templateAccount'' parameters
Properly configuring firm defaults and templates will significantly reduce the amount of customization needed for each new user.
===== Implementation Notes =====
==== User Login Requirements ====
For a user to successfully log in after onboarding, the following must be complete:
* User account created with valid credentials
* Trading account created and linked to the user
* EULAs accepted (either through the API or on first login)
==== Market Data Billing ====
Market data subscriptions configured during onboarding will be billed according to the selected options. Consider the following when implementing:
* Market data options vary by exchange
* Each option has associated fees and currencies
* The ''apptype'' field in the User object affects available market data options
===== Error Handling =====
The API returns standard HTTP status codes along with detailed error information:
* 200: Operation successful
* 400: Bad request (invalid parameters)
* 401: Unauthorized (authentication failure)
* 404: Resource not found
* 409: Conflict (e.g., username already exists)
* 500: Server error
* 503: Server busy (retry the request)
Detailed error messages are provided in the response body to assist with troubleshooting.
===== Support =====
For questions, issues, or assistance with the Onboarding API, please contact:
* Email: T4.APISupport@plus500.com