Docs · Reference
API reference
Auto-generated from the live OpenAPI document. Snippets shown for curl, fetch (browser), httpx (Python), curl_setopt (PHP), and net/http (Go).
For interactive exploration, use the Swagger UI at https://api.lumirecrm.com/docs.
468 operations across 56 tags.
accounts
GET/v1/accountsList trading accounts (cursor-paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/accounts'
JavaScript
await fetch('http://localhost:4000/v1/accounts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/accounts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/accounts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/accountsCreate / link a trading account for a trader.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "platform": "mt5", "externalId": "string", "accountNumber": "string", "currency": "string", "balance": "string", "equity": "string", "leverage": 0, "isDemo": false, "metadata": {} }' 'http://localhost:4000/v1/accounts'JavaScript
await fetch('http://localhost:4000/v1/accounts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/accounts', json={
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/accounts", bytes.NewReader([]byte(`{
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/accounts/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/accounts/{id}'JavaScript
await fetch('http://localhost:4000/v1/accounts/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/accounts/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/accounts/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/accounts/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/accounts/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/accounts/{id}'JavaScript
await fetch('http://localhost:4000/v1/accounts/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/accounts/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/accounts/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/accounts/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/accounts/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "platform": "mt5", "externalId": "string", "accountNumber": "string", "currency": "string", "balance": "string", "equity": "string", "leverage": 0, "isDemo": false, "metadata": {}, "status": "active" }' 'http://localhost:4000/v1/accounts/{id}'JavaScript
await fetch('http://localhost:4000/v1/accounts/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {},
"status": "active"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/accounts/{id}', json={
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {},
"status": "active"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/accounts/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {},
"status": "active"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/accounts/{id}", bytes.NewReader([]byte(`{
"traderId": "string",
"platform": "mt5",
"externalId": "string",
"accountNumber": "string",
"currency": "string",
"balance": "string",
"equity": "string",
"leverage": 0,
"isDemo": false,
"metadata": {},
"status": "active"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()admin
GET/v1/admin/activityAdmin activity dashboard (A7): per-user action counts last 7 days.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/activity'
JavaScript
await fetch('http://localhost:4000/v1/admin/activity', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/activity')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/activity');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/activity", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/deposits/{id}/partial-settleM3: settle a deposit for a smaller amount (bank wire came in short). Writes a partial-settlement note into provider_payload.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/deposits/{id}/partial-settle'JavaScript
await fetch('http://localhost:4000/v1/admin/deposits/{id}/partial-settle', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/deposits/{id}/partial-settle')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/deposits/{id}/partial-settle');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/deposits/{id}/partial-settle", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/fx-ratesM1: current FX rates cached in fx_rates table.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/fx-rates'
JavaScript
await fetch('http://localhost:4000/v1/admin/fx-rates', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/fx-rates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/fx-rates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/fx-rates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/fx-ratesM1: set/overwrite an FX rate (admin manual input). Writes to the global pool (tenant_id IS NULL) using the partial unique fx_rates_global_base_quote_uq added in Wave 8 (multi-currency). Equivalent to POST /v1/fx/rates/upsert {rates:[...], global:true}.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/fx-rates'
JavaScript
await fetch('http://localhost:4000/v1/admin/fx-rates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/fx-rates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/fx-rates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/fx-rates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/impersonate/{id}/end
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/impersonate/{id}/end'JavaScript
await fetch('http://localhost:4000/v1/admin/impersonate/{id}/end', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/impersonate/{id}/end')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/impersonate/{id}/end');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/impersonate/{id}/end", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/impersonate/startA4: owner starts a "view as trader" session. Returns a short-lived token scoped to the target trader.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/impersonate/start'
JavaScript
await fetch('http://localhost:4000/v1/admin/impersonate/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/impersonate/start')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/impersonate/start');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/impersonate/start", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/notifications/summaryAction queues summary for the topbar bell + sidebar badges (pending KYC, open sanctions, deposits/withdrawals awaiting approval, open tickets).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/notifications/summary'
JavaScript
await fetch('http://localhost:4000/v1/admin/notifications/summary', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/notifications/summary')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/notifications/summary');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/notifications/summary", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/position-heatmapPosition heatmap (A12) — aggregated open volume per symbol across all traders.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/position-heatmap'
JavaScript
await fetch('http://localhost:4000/v1/admin/position-heatmap', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/position-heatmap')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/position-heatmap');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/position-heatmap", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/reporting/cohortsRegistration-month cohort analysis (R2): retention via first-deposit.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/reporting/cohorts'
JavaScript
await fetch('http://localhost:4000/v1/admin/reporting/cohorts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/reporting/cohorts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/reporting/cohorts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/reporting/cohorts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/reporting/revenue-breakdownCommission revenue split by source type (R6).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/reporting/revenue-breakdown'
JavaScript
await fetch('http://localhost:4000/v1/admin/reporting/revenue-breakdown', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/reporting/revenue-breakdown')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/reporting/revenue-breakdown');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/reporting/revenue-breakdown", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/reports/sqlR4: read-only SQL sandbox (owner-only). Wrapped in a Postgres READ ONLY transaction with 30s statement_timeout so even comment-smuggled writes are rejected at the DB layer. Results capped at 10k rows; query also passes a coarse keyword guard for clearer errors before the DB sees it.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/reports/sql'
JavaScript
await fetch('http://localhost:4000/v1/admin/reports/sql', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/reports/sql')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/reports/sql');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/reports/sql", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/sla/overdueSupport tickets past their SLA deadline (A11).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/sla/overdue'
JavaScript
await fetch('http://localhost:4000/v1/admin/sla/overdue', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/sla/overdue')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/sla/overdue');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/sla/overdue", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/tax-reportM6: tax report stub — aggregate deposits/withdrawals per trader over a window for 1099/DAC7-style exports.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/tax-report'
JavaScript
await fetch('http://localhost:4000/v1/admin/tax-report', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/tax-report')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/tax-report');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/tax-report", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/traders/{id}/pii-exportG2: owner-initiated PII bundle export for a trader (GDPR Article 15).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/{id}/pii-export'JavaScript
await fetch('http://localhost:4000/v1/admin/traders/{id}/pii-export', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/traders/{id}/pii-export')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/{id}/pii-export');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/traders/{id}/pii-export", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/traders/bulk-editBulk-edit traders (A3). Apply segment/assignment/risk changes to up to 500 ids.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/bulk-edit'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/bulk-edit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/traders/bulk-edit')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/bulk-edit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/traders/bulk-edit", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/traders/mergeA2: merge duplicate traders. Moves accounts/deposits/withdrawals/tickets from secondary into primary, soft-deletes secondary.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/merge'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/merge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/traders/merge')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/merge');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/traders/merge", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/audit
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/audit'
JavaScript
await fetch('http://localhost:4000/v1/audit', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/audit')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/audit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/audit", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/audit/export.csv
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/audit/export.csv'
JavaScript
await fetch('http://localhost:4000/v1/audit/export.csv', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/audit/export.csv')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/audit/export.csv');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/audit/export.csv", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/audit/facets
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/audit/facets'
JavaScript
await fetch('http://localhost:4000/v1/audit/facets', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/audit/facets')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/audit/facets');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/audit/facets", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/tenants/current
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tenants/current'
JavaScript
await fetch('http://localhost:4000/v1/tenants/current', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/tenants/current')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/tenants/current');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/tenants/current", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/tenants/current
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "branding": {}, "featureFlags": {} }' 'http://localhost:4000/v1/tenants/current'JavaScript
await fetch('http://localhost:4000/v1/tenants/current', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"branding": {},
"featureFlags": {}
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/tenants/current', json={
"name": "string",
"branding": {},
"featureFlags": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/tenants/current');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"branding": {},
"featureFlags": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/tenants/current", bytes.NewReader([]byte(`{
"name": "string",
"branding": {},
"featureFlags": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/tenants/current/logo-confirm
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tenants/current/logo-confirm'
JavaScript
await fetch('http://localhost:4000/v1/tenants/current/logo-confirm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/tenants/current/logo-confirm')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/tenants/current/logo-confirm');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/tenants/current/logo-confirm", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/tenants/current/logo-upload
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "contentType": "string", "fileSize": 0 }' 'http://localhost:4000/v1/tenants/current/logo-upload'JavaScript
await fetch('http://localhost:4000/v1/tenants/current/logo-upload', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"contentType": "string",
"fileSize": 0
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/tenants/current/logo-upload', json={
"contentType": "string",
"fileSize": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/tenants/current/logo-upload');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"contentType": "string",
"fileSize": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/tenants/current/logo-upload", bytes.NewReader([]byte(`{
"contentType": "string",
"fileSize": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/users
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/users'
JavaScript
await fetch('http://localhost:4000/v1/users', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/users')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/users", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/users/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/users/{id}'JavaScript
await fetch('http://localhost:4000/v1/users/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/users/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/users/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/users/{id}/impersonate
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/users/{id}/impersonate'JavaScript
await fetch('http://localhost:4000/v1/users/{id}/impersonate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/users/{id}/impersonate')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/{id}/impersonate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/users/{id}/impersonate", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/users/{id}/roles
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{}' 'http://localhost:4000/v1/users/{id}/roles'JavaScript
await fetch('http://localhost:4000/v1/users/{id}/roles', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/users/{id}/roles', json={})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/{id}/roles');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/users/{id}/roles", bytes.NewReader([]byte(`{}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/users/invite
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "displayName": "string", "roles": [], "password": "string", "sendInviteLink": true }' 'http://localhost:4000/v1/users/invite'JavaScript
await fetch('http://localhost:4000/v1/users/invite', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"displayName": "string",
"roles": [],
"password": "string",
"sendInviteLink": true
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/users/invite', json={
"email": "user@example.com",
"displayName": "string",
"roles": [],
"password": "string",
"sendInviteLink": true
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/invite');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"displayName": "string",
"roles": [],
"password": "string",
"sendInviteLink": true
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/users/invite", bytes.NewReader([]byte(`{
"email": "user@example.com",
"displayName": "string",
"roles": [],
"password": "string",
"sendInviteLink": true
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()admin-traders
GET/v1/admin/traders/{id}/fullEnriched trader detail: trader + accounts + deposits + withdrawals + KYC docs + audit.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/{id}/full'JavaScript
await fetch('http://localhost:4000/v1/admin/traders/{id}/full', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/traders/{id}/full')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/{id}/full');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/traders/{id}/full", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/traders/bulk-approve-kycApprove KYC for multiple traders at once.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/bulk-approve-kyc'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/bulk-approve-kyc', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/traders/bulk-approve-kyc')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/bulk-approve-kyc');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/traders/bulk-approve-kyc", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/traders/bulk-reject-kycReject KYC for multiple traders at once.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/bulk-reject-kyc'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/bulk-reject-kyc', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/traders/bulk-reject-kyc')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/bulk-reject-kyc');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/traders/bulk-reject-kyc", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/traders/bulk-segmentsAdd/remove segments across multiple traders.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/bulk-segments'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/bulk-segments', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/traders/bulk-segments')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/bulk-segments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/traders/bulk-segments", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/traders/statsTenant-wide trader stats for the list-page header.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/traders/stats'
JavaScript
await fetch('http://localhost:4000/v1/admin/traders/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/traders/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/traders/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/traders/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()affiliates
GET/v1/affiliates
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates'
JavaScript
await fetch('http://localhost:4000/v1/affiliates', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "code": "string", "parentId": "string" }' 'http://localhost:4000/v1/affiliates'JavaScript
await fetch('http://localhost:4000/v1/affiliates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"code": "string",
"parentId": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates', json={
"traderId": "string",
"code": "string",
"parentId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"code": "string",
"parentId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates", bytes.NewReader([]byte(`{
"traderId": "string",
"code": "string",
"parentId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates/clicks/trackAffiliate click-tracking pixel (I7). Public endpoint, no auth.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/clicks/track'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/clicks/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates/clicks/track')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/clicks/track');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates/clicks/track", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/commissions
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/commissions'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/commissions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/commissions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/commissions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/commissions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/commissions/by-symbolCommission breakdown by symbol (I5) — derived from source trades metadata.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/commissions/by-symbol'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/commissions/by-symbol', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/commissions/by-symbol')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/commissions/by-symbol');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/commissions/by-symbol", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/funnelRegistration → KYC → first-deposit funnel over last 90 days (I6/R1).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/funnel'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/funnel', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/funnel')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/funnel');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/funnel", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/payoutsList payout requests for this tenant (I3).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/payouts'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/payouts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/payouts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/payouts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/payouts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates/payoutsIB requests a commission payout (I3).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/payouts'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/payouts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates/payouts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/payouts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates/payouts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates/payouts/{id}/approve
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/payouts/{id}/approve'JavaScript
await fetch('http://localhost:4000/v1/affiliates/payouts/{id}/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates/payouts/{id}/approve')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/payouts/{id}/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates/payouts/{id}/approve", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates/payouts/{id}/paid
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/payouts/{id}/paid'JavaScript
await fetch('http://localhost:4000/v1/affiliates/payouts/{id}/paid', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates/payouts/{id}/paid')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/payouts/{id}/paid');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates/payouts/{id}/paid", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/rules
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/rules'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/rules', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/rules')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/rules", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/affiliates/rules
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "affiliateId": "string", "kind": "per_deposit", "depth": 0, "amount": "string", "percent": false, "currency": "string", "isActive": false }' 'http://localhost:4000/v1/affiliates/rules'JavaScript
await fetch('http://localhost:4000/v1/affiliates/rules', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"affiliateId": "string",
"kind": "per_deposit",
"depth": 0,
"amount": "string",
"percent": false,
"currency": "string",
"isActive": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/affiliates/rules', json={
"affiliateId": "string",
"kind": "per_deposit",
"depth": 0,
"amount": "string",
"percent": false,
"currency": "string",
"isActive": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"affiliateId": "string",
"kind": "per_deposit",
"depth": 0,
"amount": "string",
"percent": false,
"currency": "string",
"isActive": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/affiliates/rules", bytes.NewReader([]byte(`{
"affiliateId": "string",
"kind": "per_deposit",
"depth": 0,
"amount": "string",
"percent": false,
"currency": "string",
"isActive": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/affiliates/rules/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/affiliates/rules/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/affiliates/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/affiliates/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/affiliates/rules/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/affiliates/rules/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/affiliates/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/affiliates/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/treeSub-affiliate tree from the current session user's primary affiliate (I2).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/tree'
JavaScript
await fetch('http://localhost:4000/v1/affiliates/tree', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/tree')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/tree');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/tree", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/affiliates/tree/{rootId}Return the subtree rooted at rootId (ULID).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/affiliates/tree/{rootId}'JavaScript
await fetch('http://localhost:4000/v1/affiliates/tree/{rootId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/affiliates/tree/{rootId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/affiliates/tree/{rootId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/affiliates/tree/{rootId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()ai
GET/v1/ai/briefingAI-narrated executive briefing for the current operator — what to pay attention to right now.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/briefing'
JavaScript
await fetch('http://localhost:4000/v1/ai/briefing', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ai/briefing')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/briefing');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ai/briefing", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/chatConversational AI. Persists messages, supports tool-calling (lookup_trader, lookup_deposit, ...), streams via SSE when ?stream=true.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/chat'
JavaScript
await fetch('http://localhost:4000/v1/ai/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/chat')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/chat');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/chat", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/classify-intentClassify a support-ticket message into one of the 11 intent buckets.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/classify-intent'
JavaScript
await fetch('http://localhost:4000/v1/ai/classify-intent', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/classify-intent')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/classify-intent');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/classify-intent", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ai/conversationsList the calling user's recent AI conversations (last 50).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/conversations'
JavaScript
await fetch('http://localhost:4000/v1/ai/conversations', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ai/conversations')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/conversations');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ai/conversations", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ai/conversations/{id}Load a full conversation with messages.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/conversations/{id}'JavaScript
await fetch('http://localhost:4000/v1/ai/conversations/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ai/conversations/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/conversations/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ai/conversations/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/draft-replyDraft a polite operator reply to a support ticket.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/draft-reply'
JavaScript
await fetch('http://localhost:4000/v1/ai/draft-reply', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/draft-reply')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/draft-reply');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/draft-reply", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/embed-backfillBackfill embeddings for an entity type (admin-triggered). Idempotent.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/embed-backfill'
JavaScript
await fetch('http://localhost:4000/v1/ai/embed-backfill', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/embed-backfill')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/embed-backfill');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/embed-backfill", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/fraud-explainExplain why a deposit was flagged + recommend an action.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/fraud-explain'
JavaScript
await fetch('http://localhost:4000/v1/ai/fraud-explain', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/fraud-explain')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/fraud-explain');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/fraud-explain", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ai/healthLiveness check for the local AI runtime.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/health'
JavaScript
await fetch('http://localhost:4000/v1/ai/health', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ai/health')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/health');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ai/health", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/ib-chatIB-scoped AI chat. Same session auth as /chat, but audience=ib and tools are restricted to the caller's own affiliate record.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/ib-chat'
JavaScript
await fetch('http://localhost:4000/v1/ai/ib-chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/ib-chat')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/ib-chat');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/ib-chat", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ai/kbList all KB entries for the caller's tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/kb'
JavaScript
await fetch('http://localhost:4000/v1/ai/kb', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ai/kb')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ai/kb", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/kbCreate a new KB entry. id must be lowercase-alphanumeric + hyphens; embedded on insert.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "title": "string", "body": "string" }' 'http://localhost:4000/v1/ai/kb'JavaScript
await fetch('http://localhost:4000/v1/ai/kb', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"title": "string",
"body": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/kb', json={
"id": "string",
"title": "string",
"body": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"title": "string",
"body": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/kb", bytes.NewReader([]byte(`{
"id": "string",
"title": "string",
"body": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/ai/kb/{id}Delete a KB entry.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/kb/{id}'JavaScript
await fetch('http://localhost:4000/v1/ai/kb/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/ai/kb/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/ai/kb/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/ai/kb/{id}Update title and/or body. Re-embeds if either changes.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "title": "string", "body": "string" }' 'http://localhost:4000/v1/ai/kb/{id}'JavaScript
await fetch('http://localhost:4000/v1/ai/kb/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"title": "string",
"body": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/ai/kb/{id}', json={
"title": "string",
"body": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"title": "string",
"body": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/ai/kb/{id}", bytes.NewReader([]byte(`{
"title": "string",
"body": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/kb/seedSeed the default broker FAQ knowledge base for the caller's tenant. Idempotent — re-running updates existing entries.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/kb/seed'
JavaScript
await fetch('http://localhost:4000/v1/ai/kb/seed', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/kb/seed')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb/seed');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/kb/seed", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/kb/seed-defaultsSeed/refresh the default 15 broker FAQ entries. Idempotent — existing entries are updated.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/kb/seed-defaults'
JavaScript
await fetch('http://localhost:4000/v1/ai/kb/seed-defaults', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/kb/seed-defaults')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kb/seed-defaults');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/kb/seed-defaults", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/kyc-summaryAI-generated 2-sentence KYC reviewer summary from a doc analysis result.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/kyc-summary'
JavaScript
await fetch('http://localhost:4000/v1/ai/kyc-summary', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/kyc-summary')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/kyc-summary');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/kyc-summary", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/sales-coachRecommend the best next sales action for a trader.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/sales-coach'
JavaScript
await fetch('http://localhost:4000/v1/ai/sales-coach', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/sales-coach')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/sales-coach');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/sales-coach", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/ai/semantic-searchSemantic search across traders, tickets, KYC, deposits, leads.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ai/semantic-search'
JavaScript
await fetch('http://localhost:4000/v1/ai/semantic-search', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/ai/semantic-search')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ai/semantic-search');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/ai/semantic-search", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()api-keys
GET/v1/api-keys
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/api-keys'
JavaScript
await fetch('http://localhost:4000/v1/api-keys', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/api-keys')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/api-keys');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/api-keys", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/api-keys
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "scopes": [], "expiresAt": "2026-05-23T12:18:22.177Z" }' 'http://localhost:4000/v1/api-keys'JavaScript
await fetch('http://localhost:4000/v1/api-keys', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"scopes": [],
"expiresAt": "2026-05-23T12:18:22.177Z"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/api-keys', json={
"name": "string",
"scopes": [],
"expiresAt": "2026-05-23T12:18:22.177Z"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/api-keys');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"scopes": [],
"expiresAt": "2026-05-23T12:18:22.177Z"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/api-keys", bytes.NewReader([]byte(`{
"name": "string",
"scopes": [],
"expiresAt": "2026-05-23T12:18:22.177Z"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/api-keys/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/api-keys/{id}'JavaScript
await fetch('http://localhost:4000/v1/api-keys/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/api-keys/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/api-keys/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/api-keys/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/api-keys/{id}/revoke
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/api-keys/{id}/revoke'JavaScript
await fetch('http://localhost:4000/v1/api-keys/{id}/revoke', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/api-keys/{id}/revoke')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/api-keys/{id}/revoke');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/api-keys/{id}/revoke", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/api-keys/{id}/rotate
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/api-keys/{id}/rotate'JavaScript
await fetch('http://localhost:4000/v1/api-keys/{id}/rotate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/api-keys/{id}/rotate')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/api-keys/{id}/rotate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/api-keys/{id}/rotate", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()billing
POST/v1/billing/checkoutCreate a Stripe Checkout session for the chosen plan.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "plan": "string", "return_url": "https://example.com" }' 'http://localhost:4000/v1/billing/checkout'JavaScript
await fetch('http://localhost:4000/v1/billing/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"plan": "string",
"return_url": "https://example.com"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/billing/checkout', json={
"plan": "string",
"return_url": "https://example.com"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/billing/checkout');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"plan": "string",
"return_url": "https://example.com"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/billing/checkout", bytes.NewReader([]byte(`{
"plan": "string",
"return_url": "https://example.com"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/billing/current
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/billing/current'
JavaScript
await fetch('http://localhost:4000/v1/billing/current', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/billing/current')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/billing/current');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/billing/current", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/billing/plansPublic list of self-serve subscription plans.
curl
curl -X GET 'http://localhost:4000/v1/billing/plans'
JavaScript
await fetch('http://localhost:4000/v1/billing/plans', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/billing/plans')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/billing/plans');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/billing/plans", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/billing/portalOpen the Stripe billing portal for self-serve plan + invoice management.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "return_url": "https://example.com" }' 'http://localhost:4000/v1/billing/portal'JavaScript
await fetch('http://localhost:4000/v1/billing/portal', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"return_url": "https://example.com"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/billing/portal', json={
"return_url": "https://example.com"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/billing/portal');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"return_url": "https://example.com"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/billing/portal", bytes.NewReader([]byte(`{
"return_url": "https://example.com"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/billing/webhookStripe Billing webhook receiver (signature-verified). Handles subscription + invoice events.
curl
curl -X POST 'http://localhost:4000/v1/billing/webhook'
JavaScript
await fetch('http://localhost:4000/v1/billing/webhook', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/billing/webhook')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/billing/webhook');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/billing/webhook", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()bonuses
GET/v1/bonuses
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses'
JavaScript
await fetch('http://localhost:4000/v1/bonuses', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/bonuses')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/bonuses", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/bonuses
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses'
JavaScript
await fetch('http://localhost:4000/v1/bonuses', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/bonuses')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/bonuses", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/bonuses/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/{id}'JavaScript
await fetch('http://localhost:4000/v1/bonuses/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/bonuses/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/bonuses/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/bonuses/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/{id}'JavaScript
await fetch('http://localhost:4000/v1/bonuses/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/bonuses/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/bonuses/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/bonuses/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/{id}'JavaScript
await fetch('http://localhost:4000/v1/bonuses/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/bonuses/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/bonuses/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/bonuses/issuance-logList auto-issued bonus credit-line entries (paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/issuance-log'
JavaScript
await fetch('http://localhost:4000/v1/bonuses/issuance-log', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/bonuses/issuance-log')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/issuance-log');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/bonuses/issuance-log", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/bonuses/replay/{depositId}Re-evaluate every eligible bonus rule against an existing settled deposit. Idempotent — duplicate grants are detected and skipped.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/replay/{depositId}'JavaScript
await fetch('http://localhost:4000/v1/bonuses/replay/{depositId}', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/bonuses/replay/{depositId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/replay/{depositId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/bonuses/replay/{depositId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/bonuses/stats
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/bonuses/stats'
JavaScript
await fetch('http://localhost:4000/v1/bonuses/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/bonuses/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/bonuses/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/bonuses/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()campaigns
GET/v1/campaigns
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns'
JavaScript
await fetch('http://localhost:4000/v1/campaigns', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/campaigns')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/campaigns", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/campaigns
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "slug": "string", "name": "string", "enrollmentRule": {}, "steps": [] }' 'http://localhost:4000/v1/campaigns'JavaScript
await fetch('http://localhost:4000/v1/campaigns', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"slug": "string",
"name": "string",
"enrollmentRule": {},
"steps": []
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/campaigns', json={
"slug": "string",
"name": "string",
"enrollmentRule": {},
"steps": []
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"slug": "string",
"name": "string",
"enrollmentRule": {},
"steps": []
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/campaigns", bytes.NewReader([]byte(`{
"slug": "string",
"name": "string",
"enrollmentRule": {},
"steps": []
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/campaigns/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns/{id}'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/campaigns/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/campaigns/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/campaigns/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "status": "draft", "enrollmentRule": {} }' 'http://localhost:4000/v1/campaigns/{id}'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"status": "draft",
"enrollmentRule": {}
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/campaigns/{id}', json={
"name": "string",
"status": "draft",
"enrollmentRule": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"status": "draft",
"enrollmentRule": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/campaigns/{id}", bytes.NewReader([]byte(`{
"name": "string",
"status": "draft",
"enrollmentRule": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/campaigns/{id}/enrollments
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns/{id}/enrollments'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}/enrollments', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/campaigns/{id}/enrollments')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}/enrollments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/campaigns/{id}/enrollments", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/campaigns/{id}/steps
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns/{id}/steps'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}/steps', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/campaigns/{id}/steps')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}/steps');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/campaigns/{id}/steps", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/campaigns/{id}/steps
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "position": 0, "kind": "email", "delayHours": 0, "payload": {} }' 'http://localhost:4000/v1/campaigns/{id}/steps'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}/steps', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"position": 0,
"kind": "email",
"delayHours": 0,
"payload": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/campaigns/{id}/steps', json={
"position": 0,
"kind": "email",
"delayHours": 0,
"payload": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}/steps');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"position": 0,
"kind": "email",
"delayHours": 0,
"payload": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/campaigns/{id}/steps", bytes.NewReader([]byte(`{
"position": 0,
"kind": "email",
"delayHours": 0,
"payload": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PUT/v1/campaigns/{id}/steps
curl
curl -X PUT --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns/{id}/steps'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}/steps', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.put('http://localhost:4000/v1/campaigns/{id}/steps')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}/steps');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PUT", "http://localhost:4000/v1/campaigns/{id}/steps", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/campaigns/{id}/steps/{stepId}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/campaigns/{id}/steps/{stepId}'JavaScript
await fetch('http://localhost:4000/v1/campaigns/{id}/steps/{stepId}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/campaigns/{id}/steps/{stepId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/campaigns/{id}/steps/{stepId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/campaigns/{id}/steps/{stepId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()communications
POST/v1/communications/blastBulk send — accepts emails[] and optional scheduledAt. Sends now or at the scheduled time.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/blast'
JavaScript
await fetch('http://localhost:4000/v1/communications/blast', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/communications/blast')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/blast');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/communications/blast", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/communications/dispatch-queuedAdmin-only: force-dispatch every queued CommunicationSend for the current tenant. Useful after swapping MAIL_HOST / RESEND_API_KEY / TWILIO_* credentials.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/dispatch-queued'
JavaScript
await fetch('http://localhost:4000/v1/communications/dispatch-queued', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/communications/dispatch-queued')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/dispatch-queued');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/communications/dispatch-queued", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/communications/sendQueue a message to send (template or ad-hoc).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "templateSlug": "string", "channel": "email", "to": "string", "subject": "string", "body": "string", "variables": {} }' 'http://localhost:4000/v1/communications/send'JavaScript
await fetch('http://localhost:4000/v1/communications/send', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"templateSlug": "string",
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"variables": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/communications/send', json={
"traderId": "string",
"templateSlug": "string",
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"variables": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/send');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"templateSlug": "string",
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"variables": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/communications/send", bytes.NewReader([]byte(`{
"traderId": "string",
"templateSlug": "string",
"channel": "email",
"to": "string",
"subject": "string",
"body": "string",
"variables": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/communications/sends
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/sends'
JavaScript
await fetch('http://localhost:4000/v1/communications/sends', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/communications/sends')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/sends');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/communications/sends", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/communications/sends/{id}/cancel-scheduledCancel a scheduled blast before it fires.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/sends/{id}/cancel-scheduled'JavaScript
await fetch('http://localhost:4000/v1/communications/sends/{id}/cancel-scheduled', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/communications/sends/{id}/cancel-scheduled')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/sends/{id}/cancel-scheduled');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/communications/sends/{id}/cancel-scheduled", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/communications/templatesList communication templates.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/templates'
JavaScript
await fetch('http://localhost:4000/v1/communications/templates', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/communications/templates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/templates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/communications/templates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/communications/templates
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "account_size_usd": "string", "entry_fee_usd": "string", "max_total_drawdown_pct": "string", "max_daily_drawdown_pct": "string", "profit_target_pct": "string", "min_trading_days": 0, "max_evaluation_days": 0, "stages_json": [ { "name": "string", "profit_target_pct": 0, "max_dd_pct": 0, "days_min": 0 } ], "profit_split_pct": "string", "is_archived": false }' 'http://localhost:4000/v1/communications/templates'JavaScript
await fetch('http://localhost:4000/v1/communications/templates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/communications/templates', json={
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/templates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/communications/templates", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/communications/templates/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/communications/templates/{id}'JavaScript
await fetch('http://localhost:4000/v1/communications/templates/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/communications/templates/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/templates/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/communications/templates/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/communications/templates/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "account_size_usd": "string", "entry_fee_usd": "string", "max_total_drawdown_pct": "string", "max_daily_drawdown_pct": "string", "profit_target_pct": "string", "min_trading_days": 0, "max_evaluation_days": 0, "stages_json": [ { "name": "string", "profit_target_pct": 0, "max_dd_pct": 0, "days_min": 0 } ], "profit_split_pct": "string", "is_archived": false }' 'http://localhost:4000/v1/communications/templates/{id}'JavaScript
await fetch('http://localhost:4000/v1/communications/templates/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/communications/templates/{id}', json={
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/communications/templates/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/communications/templates/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()compliance
GET/v1/compliance/anomaliesList withdrawal-anomaly flags. Filterable by severity/resolution/date range.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/anomalies'
JavaScript
await fetch('http://localhost:4000/v1/compliance/anomalies', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/anomalies')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/anomalies');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/anomalies", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/compliance/anomalies/{id}Resolve an anomaly flag — clear/flag/escalate with optional notes.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "resolution": "pending", "notes": "string" }' 'http://localhost:4000/v1/compliance/anomalies/{id}'JavaScript
await fetch('http://localhost:4000/v1/compliance/anomalies/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"resolution": "pending",
"notes": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/compliance/anomalies/{id}', json={
"resolution": "pending",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/anomalies/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"resolution": "pending",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/compliance/anomalies/{id}", bytes.NewReader([]byte(`{
"resolution": "pending",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/compliance/anomalies/scanRun the rule set against withdrawals from the last 30 days. Each rule's INSERT … ON CONFLICT DO NOTHING via the unique (tenant_id, withdrawal_id, rule_id) index, so re-running is idempotent.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "threshold_usd": 0 }' 'http://localhost:4000/v1/compliance/anomalies/scan'JavaScript
await fetch('http://localhost:4000/v1/compliance/anomalies/scan', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"threshold_usd": 0
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/compliance/anomalies/scan', json={
"threshold_usd": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/anomalies/scan');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"threshold_usd": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/compliance/anomalies/scan", bytes.NewReader([]byte(`{
"threshold_usd": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/compliance/runsList previous compliance report runs (audit trail of report generation).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/runs'
JavaScript
await fetch('http://localhost:4000/v1/compliance/runs', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/runs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/runs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/runs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/compliance/tax-statementsList per-trader annual P&L tax statements for a calendar year. Returns one row per customer; customers without a linked trader are still listed with zeroes. Gross P&L is the sum of positions.profit for positions closed within the year on accounts owned by the linked trader.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/tax-statements'
JavaScript
await fetch('http://localhost:4000/v1/compliance/tax-statements', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/tax-statements')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/tax-statements');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/tax-statements", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/compliance/tax-statements/{customerId}/{year}Full annual P&L breakdown for one customer with monthly rollup.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}'JavaScript
await fetch('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/compliance/tax-statements/{customerId}/{year}/export.csvCSV export of a single trader's monthly tax-statement breakdown.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}/export.csv'JavaScript
await fetch('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}/export.csv', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}/export.csv')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}/export.csv');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/tax-statements/{customerId}/{year}/export.csv", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/compliance/transactions/exportStream MiFID-II-style transaction report as CSV. Sources from closed Positions (Position is the source of truth for trade fields; Transaction has amount/currency only). Commission is best-effort joined from transactions table where kind=commission within ±60s of close.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/compliance/transactions/export'
JavaScript
await fetch('http://localhost:4000/v1/compliance/transactions/export', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/compliance/transactions/export')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/compliance/transactions/export');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/compliance/transactions/export", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()credit-lines
GET/v1/credit-linesList credit lines (tenant-scoped, paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines'
JavaScript
await fetch('http://localhost:4000/v1/credit-lines', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/credit-lines')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/credit-lines", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/credit-lines
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines'
JavaScript
await fetch('http://localhost:4000/v1/credit-lines', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/credit-lines')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/credit-lines", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/credit-lines/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines/{id}'JavaScript
await fetch('http://localhost:4000/v1/credit-lines/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/credit-lines/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/credit-lines/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/credit-lines/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines/{id}'JavaScript
await fetch('http://localhost:4000/v1/credit-lines/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/credit-lines/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/credit-lines/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/credit-lines/{id}/entries
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines/{id}/entries'JavaScript
await fetch('http://localhost:4000/v1/credit-lines/{id}/entries', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/credit-lines/{id}/entries')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines/{id}/entries');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/credit-lines/{id}/entries", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/credit-lines/{id}/grant
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines/{id}/grant'JavaScript
await fetch('http://localhost:4000/v1/credit-lines/{id}/grant', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/credit-lines/{id}/grant')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines/{id}/grant');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/credit-lines/{id}/grant", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/credit-lines/{id}/revoke
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/credit-lines/{id}/revoke'JavaScript
await fetch('http://localhost:4000/v1/credit-lines/{id}/revoke', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/credit-lines/{id}/revoke')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/credit-lines/{id}/revoke');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/credit-lines/{id}/revoke", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()crypto
GET/v1/broker/wallet/activityLatest events (deposit lifecycle + sweeps + sends) for the feed.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/activity'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/activity', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/broker/wallet/activity')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/activity');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/broker/wallet/activity", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/broker/wallet/balancesLive balances (USDT + native) for every hardwallet of the calling tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/balances'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/balances', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/broker/wallet/balances')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/balances');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/broker/wallet/balances", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/broker/wallet/depositsPaginated deposits list with filters (status, chain, client_email).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/deposits'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/deposits', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/broker/wallet/deposits')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/deposits');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/broker/wallet/deposits", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/broker/wallet/hardwallet/generateGenerate a new destination hardwallet for a chain. Broker can only have one per chain.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/hardwallet/generate'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/hardwallet/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/broker/wallet/hardwallet/generate')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/hardwallet/generate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/broker/wallet/hardwallet/generate", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/broker/wallet/sendSend USDT from the tenant's destination hardwallet to an address. Requires a valid OTP.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/send'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/send', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/broker/wallet/send')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/send');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/broker/wallet/send", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/broker/wallet/send/request-otpRequest a 6-digit OTP to authorise an outgoing USDT transfer. 10-min TTL.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/send/request-otp'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/send/request-otp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/broker/wallet/send/request-otp')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/send/request-otp');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/broker/wallet/send/request-otp", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/broker/wallet/settingsReturn wallet config + hardwallet addresses for the calling tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/settings'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/settings', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/broker/wallet/settings')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/settings');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/broker/wallet/settings", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/broker/wallet/settingsUpsert wallet config. Sets mode and optionally own-wallet addresses.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/settings'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/settings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/broker/wallet/settings')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/settings');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/broker/wallet/settings", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/broker/wallet/statsDashboard stats: 24h inflow, pending, detection-to-swept median, gas-float runway.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/broker/wallet/stats'
JavaScript
await fetch('http://localhost:4000/v1/broker/wallet/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/broker/wallet/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/broker/wallet/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/broker/wallet/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/crypto/deposit/initiateMint an ephemeral USDT deposit address (BSC or Base). 15-min expiry.
curl
curl -X POST 'http://localhost:4000/v1/crypto/deposit/initiate'
JavaScript
await fetch('http://localhost:4000/v1/crypto/deposit/initiate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/crypto/deposit/initiate')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/crypto/deposit/initiate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/crypto/deposit/initiate", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/crypto/deposit/{id}/statusPoll deposit status. Returns pending / confirmed / expired / swept / below_minimum.
curl
curl -X GET 'http://localhost:4000/v1/public/crypto/deposit/{id}/status'JavaScript
await fetch('http://localhost:4000/v1/public/crypto/deposit/{id}/status', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/crypto/deposit/{id}/status')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/crypto/deposit/{id}/status');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/crypto/deposit/{id}/status", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()customers
GET/v1/customers
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers'
JavaScript
await fetch('http://localhost:4000/v1/customers', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/customers')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/customers", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/customers/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/customers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/customers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/customers/{id}/approve
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}/approve'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/customers/{id}/approve')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/customers/{id}/approve", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/customers/{id}/assign
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}/assign'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}/assign', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/customers/{id}/assign')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}/assign');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/customers/{id}/assign", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/customers/{id}/logins
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}/logins'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}/logins', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/customers/{id}/logins')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}/logins');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/customers/{id}/logins", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/customers/{id}/reject
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}/reject'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}/reject', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/customers/{id}/reject')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}/reject');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/customers/{id}/reject", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/customers/{id}/reply
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{id}/reply'JavaScript
await fetch('http://localhost:4000/v1/customers/{id}/reply', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/customers/{id}/reply')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/{id}/reply');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/customers/{id}/reply", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/customers/messages/all
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/messages/all'
JavaScript
await fetch('http://localhost:4000/v1/customers/messages/all', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/customers/messages/all')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/messages/all');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/customers/messages/all", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/customers/rules
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/rules'
JavaScript
await fetch('http://localhost:4000/v1/customers/rules', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/customers/rules')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/customers/rules", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/customers/rules/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/customers/rules/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/customers/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/customers/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/customers/rules/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/customers/rules/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/customers/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/customers/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/customers/rules/list
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/rules/list'
JavaScript
await fetch('http://localhost:4000/v1/customers/rules/list', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/customers/rules/list')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/customers/rules/list');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/customers/rules/list", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()dashboards
GET/v1/dashboards
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/dashboards'
JavaScript
await fetch('http://localhost:4000/v1/dashboards', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/dashboards')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/dashboards');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/dashboards", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/dashboards
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "slug": "string", "name": "string", "widgets": [], "userId": "string" }' 'http://localhost:4000/v1/dashboards'JavaScript
await fetch('http://localhost:4000/v1/dashboards', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"slug": "string",
"name": "string",
"widgets": [],
"userId": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/dashboards', json={
"slug": "string",
"name": "string",
"widgets": [],
"userId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/dashboards');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"slug": "string",
"name": "string",
"widgets": [],
"userId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/dashboards", bytes.NewReader([]byte(`{
"slug": "string",
"name": "string",
"widgets": [],
"userId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/dashboards/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/dashboards/{id}'JavaScript
await fetch('http://localhost:4000/v1/dashboards/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/dashboards/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/dashboards/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/dashboards/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/dashboards/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/dashboards/{id}'JavaScript
await fetch('http://localhost:4000/v1/dashboards/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/dashboards/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/dashboards/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/dashboards/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/dashboards/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "widgets": [ { "type": "kpi", "title": "string", "colSpan": 4, "savedReportId": "string", "kpiKind": "traders" } ] }' 'http://localhost:4000/v1/dashboards/{id}'JavaScript
await fetch('http://localhost:4000/v1/dashboards/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"widgets": [
{
"type": "kpi",
"title": "string",
"colSpan": 4,
"savedReportId": "string",
"kpiKind": "traders"
}
]
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/dashboards/{id}', json={
"name": "string",
"widgets": [
{
"type": "kpi",
"title": "string",
"colSpan": 4,
"savedReportId": "string",
"kpiKind": "traders"
}
]
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/dashboards/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"widgets": [
{
"type": "kpi",
"title": "string",
"colSpan": 4,
"savedReportId": "string",
"kpiKind": "traders"
}
]
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/dashboards/{id}", bytes.NewReader([]byte(`{
"name": "string",
"widgets": [
{
"type": "kpi",
"title": "string",
"colSpan": 4,
"savedReportId": "string",
"kpiKind": "traders"
}
]
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()docs
GET/v1/docs/examplesAuto-generated curl/JS/Python/PHP/Go snippets per /v1 endpoint.
curl
curl -X GET 'http://localhost:4000/v1/docs/examples'
JavaScript
await fetch('http://localhost:4000/v1/docs/examples', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/docs/examples')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/docs/examples');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/docs/examples", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/docs/examples/{operationId}
curl
curl -X GET 'http://localhost:4000/v1/docs/examples/{operationId}'JavaScript
await fetch('http://localhost:4000/v1/docs/examples/{operationId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/docs/examples/{operationId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/docs/examples/{operationId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/docs/examples/{operationId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()drip-campaigns
POST/v1/drip-campaigns/cron/process-dueProcess up to `limit` (default 200) due enrollments. Production cron should call every 30–60s.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/cron/process-due'
JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/cron/process-due', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/cron/process-due')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/cron/process-due');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/cron/process-due", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/drip-campaigns/enrollmentsList enrollments. Filters: sequence_id, customer_id, status.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/enrollments'
JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/enrollments', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/drip-campaigns/enrollments')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/enrollments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/drip-campaigns/enrollments", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/enrollments/{id}/advanceManually fire the next step for one enrollment (admin tool; cron normally does this).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/enrollments/{id}/advance'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/advance', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/advance')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/advance');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/enrollments/{id}/advance", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/enrollments/{id}/cancelCancel an active enrollment.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "reason": "string" }' 'http://localhost:4000/v1/drip-campaigns/enrollments/{id}/cancel'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/cancel', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/cancel', json={
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/enrollments/{id}/cancel');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/enrollments/{id}/cancel", bytes.NewReader([]byte(`{
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/enrollments/enrollEnroll a customer in a sequence. Idempotent on (sequence_id, customer_id) active.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "sequence_id": "string", "customer_id": "string" }' 'http://localhost:4000/v1/drip-campaigns/enrollments/enroll'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/enrollments/enroll', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"sequence_id": "string",
"customer_id": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/enrollments/enroll', json={
"sequence_id": "string",
"customer_id": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/enrollments/enroll');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"sequence_id": "string",
"customer_id": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/enrollments/enroll", bytes.NewReader([]byte(`{
"sequence_id": "string",
"customer_id": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/drip-campaigns/sequencesList drip sequences for the current tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/sequences'
JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/drip-campaigns/sequences')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/drip-campaigns/sequences", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/sequencesCreate a new drip sequence.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "trigger_event": "signup", "trigger_filter_json": { "country": [ "string" ], "status": [ "string" ], "vip_tier_slug": [ "string" ] }, "is_enabled": false, "max_concurrent_enrollments": 0 }' 'http://localhost:4000/v1/drip-campaigns/sequences'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/sequences', json={
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/sequences", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/drip-campaigns/sequences/{id}Soft-delete (is_enabled=false) a drip sequence.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/sequences/{id}'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/drip-campaigns/sequences/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/drip-campaigns/sequences/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/drip-campaigns/sequences/{id}Update a drip sequence.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "trigger_event": "signup", "trigger_filter_json": { "country": [ "string" ], "status": [ "string" ], "vip_tier_slug": [ "string" ] }, "is_enabled": false, "max_concurrent_enrollments": 0 }' 'http://localhost:4000/v1/drip-campaigns/sequences/{id}'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/drip-campaigns/sequences/{id}', json={
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/drip-campaigns/sequences/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"trigger_event": "signup",
"trigger_filter_json": {
"country": [
"string"
],
"status": [
"string"
],
"vip_tier_slug": [
"string"
]
},
"is_enabled": false,
"max_concurrent_enrollments": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/drip-campaigns/sequences/{id}/stepsList steps in a sequence (position-ordered).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/sequences/{id}/stepsAdd a new step at the given position.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "position": 0, "name": "string", "delay_seconds": 0, "action_kind": "send_email", "communication_template_id": "string", "action_payload_json": {}, "stop_on_event_json": [ "string" ], "is_enabled": false }' 'http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps', json={
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/sequences/{id}/steps", bytes.NewReader([]byte(`{
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/drip-campaigns/step-executionsAppend-only execution log. Filter by enrollment / sequence / customer.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/step-executions'
JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/step-executions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/drip-campaigns/step-executions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/step-executions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/drip-campaigns/step-executions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/drip-campaigns/steps/{id}Hard-delete a step (executions log survives via SetNull).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/drip-campaigns/steps/{id}'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/steps/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/drip-campaigns/steps/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/steps/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/drip-campaigns/steps/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/drip-campaigns/steps/{id}Update a step.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "position": 0, "name": "string", "delay_seconds": 0, "action_kind": "send_email", "communication_template_id": "string", "action_payload_json": {}, "stop_on_event_json": [ "string" ], "is_enabled": false }' 'http://localhost:4000/v1/drip-campaigns/steps/{id}'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/steps/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/drip-campaigns/steps/{id}', json={
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/steps/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/drip-campaigns/steps/{id}", bytes.NewReader([]byte(`{
"position": 0,
"name": "string",
"delay_seconds": 0,
"action_kind": "send_email",
"communication_template_id": "string",
"action_payload_json": {},
"stop_on_event_json": [
"string"
],
"is_enabled": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/drip-campaigns/trigger-eventFire a lifecycle event for one customer. Enrolls matching sequences + cancels enrollments waiting on a stop_on_event step.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "event": "signup", "customer_id": "string", "payload_json": {} }' 'http://localhost:4000/v1/drip-campaigns/trigger-event'JavaScript
await fetch('http://localhost:4000/v1/drip-campaigns/trigger-event', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"event": "signup",
"customer_id": "string",
"payload_json": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/drip-campaigns/trigger-event', json={
"event": "signup",
"customer_id": "string",
"payload_json": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/drip-campaigns/trigger-event');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"event": "signup",
"customer_id": "string",
"payload_json": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/drip-campaigns/trigger-event", bytes.NewReader([]byte(`{
"event": "signup",
"customer_id": "string",
"payload_json": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()enterprise
GET/v1/admin/saved-views
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/saved-views'
JavaScript
await fetch('http://localhost:4000/v1/admin/saved-views', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/saved-views')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/saved-views');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/saved-views", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/saved-views
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/saved-views'
JavaScript
await fetch('http://localhost:4000/v1/admin/saved-views', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/saved-views')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/saved-views');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/saved-views", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/admin/saved-views/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/saved-views/{id}'JavaScript
await fetch('http://localhost:4000/v1/admin/saved-views/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/admin/saved-views/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/saved-views/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/admin/saved-views/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/admin/saved-views/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/saved-views/{id}'JavaScript
await fetch('http://localhost:4000/v1/admin/saved-views/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/admin/saved-views/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/saved-views/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/admin/saved-views/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/searchCmd-K global search across traders, deposits, withdrawals, tickets, leads, accounts.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/search'
JavaScript
await fetch('http://localhost:4000/v1/admin/search', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/search')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/search');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/search", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/siem/export-nowTrigger SIEM export immediately (normally runs every 5 min from worker).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/siem/export-now'
JavaScript
await fetch('http://localhost:4000/v1/admin/siem/export-now', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/siem/export-now')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/siem/export-now');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/siem/export-now", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/admin/siem/forwarders
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/siem/forwarders'
JavaScript
await fetch('http://localhost:4000/v1/admin/siem/forwarders', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/admin/siem/forwarders')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/siem/forwarders');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/admin/siem/forwarders", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/siem/forwarders
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/siem/forwarders'
JavaScript
await fetch('http://localhost:4000/v1/admin/siem/forwarders', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/siem/forwarders')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/siem/forwarders');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/siem/forwarders", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/admin/siem/forwarders/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/siem/forwarders/{id}'JavaScript
await fetch('http://localhost:4000/v1/admin/siem/forwarders/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/admin/siem/forwarders/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/siem/forwarders/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/admin/siem/forwarders/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/admin/status-incidents
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/status-incidents'
JavaScript
await fetch('http://localhost:4000/v1/admin/status-incidents', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/admin/status-incidents')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/status-incidents');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/admin/status-incidents", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/admin/status-incidents/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/admin/status-incidents/{id}'JavaScript
await fetch('http://localhost:4000/v1/admin/status-incidents/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/admin/status-incidents/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/admin/status-incidents/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/admin/status-incidents/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/changelogPublic changelog — auto-generated from MetaModule + git tags.
curl
curl -X GET 'http://localhost:4000/v1/public/changelog'
JavaScript
await fetch('http://localhost:4000/v1/public/changelog', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/changelog')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/changelog');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/changelog", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/statusPublic status page data — latest incidents + component state.
curl
curl -X GET 'http://localhost:4000/v1/public/status'
JavaScript
await fetch('http://localhost:4000/v1/public/status', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/status')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/status');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/status", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/users/me/theme
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/users/me/theme'
JavaScript
await fetch('http://localhost:4000/v1/users/me/theme', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/users/me/theme')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/me/theme');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/users/me/theme", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/users/me/theme
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/users/me/theme'
JavaScript
await fetch('http://localhost:4000/v1/users/me/theme', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/users/me/theme')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/users/me/theme');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/users/me/theme", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()forge-admin
GET/v1/forge/admin/accountsPass-through to Forge /admin/accounts.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/forge/admin/accounts'
JavaScript
await fetch('http://localhost:4000/v1/forge/admin/accounts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/forge/admin/accounts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/forge/admin/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/forge/admin/accounts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/forge/admin/purchasesPass-through to Forge /admin/purchases.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/forge/admin/purchases'
JavaScript
await fetch('http://localhost:4000/v1/forge/admin/purchases', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/forge/admin/purchases')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/forge/admin/purchases');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/forge/admin/purchases", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/forge/admin/statsForge KPI snapshot: purchases / revenue / funded / active.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/forge/admin/stats'
JavaScript
await fetch('http://localhost:4000/v1/forge/admin/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/forge/admin/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/forge/admin/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/forge/admin/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()fx
GET/v1/fx/ratesPaginated FX-rate history. Filters: base, quote. Includes global + tenant rows by default; set tenant_only=true to exclude globals.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/fx/rates'
JavaScript
await fetch('http://localhost:4000/v1/fx/rates', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/fx/rates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/rates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/fx/rates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/fx/rates/latestOne row per (base, quote) pair using the freshest cached rate. Tenant-scoped rates override global rates for the same pair. Use this for the dealer matrix view.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/fx/rates/latest'
JavaScript
await fetch('http://localhost:4000/v1/fx/rates/latest', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/fx/rates/latest')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/rates/latest');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/fx/rates/latest", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/fx/rates/seed-defaultsSeed the GLOBAL rate pool with a hardcoded mid-2026 mid-rate table (USD<->EUR/GBP/JPY/CHF/CAD/AUD/NZD, 14 rows). Safe to call repeatedly — the global partial unique upserts in place.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/fx/rates/seed-defaults'
JavaScript
await fetch('http://localhost:4000/v1/fx/rates/seed-defaults', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/fx/rates/seed-defaults')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/rates/seed-defaults');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/fx/rates/seed-defaults", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/fx/rates/upsertInsert one or more FX rates for this tenant (default) or the global pool (pass global=true). Tenant-scoped writes are insert-only — every call appends a new history row with fetched_at=now(). Global writes overwrite the single per-pair row (kept compatible with admin-ext-v2 fx-rates upsert).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "rates": [ { "base": "string", "quote": "string", "rate": 0, "source": "string" } ], "global": false }' 'http://localhost:4000/v1/fx/rates/upsert'JavaScript
await fetch('http://localhost:4000/v1/fx/rates/upsert', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"rates": [
{
"base": "string",
"quote": "string",
"rate": 0,
"source": "string"
}
],
"global": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/fx/rates/upsert', json={
"rates": [
{
"base": "string",
"quote": "string",
"rate": 0,
"source": "string"
}
],
"global": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/rates/upsert');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"rates": [
{
"base": "string",
"quote": "string",
"rate": 0,
"source": "string"
}
],
"global": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/fx/rates/upsert", bytes.NewReader([]byte(`{
"rates": [
{
"base": "string",
"quote": "string",
"rate": 0,
"source": "string"
}
],
"global": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/fx/tenant/base-currencyCurrent base currency for the calling tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/fx/tenant/base-currency'
JavaScript
await fetch('http://localhost:4000/v1/fx/tenant/base-currency', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/fx/tenant/base-currency')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/tenant/base-currency');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/fx/tenant/base-currency", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/fx/tenant/base-currencySet tenant base currency. WARNING: this changes the unit of EVERY USD-labelled aggregate (deposits totals, withdrawal totals, equity, exposure, bonus thresholds, tax statements) the next time those aggregates are computed. There is no retroactive re-stamp of historical reports.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "base_currency": "string" }' 'http://localhost:4000/v1/fx/tenant/base-currency'JavaScript
await fetch('http://localhost:4000/v1/fx/tenant/base-currency', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"base_currency": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/fx/tenant/base-currency', json={
"base_currency": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/fx/tenant/base-currency');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"base_currency": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/fx/tenant/base-currency", bytes.NewReader([]byte(`{
"base_currency": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()health
GET/healthLiveness probe — returns 200 if the API process is alive.
curl
curl -X GET 'http://localhost:4000/health'
JavaScript
await fetch('http://localhost:4000/health', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/health')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/health');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/health", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()ib-tree
GET/v1/ib-treeFull IB hierarchy for the current tenant as nested JSON with per-node aggregates.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ib-tree'
JavaScript
await fetch('http://localhost:4000/v1/ib-tree', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ib-tree')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ib-tree');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ib-tree", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ib-tree/{affiliateId}Sub-tree rooted at the given affiliate (ULID), with the same per-node aggregates.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ib-tree/{affiliateId}'JavaScript
await fetch('http://localhost:4000/v1/ib-tree/{affiliateId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ib-tree/{affiliateId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ib-tree/{affiliateId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ib-tree/{affiliateId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/ib-tree/statsTenant-wide IB rollups: total IBs, max depth, top 5 earners by USD commission.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/ib-tree/stats'
JavaScript
await fetch('http://localhost:4000/v1/ib-tree/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/ib-tree/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/ib-tree/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/ib-tree/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()identity
POST/v1/auth/email/resendResend the email-verification link to the current user.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/email/resend'
JavaScript
await fetch('http://localhost:4000/v1/auth/email/resend', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/email/resend')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/email/resend');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/email/resend", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/email/verifyConsume an email-verification token.
curl
curl -X POST 'http://localhost:4000/v1/auth/email/verify'
JavaScript
await fetch('http://localhost:4000/v1/auth/email/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/email/verify')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/email/verify');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/email/verify", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/loginLog in with email + password (+ TOTP if enrolled).
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "password": "string", "totpCode": "string", "tenantSlug": "string" }' 'http://localhost:4000/v1/auth/login'JavaScript
await fetch('http://localhost:4000/v1/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"password": "string",
"totpCode": "string",
"tenantSlug": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/login', json={
"email": "user@example.com",
"password": "string",
"totpCode": "string",
"tenantSlug": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/login');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"password": "string",
"totpCode": "string",
"tenantSlug": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/login", bytes.NewReader([]byte(`{
"email": "user@example.com",
"password": "string",
"totpCode": "string",
"tenantSlug": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/logoutLog out and revoke the current session.
curl
curl -X POST 'http://localhost:4000/v1/auth/logout'
JavaScript
await fetch('http://localhost:4000/v1/auth/logout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/logout')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/logout');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/logout", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/auth/meReturn the currently authenticated user + tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/me'
JavaScript
await fetch('http://localhost:4000/v1/auth/me', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/auth/me')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/me');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/auth/me", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/password/forgotRequest a password-reset email. Always returns 200 to prevent enumeration.
curl
curl -X POST 'http://localhost:4000/v1/auth/password/forgot'
JavaScript
await fetch('http://localhost:4000/v1/auth/password/forgot', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/password/forgot')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/password/forgot');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/password/forgot", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/password/resetConsume a password-reset token and set a new password.
curl
curl -X POST 'http://localhost:4000/v1/auth/password/reset'
JavaScript
await fetch('http://localhost:4000/v1/auth/password/reset', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/password/reset')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/password/reset');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/password/reset", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/registerRegister a new user within a tenant.
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "password": "string", "displayName": "string", "tenantSlug": "string", "tenantName": "string" }' 'http://localhost:4000/v1/auth/register'JavaScript
await fetch('http://localhost:4000/v1/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"password": "string",
"displayName": "string",
"tenantSlug": "string",
"tenantName": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/register', json={
"email": "user@example.com",
"password": "string",
"displayName": "string",
"tenantSlug": "string",
"tenantName": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/register');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"password": "string",
"displayName": "string",
"tenantSlug": "string",
"tenantName": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/register", bytes.NewReader([]byte(`{
"email": "user@example.com",
"password": "string",
"displayName": "string",
"tenantSlug": "string",
"tenantName": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/auth/sessionsList active sessions (devices) for the current user.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/sessions'
JavaScript
await fetch('http://localhost:4000/v1/auth/sessions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/auth/sessions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/sessions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/auth/sessions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/auth/sessions/{id}Revoke a specific session by id.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/sessions/{id}'JavaScript
await fetch('http://localhost:4000/v1/auth/sessions/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/auth/sessions/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/sessions/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/auth/sessions/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/sessions/revoke-allRevoke all sessions except the current one (log out everywhere).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/sessions/revoke-all'
JavaScript
await fetch('http://localhost:4000/v1/auth/sessions/revoke-all', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/sessions/revoke-all')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/sessions/revoke-all');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/sessions/revoke-all", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/totp/enrollBegin TOTP enrollment. Returns a provisioning URI for authenticator apps.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/totp/enroll'
JavaScript
await fetch('http://localhost:4000/v1/auth/totp/enroll', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/totp/enroll')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/totp/enroll');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/totp/enroll", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/totp/verifyConfirm TOTP enrollment by submitting a valid code.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "code": "string" }' 'http://localhost:4000/v1/auth/totp/verify'JavaScript
await fetch('http://localhost:4000/v1/auth/totp/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"code": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/totp/verify', json={
"code": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/totp/verify');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"code": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/totp/verify", bytes.NewReader([]byte(`{
"code": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()integrations
GET/v1/integrations/configs
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/integrations/configs'
JavaScript
await fetch('http://localhost:4000/v1/integrations/configs', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/integrations/configs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/integrations/configs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/integrations/configs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/integrations/configsCreate or update the (tenant, platform) connector config.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "platform": "mt5", "label": "string", "endpoint": "string", "credentials": {}, "isActive": false }' 'http://localhost:4000/v1/integrations/configs'JavaScript
await fetch('http://localhost:4000/v1/integrations/configs', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"platform": "mt5",
"label": "string",
"endpoint": "string",
"credentials": {},
"isActive": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/integrations/configs', json={
"platform": "mt5",
"label": "string",
"endpoint": "string",
"credentials": {},
"isActive": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/integrations/configs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"platform": "mt5",
"label": "string",
"endpoint": "string",
"credentials": {},
"isActive": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/integrations/configs", bytes.NewReader([]byte(`{
"platform": "mt5",
"label": "string",
"endpoint": "string",
"credentials": {},
"isActive": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/integrations/configs/{platform}/test
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/integrations/configs/{platform}/test'JavaScript
await fetch('http://localhost:4000/v1/integrations/configs/{platform}/test', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/integrations/configs/{platform}/test')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/integrations/configs/{platform}/test');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/integrations/configs/{platform}/test", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/integrations/positions
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/integrations/positions'
JavaScript
await fetch('http://localhost:4000/v1/integrations/positions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/integrations/positions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/integrations/positions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/integrations/positions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/integrations/syncPull positions from every active connector for this tenant.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/integrations/sync'
JavaScript
await fetch('http://localhost:4000/v1/integrations/sync', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/integrations/sync')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/integrations/sync');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/integrations/sync", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()intelligence
GET/v1/intelligence/churn/at-riskTraders predicted likely to churn (weighted signal model).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/churn/at-risk'
JavaScript
await fetch('http://localhost:4000/v1/intelligence/churn/at-risk', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/intelligence/churn/at-risk')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/churn/at-risk');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/intelligence/churn/at-risk", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/intelligence/deposits/{id}/fraud-scoreDetailed fraud breakdown for one deposit.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/deposits/{id}/fraud-score'JavaScript
await fetch('http://localhost:4000/v1/intelligence/deposits/{id}/fraud-score', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/intelligence/deposits/{id}/fraud-score')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/deposits/{id}/fraud-score');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/intelligence/deposits/{id}/fraud-score", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/intelligence/fraud/depositsHigh-fraud-score deposits for admin review.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/fraud/deposits'
JavaScript
await fetch('http://localhost:4000/v1/intelligence/fraud/deposits', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/intelligence/fraud/deposits')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/fraud/deposits');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/intelligence/fraud/deposits", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/intelligence/fraud/rescanRe-scan recent deposits for fraud anomalies (normally runs per-deposit).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/fraud/rescan'
JavaScript
await fetch('http://localhost:4000/v1/intelligence/fraud/rescan', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/intelligence/fraud/rescan')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/fraud/rescan');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/intelligence/fraud/rescan", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/intelligence/leads/rescoreForce re-score all traders for this tenant (normally runs nightly).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/leads/rescore'
JavaScript
await fetch('http://localhost:4000/v1/intelligence/leads/rescore', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/intelligence/leads/rescore')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/leads/rescore');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/intelligence/leads/rescore", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/intelligence/leads/scoredTop-N scored leads + traders ready to convert. Score 0-100.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/leads/scored'
JavaScript
await fetch('http://localhost:4000/v1/intelligence/leads/scored', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/intelligence/leads/scored')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/leads/scored');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/intelligence/leads/scored", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/intelligence/next-actions/{userId}Best-next-action recommendations for a specific sales operator.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/intelligence/next-actions/{userId}'JavaScript
await fetch('http://localhost:4000/v1/intelligence/next-actions/{userId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/intelligence/next-actions/{userId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/intelligence/next-actions/{userId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/intelligence/next-actions/{userId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()kyc
POST/v1/kyc/approveApprove a trader KYC.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "notes": "string" }' 'http://localhost:4000/v1/kyc/approve'JavaScript
await fetch('http://localhost:4000/v1/kyc/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/approve', json={
"traderId": "string",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/approve", bytes.NewReader([]byte(`{
"traderId": "string",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/documents/{id}/livenessK5: Submit liveness-check score (client-side blink/head-turn detection result).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/documents/{id}/liveness'JavaScript
await fetch('http://localhost:4000/v1/kyc/documents/{id}/liveness', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/documents/{id}/liveness')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/documents/{id}/liveness');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/documents/{id}/liveness", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/kyc/documents/{id}/previewStream a KYC document for admin preview.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/documents/{id}/preview'JavaScript
await fetch('http://localhost:4000/v1/kyc/documents/{id}/preview', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/kyc/documents/{id}/preview')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/documents/{id}/preview');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/kyc/documents/{id}/preview", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/kyc/pendingList traders waiting for KYC review.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/pending'
JavaScript
await fetch('http://localhost:4000/v1/kyc/pending', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/kyc/pending')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/pending');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/kyc/pending", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/rejectReject a trader KYC with a reason.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "reason": "string" }' 'http://localhost:4000/v1/kyc/reject'JavaScript
await fetch('http://localhost:4000/v1/kyc/reject', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/reject', json={
"traderId": "string",
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/reject');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/reject", bytes.NewReader([]byte(`{
"traderId": "string",
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/request-more-infoAsk the trader for extra documents; moves KYC back to in_progress.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "notes": "string" }' 'http://localhost:4000/v1/kyc/request-more-info'JavaScript
await fetch('http://localhost:4000/v1/kyc/request-more-info', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/request-more-info', json={
"traderId": "string",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/request-more-info');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/request-more-info", bytes.NewReader([]byte(`{
"traderId": "string",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/kyc/sanctionsList sanctions hits across all traders in the tenant. Filter by status (open/cleared/confirmed/all).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/sanctions'
JavaScript
await fetch('http://localhost:4000/v1/kyc/sanctions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/kyc/sanctions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/sanctions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/kyc/sanctions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/sanctions/{hitId}/reviewMark a sanctions hit as cleared (false positive) or confirmed (true match).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/sanctions/{hitId}/review'JavaScript
await fetch('http://localhost:4000/v1/kyc/sanctions/{hitId}/review', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/sanctions/{hitId}/review')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/sanctions/{hitId}/review');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/sanctions/{hitId}/review", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/sessionsMint a 15-minute hosted-KYC link for a trader.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/sessions'
JavaScript
await fetch('http://localhost:4000/v1/kyc/sessions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/sessions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/sessions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/sessions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/sessions/by-emailBroker mints a hosted-KYC link by trader email. Upserts trader if missing. API-key auth.
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "firstName": "string", "lastName": "string", "country": "string", "purpose": "identity", "returnUrl": "https://example.com" }' 'http://localhost:4000/v1/kyc/sessions/by-email'JavaScript
await fetch('http://localhost:4000/v1/kyc/sessions/by-email', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"firstName": "string",
"lastName": "string",
"country": "string",
"purpose": "identity",
"returnUrl": "https://example.com"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/sessions/by-email', json={
"email": "user@example.com",
"firstName": "string",
"lastName": "string",
"country": "string",
"purpose": "identity",
"returnUrl": "https://example.com"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/sessions/by-email');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"firstName": "string",
"lastName": "string",
"country": "string",
"purpose": "identity",
"returnUrl": "https://example.com"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/sessions/by-email", bytes.NewReader([]byte(`{
"email": "user@example.com",
"firstName": "string",
"lastName": "string",
"country": "string",
"purpose": "identity",
"returnUrl": "https://example.com"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/kyc/statusReturn the current KYC status of a trader in the caller's tenant, keyed by email.
curl
curl -X GET 'http://localhost:4000/v1/kyc/status'
JavaScript
await fetch('http://localhost:4000/v1/kyc/status', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/kyc/status')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/status');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/kyc/status", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/submitSubmit a trader for KYC review. Also triggers sanctions screening.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string" }' 'http://localhost:4000/v1/kyc/submit'JavaScript
await fetch('http://localhost:4000/v1/kyc/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/submit', json={
"traderId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/submit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/submit", bytes.NewReader([]byte(`{
"traderId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/kyc/traders/{traderId}KYC summary: status + documents (with presigned preview URLs + analysis) + sanctions hits.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/kyc/traders/{traderId}'JavaScript
await fetch('http://localhost:4000/v1/kyc/traders/{traderId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/kyc/traders/{traderId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/traders/{traderId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/kyc/traders/{traderId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/uploadsRequest a presigned upload URL for a KYC document.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "kind": "passport", "contentType": "string", "fileSize": 0 }' 'http://localhost:4000/v1/kyc/uploads'JavaScript
await fetch('http://localhost:4000/v1/kyc/uploads', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"kind": "passport",
"contentType": "string",
"fileSize": 0
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/uploads', json={
"traderId": "string",
"kind": "passport",
"contentType": "string",
"fileSize": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/uploads');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"kind": "passport",
"contentType": "string",
"fileSize": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/uploads", bytes.NewReader([]byte(`{
"traderId": "string",
"kind": "passport",
"contentType": "string",
"fileSize": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/uploads/confirmMark a KYC document as uploaded and enqueue it for analysis.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "documentId": "string" }' 'http://localhost:4000/v1/kyc/uploads/confirm'JavaScript
await fetch('http://localhost:4000/v1/kyc/uploads/confirm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"documentId": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/uploads/confirm', json={
"documentId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/uploads/confirm');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"documentId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/uploads/confirm", bytes.NewReader([]byte(`{
"documentId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/kyc/webhooks/sumsubSumsub event webhook (HMAC-verified when SUMSUB_WEBHOOK_SECRET set).
curl
curl -X POST 'http://localhost:4000/v1/kyc/webhooks/sumsub'
JavaScript
await fetch('http://localhost:4000/v1/kyc/webhooks/sumsub', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/kyc/webhooks/sumsub')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/kyc/webhooks/sumsub');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/kyc/webhooks/sumsub", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/kyc/sessions/{token}Resolve a KYC portal token into tenant branding + trader placeholder + purpose.
curl
curl -X GET 'http://localhost:4000/v1/public/kyc/sessions/{token}'JavaScript
await fetch('http://localhost:4000/v1/public/kyc/sessions/{token}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/kyc/sessions/{token}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/kyc/sessions/{token}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/kyc/sessions/{token}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/kyc/sessions/{token}/submitFinal submit — flips the trader into pending_review, runs sanctions screen, fires kyc.submitted.
curl
curl -X POST 'http://localhost:4000/v1/public/kyc/sessions/{token}/submit'JavaScript
await fetch('http://localhost:4000/v1/public/kyc/sessions/{token}/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/kyc/sessions/{token}/submit')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/kyc/sessions/{token}/submit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/kyc/sessions/{token}/submit", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/kyc/sessions/{token}/uploadDirect single-shot upload. Browser POSTs base64-encoded JPG; API writes to MinIO and enqueues analysis.
curl
curl -X POST 'http://localhost:4000/v1/public/kyc/sessions/{token}/upload'JavaScript
await fetch('http://localhost:4000/v1/public/kyc/sessions/{token}/upload', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/kyc/sessions/{token}/upload')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/kyc/sessions/{token}/upload');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/kyc/sessions/{token}/upload", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()leaderboards
GET/v1/leaderboards/configsList all leaderboard configs for this tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs'
JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/configs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/configs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/leaderboards/configsCreate a new leaderboard config. Slug unique per tenant.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs'
JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/leaderboards/configs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/leaderboards/configs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/leaderboards/configs/{id}Delete a leaderboard config. Cascade-deletes snapshots + claims.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/leaderboards/configs/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/leaderboards/configs/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/leaderboards/configs/{id}Update an existing leaderboard config.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/leaderboards/configs/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/leaderboards/configs/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/leaderboards/configs/{id}/customer/{customerId}/positionA single trader's current rank + ±3 nearest neighbours (for "you are #47, here's ±3" widget).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}/customer/{customerId}/position'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}/customer/{customerId}/position', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/configs/{id}/customer/{customerId}/position')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}/customer/{customerId}/position');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/configs/{id}/customer/{customerId}/position", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/leaderboards/configs/{id}/liveCompute live ranking now (no snapshot persisted). Returns top N from SQL aggregate.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}/live'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}/live', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/configs/{id}/live')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}/live');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/configs/{id}/live", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/leaderboards/configs/{id}/snapshotManually trigger a snapshot. Computes ranking, persists it, and creates pending prize claims if the config defines prize tiers.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}/snapshot'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}/snapshot', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/leaderboards/configs/{id}/snapshot')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}/snapshot');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/leaderboards/configs/{id}/snapshot", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/leaderboards/configs/{id}/snapshotsList historical snapshots for this config (newest first).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}/snapshots'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/configs/{id}/snapshots", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/leaderboards/configs/{id}/snapshots/{snapshotId}Single snapshot detail incl. full rankings array.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/configs/{id}/snapshots/{snapshotId}'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots/{snapshotId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots/{snapshotId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/configs/{id}/snapshots/{snapshotId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/configs/{id}/snapshots/{snapshotId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/leaderboards/prizes/claimsList prize claims (filter by config_id, status).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/prizes/claims'
JavaScript
await fetch('http://localhost:4000/v1/leaderboards/prizes/claims', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/leaderboards/prizes/claims')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/prizes/claims');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/leaderboards/prizes/claims", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/leaderboards/prizes/claims/{id}/grantApprove a pending prize claim. For credit_grant kind, writes a credit_line_entry by resolving the winner's Customer record via trader.email.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/prizes/claims/{id}/grant'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/grant', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/grant')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/grant');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/leaderboards/prizes/claims/{id}/grant", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/leaderboards/prizes/claims/{id}/revokeRevoke a claim. For granted credit_grant claims, writes a reverse credit_line_entry to roll the balance back.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/leaderboards/prizes/claims/{id}/revoke'JavaScript
await fetch('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/revoke', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/revoke')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/leaderboards/prizes/claims/{id}/revoke');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/leaderboards/prizes/claims/{id}/revoke", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()lp-routing
GET/v1/lp-routing/providersList liquidity providers (tenant-scoped). Excludes disabled providers unless include_disabled=true.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/providers'
JavaScript
await fetch('http://localhost:4000/v1/lp-routing/providers', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/lp-routing/providers')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/providers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/lp-routing/providers", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/lp-routing/providersCreate a liquidity provider.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "connector_kind": "none", "is_enabled": true, "priority": 100, "max_volume_per_min": "string", "supports_categories": [], "connector_config_json": {} }' 'http://localhost:4000/v1/lp-routing/providers'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/providers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/lp-routing/providers', json={
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/providers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/lp-routing/providers", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/lp-routing/providers/{id}Soft-delete a liquidity provider (flips is_enabled=false). Rules referencing this LP still resolve to it; they just show "disabled" so the dealer notices.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/providers/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/providers/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/lp-routing/providers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/providers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/lp-routing/providers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/lp-routing/providers/{id}Fetch one liquidity provider (connector_config_json is NOT returned).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/providers/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/providers/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/lp-routing/providers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/providers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/lp-routing/providers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/lp-routing/providers/{id}Update a liquidity provider (PATCH semantics).
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "connector_kind": "none", "is_enabled": true, "priority": 100, "max_volume_per_min": "string", "supports_categories": [], "connector_config_json": {} }' 'http://localhost:4000/v1/lp-routing/providers/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/providers/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/lp-routing/providers/{id}', json={
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/providers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/lp-routing/providers/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"connector_kind": "none",
"is_enabled": true,
"priority": 100,
"max_volume_per_min": "string",
"supports_categories": [],
"connector_config_json": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/lp-routing/resolveResolve the effective routing for a (symbol, tier_id) pair. Precedence: exact symbol → category → default; within each, tier-specific beats tier-agnostic. Returns the rule, primary LP, fallback LP (or null), and the match level. NOTE: this is config-only — actual order forwarding to LPs is not yet wired; risk-console.hedge writes an audit-log placeholder when a dealer hedges.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/resolve'
JavaScript
await fetch('http://localhost:4000/v1/lp-routing/resolve', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/lp-routing/resolve')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/resolve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/lp-routing/resolve", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/lp-routing/rulesList routing rules (tenant-scoped). Optional filters: scope, vip_tier_id. Excludes disabled rules unless include_disabled=true.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/rules'
JavaScript
await fetch('http://localhost:4000/v1/lp-routing/rules', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/lp-routing/rules')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/lp-routing/rules", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/lp-routing/rulesCreate a routing rule.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "scope": "symbol", "scope_value": "string", "vip_tier_id": "string", "primary_lp_id": "string", "fallback_lp_id": "string", "is_enabled": true }' 'http://localhost:4000/v1/lp-routing/rules'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/rules', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/lp-routing/rules', json={
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/lp-routing/rules", bytes.NewReader([]byte(`{
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/lp-routing/rules/{id}Hard-delete a routing rule.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/rules/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/lp-routing/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/lp-routing/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/lp-routing/rules/{id}Fetch one routing rule.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/lp-routing/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/rules/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/lp-routing/rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/lp-routing/rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/lp-routing/rules/{id}Update a routing rule (PATCH semantics).
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "scope": "symbol", "scope_value": "string", "vip_tier_id": "string", "primary_lp_id": "string", "fallback_lp_id": "string", "is_enabled": true }' 'http://localhost:4000/v1/lp-routing/rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/lp-routing/rules/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/lp-routing/rules/{id}', json={
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/lp-routing/rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/lp-routing/rules/{id}", bytes.NewReader([]byte(`{
"scope": "symbol",
"scope_value": "string",
"vip_tier_id": "string",
"primary_lp_id": "string",
"fallback_lp_id": "string",
"is_enabled": true
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()managers
GET/v1/managersList MAM/PAMM master accounts (tenant-scoped, paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers'
JavaScript
await fetch('http://localhost:4000/v1/managers', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/managers')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/managers", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/managersCreate a MAM/PAMM master account.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "manager_customer_id": "string", "kind": "mam", "allocation_model": "proportional", "performance_fee_pct": "string", "management_fee_pct": "string", "high_water_mark_usd": "string", "max_drawdown_pct": "string", "min_investment_usd": "string", "is_open_to_new_investors": false }' 'http://localhost:4000/v1/managers'JavaScript
await fetch('http://localhost:4000/v1/managers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/managers', json={
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/managers", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/managers/{id}Soft-archive a manager account (investors and fee history retained).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers/{id}'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/managers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/managers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/managers/{id}Get one MAM/PAMM master account with stats.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers/{id}'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/managers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/managers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/managers/{id}Update a MAM/PAMM master account.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "manager_customer_id": "string", "kind": "mam", "allocation_model": "proportional", "performance_fee_pct": "string", "management_fee_pct": "string", "high_water_mark_usd": "string", "max_drawdown_pct": "string", "min_investment_usd": "string", "is_open_to_new_investors": false, "is_archived": false }' 'http://localhost:4000/v1/managers/{id}'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false,
"is_archived": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/managers/{id}', json={
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false,
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false,
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/managers/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"manager_customer_id": "string",
"kind": "mam",
"allocation_model": "proportional",
"performance_fee_pct": "string",
"management_fee_pct": "string",
"high_water_mark_usd": "string",
"max_drawdown_pct": "string",
"min_investment_usd": "string",
"is_open_to_new_investors": false,
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/managers/{id}/feesList fee-ledger rows for a manager (paginated, append-only).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers/{id}/fees'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/fees', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/managers/{id}/fees')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/fees');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/managers/{id}/fees", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/managers/{id}/fees/accrueSnapshot fee accrual for a period — writes ledger rows for all active investors. Performance fee uses the high-water mark; HWM is raised when profit is earned.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "period_start": "string", "period_end": "string", "current_aum_usd": "string" }' 'http://localhost:4000/v1/managers/{id}/fees/accrue'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/fees/accrue', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"period_start": "string",
"period_end": "string",
"current_aum_usd": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/managers/{id}/fees/accrue', json={
"period_start": "string",
"period_end": "string",
"current_aum_usd": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/fees/accrue');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"period_start": "string",
"period_end": "string",
"current_aum_usd": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/managers/{id}/fees/accrue", bytes.NewReader([]byte(`{
"period_start": "string",
"period_end": "string",
"current_aum_usd": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/managers/{id}/investorsList investor subscriptions for a manager.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers/{id}/investors'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/investors', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/managers/{id}/investors')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/investors');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/managers/{id}/investors", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/managers/{id}/investorsAdd a customer as an investor (subscription).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "customer_id": "string", "investment_usd": "string", "investor_trading_account_id": "string", "equity_share_pct": "string", "allocation_lot_ratio": "string" }' 'http://localhost:4000/v1/managers/{id}/investors'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/investors', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"customer_id": "string",
"investment_usd": "string",
"investor_trading_account_id": "string",
"equity_share_pct": "string",
"allocation_lot_ratio": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/managers/{id}/investors', json={
"customer_id": "string",
"investment_usd": "string",
"investor_trading_account_id": "string",
"equity_share_pct": "string",
"allocation_lot_ratio": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/investors');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"customer_id": "string",
"investment_usd": "string",
"investor_trading_account_id": "string",
"equity_share_pct": "string",
"allocation_lot_ratio": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/managers/{id}/investors", bytes.NewReader([]byte(`{
"customer_id": "string",
"investment_usd": "string",
"investor_trading_account_id": "string",
"equity_share_pct": "string",
"allocation_lot_ratio": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/managers/{id}/investors/{investorId}Close an investor subscription (status=closed, exited_at set).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/managers/{id}/investors/{investorId}'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/investors/{investorId}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/managers/{id}/investors/{investorId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/investors/{investorId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/managers/{id}/investors/{investorId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/managers/{id}/investors/{investorId}Update an investor subscription (status / equity / value).
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "status": "pending", "equity_share_pct": "string", "allocation_lot_ratio": "string", "current_value_usd": "string", "investor_trading_account_id": "string" }' 'http://localhost:4000/v1/managers/{id}/investors/{investorId}'JavaScript
await fetch('http://localhost:4000/v1/managers/{id}/investors/{investorId}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"status": "pending",
"equity_share_pct": "string",
"allocation_lot_ratio": "string",
"current_value_usd": "string",
"investor_trading_account_id": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/managers/{id}/investors/{investorId}', json={
"status": "pending",
"equity_share_pct": "string",
"allocation_lot_ratio": "string",
"current_value_usd": "string",
"investor_trading_account_id": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/managers/{id}/investors/{investorId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"status": "pending",
"equity_share_pct": "string",
"allocation_lot_ratio": "string",
"current_value_usd": "string",
"investor_trading_account_id": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/managers/{id}/investors/{investorId}", bytes.NewReader([]byte(`{
"status": "pending",
"equity_share_pct": "string",
"allocation_lot_ratio": "string",
"current_value_usd": "string",
"investor_trading_account_id": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()meta
GET/v1/_meta/changelogFull /v1 contract changelog (newest first).
curl
curl -X GET 'http://localhost:4000/v1/_meta/changelog'
JavaScript
await fetch('http://localhost:4000/v1/_meta/changelog', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/_meta/changelog')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/_meta/changelog');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/_meta/changelog", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/_meta/versionReturn the frozen public-API contract version + last changelog entry.
curl
curl -X GET 'http://localhost:4000/v1/_meta/version'
JavaScript
await fetch('http://localhost:4000/v1/_meta/version', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/_meta/version')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/_meta/version');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/_meta/version", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()payments
GET/v1/payments/deposits
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/deposits'
JavaScript
await fetch('http://localhost:4000/v1/payments/deposits', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/deposits')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/deposits", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "accountId": "string", "paymentMethodId": "string", "kind": "card", "amount": "string", "currency": "string", "externalId": "string", "metadata": {} }' 'http://localhost:4000/v1/payments/deposits'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"externalId": "string",
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits', json={
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"externalId": "string",
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"externalId": "string",
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits", bytes.NewReader([]byte(`{
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"externalId": "string",
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/deposits/{id}/invoice.pdfM5: Invoice PDF for a settled deposit. Uses pdfkit for tables + branding.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/deposits/{id}/invoice.pdf'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/{id}/invoice.pdf', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/deposits/{id}/invoice.pdf')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/{id}/invoice.pdf');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/deposits/{id}/invoice.pdf", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/approveApprove a deposit awaiting review.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "notes": "string" }' 'http://localhost:4000/v1/payments/deposits/approve'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/approve', json={
"id": "string",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/approve", bytes.NewReader([]byte(`{
"id": "string",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/bulk-approveApprove up to 50 deposits in one call.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "ids": [ "string" ], "notes": "string" }' 'http://localhost:4000/v1/payments/deposits/bulk-approve'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/bulk-approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"ids": [
"string"
],
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/bulk-approve', json={
"ids": [
"string"
],
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/bulk-approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"ids": [
"string"
],
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/bulk-approve", bytes.NewReader([]byte(`{
"ids": [
"string"
],
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/deposits/export.csvExport deposits to CSV (filters match GET /deposits). Max 10,000 rows.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/deposits/export.csv'
JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/export.csv', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/deposits/export.csv')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/export.csv');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/deposits/export.csv", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/reconcileFlag a deposit as reconciled / un-reconciled against external statements.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "reconciled": false, "notes": "string" }' 'http://localhost:4000/v1/payments/deposits/reconcile'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/reconcile', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"reconciled": false,
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/reconcile', json={
"id": "string",
"reconciled": false,
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/reconcile');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"reconciled": false,
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/reconcile", bytes.NewReader([]byte(`{
"id": "string",
"reconciled": false,
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/reject
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "reason": "string" }' 'http://localhost:4000/v1/payments/deposits/reject'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/reject', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/reject', json={
"id": "string",
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/reject');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/reject", bytes.NewReader([]byte(`{
"id": "string",
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/reverseReverse a settled deposit (chargeback, NSF wire, fraud). Flips commissions to reversed.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "reason": "string" }' 'http://localhost:4000/v1/payments/deposits/reverse'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/reverse', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/reverse', json={
"id": "string",
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/reverse');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/reverse", bytes.NewReader([]byte(`{
"id": "string",
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/deposits/settleManually settle an approved deposit with optional fee/net/settle-date/proof.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "feeAmount": "string", "netAmount": "string", "settledAt": "2026-05-23T12:18:22.181Z", "externalId": "string", "proofUrl": "https://example.com", "notes": "string" }' 'http://localhost:4000/v1/payments/deposits/settle'JavaScript
await fetch('http://localhost:4000/v1/payments/deposits/settle', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/deposits/settle', json={
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/deposits/settle');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/deposits/settle", bytes.NewReader([]byte(`{
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/methods
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/methods'
JavaScript
await fetch('http://localhost:4000/v1/payments/methods', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/methods')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/methods');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/methods", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/methods
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "kind": "card", "label": "string", "externalRef": "string", "currency": "string", "network": "string", "metadata": {}, "isDefault": false }' 'http://localhost:4000/v1/payments/methods'JavaScript
await fetch('http://localhost:4000/v1/payments/methods', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"kind": "card",
"label": "string",
"externalRef": "string",
"currency": "string",
"network": "string",
"metadata": {},
"isDefault": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/methods', json={
"traderId": "string",
"kind": "card",
"label": "string",
"externalRef": "string",
"currency": "string",
"network": "string",
"metadata": {},
"isDefault": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/methods');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"kind": "card",
"label": "string",
"externalRef": "string",
"currency": "string",
"network": "string",
"metadata": {},
"isDefault": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/methods", bytes.NewReader([]byte(`{
"traderId": "string",
"kind": "card",
"label": "string",
"externalRef": "string",
"currency": "string",
"network": "string",
"metadata": {},
"isDefault": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/reconciliation
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/reconciliation'
JavaScript
await fetch('http://localhost:4000/v1/payments/reconciliation', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/reconciliation')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/reconciliation');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/reconciliation", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/traders/{traderId}/statement.pdfP4: Monthly statement PDF for a trader. Multi-table pdfkit layout.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/traders/{traderId}/statement.pdf'JavaScript
await fetch('http://localhost:4000/v1/payments/traders/{traderId}/statement.pdf', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/traders/{traderId}/statement.pdf')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/traders/{traderId}/statement.pdf');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/traders/{traderId}/statement.pdf", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/webhooks/stripeStripe webhook receiver (signature-verified).
curl
curl -X POST 'http://localhost:4000/v1/payments/webhooks/stripe'
JavaScript
await fetch('http://localhost:4000/v1/payments/webhooks/stripe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/webhooks/stripe')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/webhooks/stripe');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/webhooks/stripe", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/withdrawals
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/withdrawals'
JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/withdrawals')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/withdrawals", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "accountId": "string", "paymentMethodId": "string", "kind": "card", "amount": "string", "currency": "string", "destinationRef": "string", "metadata": {} }' 'http://localhost:4000/v1/payments/withdrawals'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"destinationRef": "string",
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals', json={
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"destinationRef": "string",
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"destinationRef": "string",
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals", bytes.NewReader([]byte(`{
"traderId": "string",
"accountId": "string",
"paymentMethodId": "string",
"kind": "card",
"amount": "string",
"currency": "string",
"destinationRef": "string",
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals/approve
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "notes": "string" }' 'http://localhost:4000/v1/payments/withdrawals/approve'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals/approve', json={
"id": "string",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals/approve", bytes.NewReader([]byte(`{
"id": "string",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals/bulk-approveApprove up to 50 withdrawals in one call.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "ids": [ "string" ], "notes": "string" }' 'http://localhost:4000/v1/payments/withdrawals/bulk-approve'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/bulk-approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"ids": [
"string"
],
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals/bulk-approve', json={
"ids": [
"string"
],
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/bulk-approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"ids": [
"string"
],
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals/bulk-approve", bytes.NewReader([]byte(`{
"ids": [
"string"
],
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/withdrawals/export.csvExport withdrawals to CSV (filters match GET /withdrawals). Max 10,000 rows.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/withdrawals/export.csv'
JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/export.csv', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/withdrawals/export.csv')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/export.csv');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/withdrawals/export.csv", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/payments/withdrawals/pending-dual-controlList withdrawals waiting on a second approver (audit C3).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/payments/withdrawals/pending-dual-control'
JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/pending-dual-control', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/payments/withdrawals/pending-dual-control')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/pending-dual-control');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/payments/withdrawals/pending-dual-control", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals/reconcileFlag a withdrawal as reconciled / un-reconciled against external statements.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "reconciled": false, "notes": "string" }' 'http://localhost:4000/v1/payments/withdrawals/reconcile'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/reconcile', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"reconciled": false,
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals/reconcile', json={
"id": "string",
"reconciled": false,
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/reconcile');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"reconciled": false,
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals/reconcile", bytes.NewReader([]byte(`{
"id": "string",
"reconciled": false,
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals/reject
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "reason": "string" }' 'http://localhost:4000/v1/payments/withdrawals/reject'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/reject', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals/reject', json={
"id": "string",
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/reject');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals/reject", bytes.NewReader([]byte(`{
"id": "string",
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/payments/withdrawals/settleMark an approved withdrawal as settled with optional settle-date / proof.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "id": "string", "feeAmount": "string", "netAmount": "string", "settledAt": "2026-05-23T12:18:22.181Z", "externalId": "string", "proofUrl": "https://example.com", "notes": "string" }' 'http://localhost:4000/v1/payments/withdrawals/settle'JavaScript
await fetch('http://localhost:4000/v1/payments/withdrawals/settle', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/payments/withdrawals/settle', json={
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/payments/withdrawals/settle');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/payments/withdrawals/settle", bytes.NewReader([]byte(`{
"id": "string",
"feeAmount": "string",
"netAmount": "string",
"settledAt": "2026-05-23T12:18:22.181Z",
"externalId": "string",
"proofUrl": "https://example.com",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()platform
GET/v1/platform/auditCross-tenant audit log. Filterable by action / resource_type / tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/platform/audit'
JavaScript
await fetch('http://localhost:4000/v1/platform/audit', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/platform/audit')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/platform/audit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/platform/audit", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/platform/overviewPlatform-wide KPI snapshot: tenants/users/traders/deposits/sessions.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/platform/overview'
JavaScript
await fetch('http://localhost:4000/v1/platform/overview', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/platform/overview')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/platform/overview');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/platform/overview", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/platform/tenantsList every tenant with counts + most-recent activity.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/platform/tenants'
JavaScript
await fetch('http://localhost:4000/v1/platform/tenants', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/platform/tenants')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/platform/tenants');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/platform/tenants", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/platform/tenants/{id}One tenant with detailed counts, owners, most-recent activity.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/platform/tenants/{id}'JavaScript
await fetch('http://localhost:4000/v1/platform/tenants/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/platform/tenants/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/platform/tenants/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/platform/tenants/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/platform/tenants/{id}/feature-flagsMerge into a tenant's feature_flags JSON. Used for toggling platform-wide flags on behalf of a broker.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/platform/tenants/{id}/feature-flags'JavaScript
await fetch('http://localhost:4000/v1/platform/tenants/{id}/feature-flags', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/platform/tenants/{id}/feature-flags')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/platform/tenants/{id}/feature-flags');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/platform/tenants/{id}/feature-flags", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()prop-challenges
GET/v1/prop-challenges/accountsList challenge accounts with filters (status, template_id, customer_id). Paginated.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/accounts'
JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/prop-challenges/accounts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/prop-challenges/accounts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/accountsCreate a challenge account for a customer. If payment_confirmed=true, starts in `active` status (and sets started_at + expires_at). Otherwise `pending_payment`.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "customer_id": "string", "template_id": "string", "payment_confirmed": false, "trading_account_id": "string" }' 'http://localhost:4000/v1/prop-challenges/accounts'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"customer_id": "string",
"template_id": "string",
"payment_confirmed": false,
"trading_account_id": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/accounts', json={
"customer_id": "string",
"template_id": "string",
"payment_confirmed": false,
"trading_account_id": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"customer_id": "string",
"template_id": "string",
"payment_confirmed": false,
"trading_account_id": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/accounts", bytes.NewReader([]byte(`{
"customer_id": "string",
"template_id": "string",
"payment_confirmed": false,
"trading_account_id": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/prop-challenges/accounts/{id}Fetch one challenge account (with template).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/accounts/{id}'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/prop-challenges/accounts/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/prop-challenges/accounts/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/accounts/{id}/breachManually breach a challenge (admin override) with a reason.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "reason": "string" }' 'http://localhost:4000/v1/prop-challenges/accounts/{id}/breach'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts/{id}/breach', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/accounts/{id}/breach', json={
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts/{id}/breach');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/accounts/{id}/breach", bytes.NewReader([]byte(`{
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/accounts/{id}/evaluateRe-evaluate challenge state from current trading data. Reads equity from linked TradingAccount, recomputes peak + dd, checks profit target + min trading days. May advance stage / mark funded / mark breached / mark expired. Writes audit only when state changes.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/accounts/{id}/evaluate'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts/{id}/evaluate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/accounts/{id}/evaluate')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts/{id}/evaluate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/accounts/{id}/evaluate", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/accounts/{id}/startMark a pending_payment challenge as active — sets started_at, expires_at = started_at + template.max_evaluation_days. Optionally links a trading_account_id.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "trading_account_id": "string", "started_at": "2026-05-23T12:18:22.182Z" }' 'http://localhost:4000/v1/prop-challenges/accounts/{id}/start'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/accounts/{id}/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"trading_account_id": "string",
"started_at": "2026-05-23T12:18:22.182Z"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/accounts/{id}/start', json={
"trading_account_id": "string",
"started_at": "2026-05-23T12:18:22.182Z"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/accounts/{id}/start');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"trading_account_id": "string",
"started_at": "2026-05-23T12:18:22.182Z"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/accounts/{id}/start", bytes.NewReader([]byte(`{
"trading_account_id": "string",
"started_at": "2026-05-23T12:18:22.182Z"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/prop-challenges/payoutsList payouts (filter by status / account_id).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/payouts'
JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/payouts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/prop-challenges/payouts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/payouts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/prop-challenges/payouts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/payoutsRequest a payout for a funded challenge account. Service computes trader/house split from template.profit_split_pct (residual rounding goes to house).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "challenge_account_id": "string", "amount_usd": "string", "notes": "string" }' 'http://localhost:4000/v1/prop-challenges/payouts'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/payouts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"challenge_account_id": "string",
"amount_usd": "string",
"notes": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/payouts', json={
"challenge_account_id": "string",
"amount_usd": "string",
"notes": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/payouts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"challenge_account_id": "string",
"amount_usd": "string",
"notes": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/payouts", bytes.NewReader([]byte(`{
"challenge_account_id": "string",
"amount_usd": "string",
"notes": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/payouts/{id}/approveApprove a requested payout — moves to `approved` status.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/payouts/{id}/approve'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/payouts/{id}/approve', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/payouts/{id}/approve')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/payouts/{id}/approve');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/payouts/{id}/approve", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/payouts/{id}/payMark an approved payout as paid (sets paid_at + increments challenge_account.paid_out_usd by amount_usd).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/payouts/{id}/pay'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/payouts/{id}/pay', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/payouts/{id}/pay')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/payouts/{id}/pay');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/payouts/{id}/pay", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/payouts/{id}/rejectReject a payout (used pre-pay; if reason supplied it is appended to notes).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "reason": "string" }' 'http://localhost:4000/v1/prop-challenges/payouts/{id}/reject'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/payouts/{id}/reject', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/payouts/{id}/reject', json={
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/payouts/{id}/reject');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/payouts/{id}/reject", bytes.NewReader([]byte(`{
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/prop-challenges/templatesList challenge templates (tenant-scoped).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/templates'
JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/templates', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/prop-challenges/templates')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/templates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/prop-challenges/templates", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/prop-challenges/templatesCreate a challenge template.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "account_size_usd": "string", "entry_fee_usd": "string", "max_total_drawdown_pct": "string", "max_daily_drawdown_pct": "string", "profit_target_pct": "string", "min_trading_days": 0, "max_evaluation_days": 0, "stages_json": [ { "name": "string", "profit_target_pct": 0, "max_dd_pct": 0, "days_min": 0 } ], "profit_split_pct": "string", "is_archived": false }' 'http://localhost:4000/v1/prop-challenges/templates'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/templates', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/prop-challenges/templates', json={
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/templates');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/prop-challenges/templates", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/prop-challenges/templates/{id}Delete a challenge template. Soft-archives if any challenge_accounts already reference it (cannot hard-delete with live data).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/prop-challenges/templates/{id}'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/templates/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/prop-challenges/templates/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/templates/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/prop-challenges/templates/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/prop-challenges/templates/{id}Update a challenge template.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "account_size_usd": "string", "entry_fee_usd": "string", "max_total_drawdown_pct": "string", "max_daily_drawdown_pct": "string", "profit_target_pct": "string", "min_trading_days": 0, "max_evaluation_days": 0, "stages_json": [ { "name": "string", "profit_target_pct": 0, "max_dd_pct": 0, "days_min": 0 } ], "profit_split_pct": "string", "is_archived": false }' 'http://localhost:4000/v1/prop-challenges/templates/{id}'JavaScript
await fetch('http://localhost:4000/v1/prop-challenges/templates/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/prop-challenges/templates/{id}', json={
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/prop-challenges/templates/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/prop-challenges/templates/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"account_size_usd": "string",
"entry_fee_usd": "string",
"max_total_drawdown_pct": "string",
"max_daily_drawdown_pct": "string",
"profit_target_pct": "string",
"min_trading_days": 0,
"max_evaluation_days": 0,
"stages_json": [
{
"name": "string",
"profit_target_pct": 0,
"max_dd_pct": 0,
"days_min": 0
}
],
"profit_split_pct": "string",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()public-ai
POST/v1/public/ai/chatCustomer-facing AI chat. Cookie session required (approved customers only). Returns SSE when ?stream=true.
curl
curl -X POST 'http://localhost:4000/v1/public/ai/chat'
JavaScript
await fetch('http://localhost:4000/v1/public/ai/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/ai/chat')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/ai/chat');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/ai/chat", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()public-customers
POST/v1/public/crypto-deposits
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "chain": "BSC", "amount": 0 }' 'http://localhost:4000/v1/public/crypto-deposits'JavaScript
await fetch('http://localhost:4000/v1/public/crypto-deposits', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"chain": "BSC",
"amount": 0
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/crypto-deposits', json={
"chain": "BSC",
"amount": 0
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/crypto-deposits');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"chain": "BSC",
"amount": 0
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/crypto-deposits", bytes.NewReader([]byte(`{
"chain": "BSC",
"amount": 0
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/login
curl
curl -X POST 'http://localhost:4000/v1/public/login'
JavaScript
await fetch('http://localhost:4000/v1/public/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/login')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/login');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/login", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/logout
curl
curl -X POST 'http://localhost:4000/v1/public/logout'
JavaScript
await fetch('http://localhost:4000/v1/public/logout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/logout')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/logout');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/logout", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/me
curl
curl -X GET 'http://localhost:4000/v1/public/me'
JavaScript
await fetch('http://localhost:4000/v1/public/me', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/me')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/me');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/me", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/messages
curl
curl -X GET 'http://localhost:4000/v1/public/messages'
JavaScript
await fetch('http://localhost:4000/v1/public/messages', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/messages')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/messages');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/messages", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/messages
curl
curl -X POST 'http://localhost:4000/v1/public/messages'
JavaScript
await fetch('http://localhost:4000/v1/public/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/messages')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/messages');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/messages", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/signup
curl
curl -X POST 'http://localhost:4000/v1/public/signup'
JavaScript
await fetch('http://localhost:4000/v1/public/signup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/signup')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/signup');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/signup", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()public-leaderboards
GET/v1/public/leaderboardsList the public (is_public=true && is_enabled=true) leaderboard configs for a tenant.
curl
curl -X GET 'http://localhost:4000/v1/public/leaderboards'
JavaScript
await fetch('http://localhost:4000/v1/public/leaderboards', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/leaderboards')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/leaderboards');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/leaderboards", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/public/leaderboards/{configSlug}/liveLive ranking for a public leaderboard. Strips customer_id; only rank, name, value, trades visible.
curl
curl -X GET 'http://localhost:4000/v1/public/leaderboards/{configSlug}/live'JavaScript
await fetch('http://localhost:4000/v1/public/leaderboards/{configSlug}/live', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/public/leaderboards/{configSlug}/live')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/leaderboards/{configSlug}/live');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/public/leaderboards/{configSlug}/live", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()public-raf
POST/v1/public/raf/attribute-signupAttribute a freshly-created customer to a RAF code (un-authenticated, HMAC-signed). 400 if code is unknown / expired.
curl
curl -X POST 'http://localhost:4000/v1/public/raf/attribute-signup'
JavaScript
await fetch('http://localhost:4000/v1/public/raf/attribute-signup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/raf/attribute-signup')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/raf/attribute-signup');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/raf/attribute-signup", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/public/raf/track-clickRecord a share-link click (un-authenticated, HMAC-signed). Always returns 200, even for unknown codes (silent privacy).
curl
curl -X POST 'http://localhost:4000/v1/public/raf/track-click'
JavaScript
await fetch('http://localhost:4000/v1/public/raf/track-click', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/public/raf/track-click')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/public/raf/track-click');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/public/raf/track-click", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()raf
GET/v1/raf/codesList per-customer share-link codes.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/codes'
JavaScript
await fetch('http://localhost:4000/v1/raf/codes', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/raf/codes')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/codes');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/raf/codes", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/raf/codes/issueIssue (or fetch existing) RAF code for a customer.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "program_id": "string", "referrer_customer_id": "string" }' 'http://localhost:4000/v1/raf/codes/issue'JavaScript
await fetch('http://localhost:4000/v1/raf/codes/issue', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"program_id": "string",
"referrer_customer_id": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/raf/codes/issue', json={
"program_id": "string",
"referrer_customer_id": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/codes/issue');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"program_id": "string",
"referrer_customer_id": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/raf/codes/issue", bytes.NewReader([]byte(`{
"program_id": "string",
"referrer_customer_id": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/raf/programsList RAF programs for the current tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/programs'
JavaScript
await fetch('http://localhost:4000/v1/raf/programs', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/raf/programs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/programs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/raf/programs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/raf/programsCreate a new RAF program.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "is_enabled": false, "referrer_reward_kind": "fixed_usd", "referrer_reward_value": "string", "referee_reward_kind": "fixed_usd", "referee_reward_value": "string", "min_referee_deposit_usd": "string", "max_rewards_per_referrer": 0, "expires_at": "string" }' 'http://localhost:4000/v1/raf/programs'JavaScript
await fetch('http://localhost:4000/v1/raf/programs', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/raf/programs', json={
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/programs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/raf/programs", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/raf/programs/{id}Soft-disable a RAF program (sets is_enabled=false).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/programs/{id}'JavaScript
await fetch('http://localhost:4000/v1/raf/programs/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/raf/programs/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/programs/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/raf/programs/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/raf/programs/{id}Update a RAF program.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "is_enabled": false, "referrer_reward_kind": "fixed_usd", "referrer_reward_value": "string", "referee_reward_kind": "fixed_usd", "referee_reward_value": "string", "min_referee_deposit_usd": "string", "max_rewards_per_referrer": 0, "expires_at": "string" }' 'http://localhost:4000/v1/raf/programs/{id}'JavaScript
await fetch('http://localhost:4000/v1/raf/programs/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/raf/programs/{id}', json={
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/programs/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/raf/programs/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"is_enabled": false,
"referrer_reward_kind": "fixed_usd",
"referrer_reward_value": "string",
"referee_reward_kind": "fixed_usd",
"referee_reward_value": "string",
"min_referee_deposit_usd": "string",
"max_rewards_per_referrer": 0,
"expires_at": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/raf/referralsList referrals (tenant-scoped, paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/referrals'
JavaScript
await fetch('http://localhost:4000/v1/raf/referrals', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/raf/referrals')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/raf/referrals", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/raf/referrals/{id}Get one referral (for the audit drawer).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/referrals/{id}'JavaScript
await fetch('http://localhost:4000/v1/raf/referrals/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/raf/referrals/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/raf/referrals/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/raf/referrals/{id}/process-depositProcess a referee deposit and issue rewards if threshold met.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "deposit_amount_usd": "string" }' 'http://localhost:4000/v1/raf/referrals/{id}/process-deposit'JavaScript
await fetch('http://localhost:4000/v1/raf/referrals/{id}/process-deposit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"deposit_amount_usd": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/raf/referrals/{id}/process-deposit', json={
"deposit_amount_usd": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals/{id}/process-deposit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"deposit_amount_usd": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/raf/referrals/{id}/process-deposit", bytes.NewReader([]byte(`{
"deposit_amount_usd": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/raf/referrals/attribute-signupAttribute a new customer signup to a RAF code.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "code": "string", "referee_customer_id": "string", "referee_email": "user@example.com" }' 'http://localhost:4000/v1/raf/referrals/attribute-signup'JavaScript
await fetch('http://localhost:4000/v1/raf/referrals/attribute-signup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"code": "string",
"referee_customer_id": "string",
"referee_email": "user@example.com"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/raf/referrals/attribute-signup', json={
"code": "string",
"referee_customer_id": "string",
"referee_email": "user@example.com"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals/attribute-signup');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"code": "string",
"referee_customer_id": "string",
"referee_email": "user@example.com"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/raf/referrals/attribute-signup", bytes.NewReader([]byte(`{
"code": "string",
"referee_customer_id": "string",
"referee_email": "user@example.com"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/raf/referrals/statsTop-of-funnel KPIs for the RAF program(s).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/raf/referrals/stats'
JavaScript
await fetch('http://localhost:4000/v1/raf/referrals/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/raf/referrals/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/raf/referrals/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/raf/referrals/track-clickRecord a click on a share-link (always 200 for privacy).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "code": "string" }' 'http://localhost:4000/v1/raf/referrals/track-click'JavaScript
await fetch('http://localhost:4000/v1/raf/referrals/track-click', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"code": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/raf/referrals/track-click', json={
"code": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/raf/referrals/track-click');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"code": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/raf/referrals/track-click", bytes.NewReader([]byte(`{
"code": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()reporting
GET/v1/reporting/activity-by-day
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/reporting/activity-by-day'
JavaScript
await fetch('http://localhost:4000/v1/reporting/activity-by-day', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/reporting/activity-by-day')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/activity-by-day');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/reporting/activity-by-day", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/reporting/overviewKPI overview for the admin dashboard.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/reporting/overview'
JavaScript
await fetch('http://localhost:4000/v1/reporting/overview', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/reporting/overview')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/overview');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/reporting/overview", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/reporting/saved
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/reporting/saved'
JavaScript
await fetch('http://localhost:4000/v1/reporting/saved', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/reporting/saved')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/saved');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/reporting/saved", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/reporting/saved
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "slug": "string", "name": "string", "kind": "deposits", "query": {}, "schedule": "string" }' 'http://localhost:4000/v1/reporting/saved'JavaScript
await fetch('http://localhost:4000/v1/reporting/saved', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"slug": "string",
"name": "string",
"kind": "deposits",
"query": {},
"schedule": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/reporting/saved', json={
"slug": "string",
"name": "string",
"kind": "deposits",
"query": {},
"schedule": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/saved');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"slug": "string",
"name": "string",
"kind": "deposits",
"query": {},
"schedule": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/reporting/saved", bytes.NewReader([]byte(`{
"slug": "string",
"name": "string",
"kind": "deposits",
"query": {},
"schedule": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/reporting/saved/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/reporting/saved/{id}'JavaScript
await fetch('http://localhost:4000/v1/reporting/saved/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/reporting/saved/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/saved/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/reporting/saved/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/reporting/saved/{id}/run
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/reporting/saved/{id}/run'JavaScript
await fetch('http://localhost:4000/v1/reporting/saved/{id}/run', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/reporting/saved/{id}/run')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/reporting/saved/{id}/run');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/reporting/saved/{id}/run", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()retention
GET/v1/retention/cohortsTenant-wide rollup: trader count + average LTV by churn-risk tier.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/retention/cohorts'
JavaScript
await fetch('http://localhost:4000/v1/retention/cohorts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/retention/cohorts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/retention/cohorts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/retention/cohorts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/retention/scorecardsList retention scorecards (tenant-scoped). Sorted churn-risk-desc then net-funded-desc. customerId narrows to one trader.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/retention/scorecards'
JavaScript
await fetch('http://localhost:4000/v1/retention/scorecards', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/retention/scorecards')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/retention/scorecards');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/retention/scorecards", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/retention/scorecards/{customerId}Full scorecard detail for a single trader (tenant-scoped).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/retention/scorecards/{customerId}'JavaScript
await fetch('http://localhost:4000/v1/retention/scorecards/{customerId}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/retention/scorecards/{customerId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/retention/scorecards/{customerId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/retention/scorecards/{customerId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()risk-console
GET/v1/risk-console/exposureLive net-exposure per symbol — sorted by abs(net_notional_usd) desc. Joins positions → trading_accounts → trading_symbols, resolves book routing via account override > group (via trader↔customer email match) > b_book.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-console/exposure'
JavaScript
await fetch('http://localhost:4000/v1/risk-console/exposure', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-console/exposure')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/exposure');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-console/exposure", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/risk-console/exposure/{symbol}Position-level drill-down for a single symbol.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-console/exposure/{symbol}'JavaScript
await fetch('http://localhost:4000/v1/risk-console/exposure/{symbol}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-console/exposure/{symbol}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/exposure/{symbol}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-console/exposure/{symbol}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/risk-console/groupsList trading groups with their current book-routing default.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-console/groups'
JavaScript
await fetch('http://localhost:4000/v1/risk-console/groups', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-console/groups')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/groups');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-console/groups", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/risk-console/hedgeRecord a dealer-initiated hedge intent. NOTE: this currently writes an audit-log entry only — the LP connector is not yet wired so no LP order is actually opened (TODO).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "symbol": "string", "side": "buy", "volume_lots": 0, "reason": "string" }' 'http://localhost:4000/v1/risk-console/hedge'JavaScript
await fetch('http://localhost:4000/v1/risk-console/hedge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"symbol": "string",
"side": "buy",
"volume_lots": 0,
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/risk-console/hedge', json={
"symbol": "string",
"side": "buy",
"volume_lots": 0,
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/hedge');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"symbol": "string",
"side": "buy",
"volume_lots": 0,
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/risk-console/hedge", bytes.NewReader([]byte(`{
"symbol": "string",
"side": "buy",
"volume_lots": 0,
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/risk-console/routeFlip A-book / B-book / hybrid routing on a trading group (default) or a single trading account (override).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "scope": "group", "id": "string", "book_routing": "a_book" }' 'http://localhost:4000/v1/risk-console/route'JavaScript
await fetch('http://localhost:4000/v1/risk-console/route', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"scope": "group",
"id": "string",
"book_routing": "a_book"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/risk-console/route', json={
"scope": "group",
"id": "string",
"book_routing": "a_book"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/route');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"scope": "group",
"id": "string",
"book_routing": "a_book"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/risk-console/route", bytes.NewReader([]byte(`{
"scope": "group",
"id": "string",
"book_routing": "a_book"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/risk-console/route/account/{id}Clear a per-account book-routing override — account inherits the group default again.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-console/route/account/{id}'JavaScript
await fetch('http://localhost:4000/v1/risk-console/route/account/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/risk-console/route/account/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/route/account/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/risk-console/route/account/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/risk-console/summaryTop-bar KPIs — total open positions, gross long/short, net, top-3 symbols.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-console/summary'
JavaScript
await fetch('http://localhost:4000/v1/risk-console/summary', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-console/summary')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-console/summary');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-console/summary", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()risk-rules
GET/v1/risk-rules
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-rules'
JavaScript
await fetch('http://localhost:4000/v1/risk-rules', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-rules')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-rules", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/risk-rules
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "match": {}, "routing": "string", "priority": 0, "isActive": true }' 'http://localhost:4000/v1/risk-rules'JavaScript
await fetch('http://localhost:4000/v1/risk-rules', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/risk-rules', json={
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/risk-rules", bytes.NewReader([]byte(`{
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/risk-rules/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/risk-rules/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/risk-rules/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/risk-rules/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/risk-rules/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "match": {}, "routing": "string", "priority": 0, "isActive": true }' 'http://localhost:4000/v1/risk-rules/{id}'JavaScript
await fetch('http://localhost:4000/v1/risk-rules/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/risk-rules/{id}', json={
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/risk-rules/{id}", bytes.NewReader([]byte(`{
"name": "string",
"match": {},
"routing": "string",
"priority": 0,
"isActive": true
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/risk-rules/{id}/dry-runDry-run a rule against a hypothetical context — returns whether it would fire and which routing it would emit.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "trader_country": "string", "account_balance": 0, "account_leverage": 0, "deposit_total_lifetime": 0, "position_volume": 0, "position_symbol": "string", "position_profit": 0, "is_demo": false }' 'http://localhost:4000/v1/risk-rules/{id}/dry-run'JavaScript
await fetch('http://localhost:4000/v1/risk-rules/{id}/dry-run', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"trader_country": "string",
"account_balance": 0,
"account_leverage": 0,
"deposit_total_lifetime": 0,
"position_volume": 0,
"position_symbol": "string",
"position_profit": 0,
"is_demo": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/risk-rules/{id}/dry-run', json={
"trader_country": "string",
"account_balance": 0,
"account_leverage": 0,
"deposit_total_lifetime": 0,
"position_volume": 0,
"position_symbol": "string",
"position_profit": 0,
"is_demo": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules/{id}/dry-run');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"trader_country": "string",
"account_balance": 0,
"account_leverage": 0,
"deposit_total_lifetime": 0,
"position_volume": 0,
"position_symbol": "string",
"position_profit": 0,
"is_demo": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/risk-rules/{id}/dry-run", bytes.NewReader([]byte(`{
"trader_country": "string",
"account_balance": 0,
"account_leverage": 0,
"deposit_total_lifetime": 0,
"position_volume": 0,
"position_symbol": "string",
"position_profit": 0,
"is_demo": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/risk-rules/classify-accountsRe-evaluate every active trading account and persist the routing decision.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-rules/classify-accounts'
JavaScript
await fetch('http://localhost:4000/v1/risk-rules/classify-accounts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/risk-rules/classify-accounts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules/classify-accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/risk-rules/classify-accounts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/risk-rules/statsRouting breakdown across the tenants trading accounts (after the most recent classify run).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/risk-rules/stats'
JavaScript
await fetch('http://localhost:4000/v1/risk-rules/stats', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/risk-rules/stats')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/risk-rules/stats');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/risk-rules/stats", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()sales
GET/v1/sales/activities
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/sales/activities'
JavaScript
await fetch('http://localhost:4000/v1/sales/activities', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/sales/activities')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/activities');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/sales/activities", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/sales/activities
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "leadId": "string", "traderId": "string", "kind": "note", "subject": "string", "body": "string", "occurredAt": "2026-05-23T12:18:22.181Z" }' 'http://localhost:4000/v1/sales/activities'JavaScript
await fetch('http://localhost:4000/v1/sales/activities', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"leadId": "string",
"traderId": "string",
"kind": "note",
"subject": "string",
"body": "string",
"occurredAt": "2026-05-23T12:18:22.181Z"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/sales/activities', json={
"leadId": "string",
"traderId": "string",
"kind": "note",
"subject": "string",
"body": "string",
"occurredAt": "2026-05-23T12:18:22.181Z"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/activities');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"leadId": "string",
"traderId": "string",
"kind": "note",
"subject": "string",
"body": "string",
"occurredAt": "2026-05-23T12:18:22.181Z"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/sales/activities", bytes.NewReader([]byte(`{
"leadId": "string",
"traderId": "string",
"kind": "note",
"subject": "string",
"body": "string",
"occurredAt": "2026-05-23T12:18:22.181Z"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/sales/leads
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/sales/leads'
JavaScript
await fetch('http://localhost:4000/v1/sales/leads', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/sales/leads')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/leads');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/sales/leads", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/sales/leads
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "phone": "string", "firstName": "string", "lastName": "string", "country": "string", "source": "string", "assignedToId": "string", "score": 0, "metadata": {} }' 'http://localhost:4000/v1/sales/leads'JavaScript
await fetch('http://localhost:4000/v1/sales/leads', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/sales/leads', json={
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/leads');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/sales/leads", bytes.NewReader([]byte(`{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/sales/leads/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/sales/leads/{id}'JavaScript
await fetch('http://localhost:4000/v1/sales/leads/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/sales/leads/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/leads/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/sales/leads/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/sales/leads/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "phone": "string", "firstName": "string", "lastName": "string", "country": "string", "source": "string", "assignedToId": "string", "score": 0, "metadata": {}, "status": "new", "pipelineStageId": "string" }' 'http://localhost:4000/v1/sales/leads/{id}'JavaScript
await fetch('http://localhost:4000/v1/sales/leads/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {},
"status": "new",
"pipelineStageId": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/sales/leads/{id}', json={
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {},
"status": "new",
"pipelineStageId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/leads/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {},
"status": "new",
"pipelineStageId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/sales/leads/{id}", bytes.NewReader([]byte(`{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"source": "string",
"assignedToId": "string",
"score": 0,
"metadata": {},
"status": "new",
"pipelineStageId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/sales/leads/{id}/convertConvert a lead to a trader.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/sales/leads/{id}/convert'JavaScript
await fetch('http://localhost:4000/v1/sales/leads/{id}/convert', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/sales/leads/{id}/convert')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/leads/{id}/convert');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/sales/leads/{id}/convert", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/sales/pipelines
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/sales/pipelines'
JavaScript
await fetch('http://localhost:4000/v1/sales/pipelines', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/sales/pipelines')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/pipelines');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/sales/pipelines", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/sales/pipelines
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "slug": "string", "name": "string", "isDefault": false, "stages": [ { "name": "string", "position": 0, "probability": 0 } ] }' 'http://localhost:4000/v1/sales/pipelines'JavaScript
await fetch('http://localhost:4000/v1/sales/pipelines', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"slug": "string",
"name": "string",
"isDefault": false,
"stages": [
{
"name": "string",
"position": 0,
"probability": 0
}
]
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/sales/pipelines', json={
"slug": "string",
"name": "string",
"isDefault": false,
"stages": [
{
"name": "string",
"position": 0,
"probability": 0
}
]
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/sales/pipelines');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"slug": "string",
"name": "string",
"isDefault": false,
"stages": [
{
"name": "string",
"position": 0,
"probability": 0
}
]
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/sales/pipelines", bytes.NewReader([]byte(`{
"slug": "string",
"name": "string",
"isDefault": false,
"stages": [
{
"name": "string",
"position": 0,
"probability": 0
}
]
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()search
GET/v1/search
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/search'
JavaScript
await fetch('http://localhost:4000/v1/search', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/search')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/search');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/search", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()segments
GET/v1/segmentsList saved customer segments for the current tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments'
JavaScript
await fetch('http://localhost:4000/v1/segments', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/segments')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/segments", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/segments
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments'
JavaScript
await fetch('http://localhost:4000/v1/segments', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/segments')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/segments", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/segments/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments/{id}'JavaScript
await fetch('http://localhost:4000/v1/segments/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/segments/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/segments/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/segments/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments/{id}'JavaScript
await fetch('http://localhost:4000/v1/segments/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/segments/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/segments/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/segments/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments/{id}'JavaScript
await fetch('http://localhost:4000/v1/segments/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/segments/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/segments/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/segments/{id}/previewEvaluate the segment filter and preview the first N matching customers.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/segments/{id}/preview'JavaScript
await fetch('http://localhost:4000/v1/segments/{id}/preview', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/segments/{id}/preview')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/segments/{id}/preview');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/segments/{id}/preview", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()support
GET/v1/support/tickets
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/support/tickets'
JavaScript
await fetch('http://localhost:4000/v1/support/tickets', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/support/tickets')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/tickets');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/support/tickets", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/support/tickets
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "subject": "string", "body": "string", "priority": "normal", "traderId": "string" }' 'http://localhost:4000/v1/support/tickets'JavaScript
await fetch('http://localhost:4000/v1/support/tickets', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"subject": "string",
"body": "string",
"priority": "normal",
"traderId": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/support/tickets', json={
"subject": "string",
"body": "string",
"priority": "normal",
"traderId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/tickets');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"subject": "string",
"body": "string",
"priority": "normal",
"traderId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/support/tickets", bytes.NewReader([]byte(`{
"subject": "string",
"body": "string",
"priority": "normal",
"traderId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/support/tickets/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/support/tickets/{id}'JavaScript
await fetch('http://localhost:4000/v1/support/tickets/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/support/tickets/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/tickets/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/support/tickets/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/support/tickets/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "status": "open", "priority": "low", "assignedToId": "string" }' 'http://localhost:4000/v1/support/tickets/{id}'JavaScript
await fetch('http://localhost:4000/v1/support/tickets/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"status": "open",
"priority": "low",
"assignedToId": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/support/tickets/{id}', json={
"status": "open",
"priority": "low",
"assignedToId": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/tickets/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"status": "open",
"priority": "low",
"assignedToId": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/support/tickets/{id}", bytes.NewReader([]byte(`{
"status": "open",
"priority": "low",
"assignedToId": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/support/tickets/{id}/reply
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "body": "string" }' 'http://localhost:4000/v1/support/tickets/{id}/reply'JavaScript
await fetch('http://localhost:4000/v1/support/tickets/{id}/reply', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"body": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/support/tickets/{id}/reply', json={
"body": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/tickets/{id}/reply');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"body": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/support/tickets/{id}/reply", bytes.NewReader([]byte(`{
"body": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/support/webhooks/inboundBroker → CRM: new support ticket inbound.
curl
curl -X POST 'http://localhost:4000/v1/support/webhooks/inbound'
JavaScript
await fetch('http://localhost:4000/v1/support/webhooks/inbound', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/support/webhooks/inbound')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/support/webhooks/inbound');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/support/webhooks/inbound", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()symbols
GET/v1/symbolsList trading symbols (tenant-scoped).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/symbols'
JavaScript
await fetch('http://localhost:4000/v1/symbols', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/symbols')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/symbols", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/symbols
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "symbol": "string", "display_name": "string", "category": "fx", "base_currency": "string", "quote_currency": "string", "contract_size": "string", "pip_size": "string", "markup_pips": "string", "commission_per_lot": "string", "swap_long": "string", "swap_short": "string", "min_lot": "string", "max_lot": "string", "lot_step": "string", "max_leverage": 0, "margin_percent": "string", "is_active": false, "sort_order": 0, "badge": "string" }' 'http://localhost:4000/v1/symbols'JavaScript
await fetch('http://localhost:4000/v1/symbols', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/symbols', json={
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/symbols", bytes.NewReader([]byte(`{
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/symbols/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/symbols/{id}'JavaScript
await fetch('http://localhost:4000/v1/symbols/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/symbols/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/symbols/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/symbols/{id}
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/symbols/{id}'JavaScript
await fetch('http://localhost:4000/v1/symbols/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/symbols/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/symbols/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/symbols/{id}
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "symbol": "string", "display_name": "string", "category": "fx", "base_currency": "string", "quote_currency": "string", "contract_size": "string", "pip_size": "string", "markup_pips": "string", "commission_per_lot": "string", "swap_long": "string", "swap_short": "string", "min_lot": "string", "max_lot": "string", "lot_step": "string", "max_leverage": 0, "margin_percent": "string", "is_active": false, "sort_order": 0, "badge": "string" }' 'http://localhost:4000/v1/symbols/{id}'JavaScript
await fetch('http://localhost:4000/v1/symbols/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/symbols/{id}', json={
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/symbols/{id}", bytes.NewReader([]byte(`{
"symbol": "string",
"display_name": "string",
"category": "fx",
"base_currency": "string",
"quote_currency": "string",
"contract_size": "string",
"pip_size": "string",
"markup_pips": "string",
"commission_per_lot": "string",
"swap_long": "string",
"swap_short": "string",
"min_lot": "string",
"max_lot": "string",
"lot_step": "string",
"max_leverage": 0,
"margin_percent": "string",
"is_active": false,
"sort_order": 0,
"badge": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/symbols/seed-defaultsUpsert a standard pack of common instruments (FX, metals, indices, crypto, energies).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/symbols/seed-defaults'
JavaScript
await fetch('http://localhost:4000/v1/symbols/seed-defaults', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/symbols/seed-defaults')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/symbols/seed-defaults');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/symbols/seed-defaults", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()team
GET/v1/teamList team members + pending invitations for current tenant.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/team'
JavaScript
await fetch('http://localhost:4000/v1/team', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/team')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/team", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/team/invitations/{id}Revoke a pending invitation.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/team/invitations/{id}'JavaScript
await fetch('http://localhost:4000/v1/team/invitations/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/team/invitations/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/invitations/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/team/invitations/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/team/invitations/{token}Fetch invitation details (for accept UI).
curl
curl -X GET 'http://localhost:4000/v1/team/invitations/{token}'JavaScript
await fetch('http://localhost:4000/v1/team/invitations/{token}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/team/invitations/{token}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/invitations/{token}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/team/invitations/{token}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/team/invitations/{token}/acceptAccept invitation: creates user with password, marks invite used.
curl
curl -X POST -H 'Content-Type: application/json' -d '{}' 'http://localhost:4000/v1/team/invitations/{token}/accept'JavaScript
await fetch('http://localhost:4000/v1/team/invitations/{token}/accept', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/team/invitations/{token}/accept', json={})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/invitations/{token}/accept');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/team/invitations/{token}/accept", bytes.NewReader([]byte(`{}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/team/inviteInvite a team member by email. Sends invite email.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{}' 'http://localhost:4000/v1/team/invite'JavaScript
await fetch('http://localhost:4000/v1/team/invite', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/team/invite', json={})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/invite');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/team/invite", bytes.NewReader([]byte(`{}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/team/members/{userId}Remove a team member (soft delete, revoke sessions).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/team/members/{userId}'JavaScript
await fetch('http://localhost:4000/v1/team/members/{userId}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/team/members/{userId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/members/{userId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/team/members/{userId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/team/members/{userId}/rolesUpdate roles for a team member.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{}' 'http://localhost:4000/v1/team/members/{userId}/roles'JavaScript
await fetch('http://localhost:4000/v1/team/members/{userId}/roles', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/team/members/{userId}/roles', json={})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/team/members/{userId}/roles');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/team/members/{userId}/roles", bytes.NewReader([]byte(`{}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()traders
GET/v1/tradersList traders for the current tenant (cursor-paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders'
JavaScript
await fetch('http://localhost:4000/v1/traders', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/tradersCreate a new trader in the current tenant.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "phone": "string", "firstName": "string", "lastName": "string", "country": "string", "dateOfBirth": "string", "segments": [ "string" ], "source": "string", "assignedToId": "string", "metadata": {} }' 'http://localhost:4000/v1/traders'JavaScript
await fetch('http://localhost:4000/v1/traders', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders', json={
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders", bytes.NewReader([]byte(`{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/traders/{id}Soft-delete a trader.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/{id}'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/traders/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/traders/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/{id}Get a trader by id.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/{id}'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/traders/{id}Update trader fields (partial).
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "email": "user@example.com", "phone": "string", "firstName": "string", "lastName": "string", "country": "string", "dateOfBirth": "string", "segments": [ "string" ], "source": "string", "assignedToId": "string", "metadata": {}, "kycStatus": "not_started" }' 'http://localhost:4000/v1/traders/{id}'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {},
"kycStatus": "not_started"
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/traders/{id}', json={
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {},
"kycStatus": "not_started"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {},
"kycStatus": "not_started"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/traders/{id}", bytes.NewReader([]byte(`{
"email": "user@example.com",
"phone": "string",
"firstName": "string",
"lastName": "string",
"country": "string",
"dateOfBirth": "string",
"segments": [
"string"
],
"source": "string",
"assignedToId": "string",
"metadata": {},
"kycStatus": "not_started"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/traders/{id}/segmentsAdd / remove segment tags on a trader.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "add": [ "string" ], "remove": [ "string" ] }' 'http://localhost:4000/v1/traders/{id}/segments'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}/segments', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"add": [
"string"
],
"remove": [
"string"
]
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/traders/{id}/segments', json={
"add": [
"string"
],
"remove": [
"string"
]
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}/segments');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"add": [
"string"
],
"remove": [
"string"
]
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/traders/{id}/segments", bytes.NewReader([]byte(`{
"add": [
"string"
],
"remove": [
"string"
]
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/traders/{id}/suspendSuspend a trader (sets metadata.suspended_at + reason). Blocks trading on the broker side.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/{id}/suspend'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}/suspend', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders/{id}/suspend')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}/suspend');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders/{id}/suspend", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/traders/{id}/unsuspendLift a trader suspension.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/{id}/unsuspend'JavaScript
await fetch('http://localhost:4000/v1/traders/{id}/unsuspend', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders/{id}/unsuspend')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/{id}/unsuspend');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders/{id}/unsuspend", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/meReturn the trader row linked to the current session user (portal).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me'
JavaScript
await fetch('http://localhost:4000/v1/traders/me', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/traders/me/accept-termsTrader confirms they have read the current terms/privacy policy (portal).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/accept-terms'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/accept-terms', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders/me/accept-terms')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/accept-terms');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders/me/accept-terms", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/accounts
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/accounts'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/accounts', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/accounts')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/accounts');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/accounts", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/traders/me/accounts/{id}/auto-login
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/accounts/{id}/auto-login'JavaScript
await fetch('http://localhost:4000/v1/traders/me/accounts/{id}/auto-login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders/me/accounts/{id}/auto-login')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/accounts/{id}/auto-login');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders/me/accounts/{id}/auto-login", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/export
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/export'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/export', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/export')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/export');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/export", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/notifications
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/notifications'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/notifications', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/notifications')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/notifications');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/notifications", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/positions
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/positions'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/positions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/positions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/positions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/positions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/traders/me/profileTrader self-service profile edit (P3). Limited fields + re-trigger KYC on sensitive change.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/profile'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/profile', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/traders/me/profile')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/profile');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/traders/me/profile", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/referrals
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/referrals'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/referrals', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/referrals')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/referrals');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/referrals", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/timelineTrader activity timeline: deposits + kyc + tickets + logins merged (P2).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/timeline'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/timeline', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/timeline')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/timeline');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/timeline", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/transactions
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/transactions'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/transactions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/transactions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/transactions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/transactions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/traders/me/withdrawal-allowlistTrader crypto withdrawal address allowlist (P6).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/withdrawal-allowlist'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/withdrawal-allowlist', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/traders/me/withdrawal-allowlist')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/withdrawal-allowlist');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/traders/me/withdrawal-allowlist", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/traders/me/withdrawal-allowlistAppend an address to the allowlist (P6). Locks for 24h then becomes active.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/traders/me/withdrawal-allowlist'
JavaScript
await fetch('http://localhost:4000/v1/traders/me/withdrawal-allowlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/traders/me/withdrawal-allowlist')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/traders/me/withdrawal-allowlist');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/traders/me/withdrawal-allowlist", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()trading-groups
GET/v1/trading-groupsList trading groups (tenant-scoped).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/trading-groups'
JavaScript
await fetch('http://localhost:4000/v1/trading-groups', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/trading-groups')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/trading-groups", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/trading-groupsCreate a trading group.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "description": "string", "markup_pips_override": "string", "max_leverage_override": 0, "commission_per_lot_override": "string", "swap_free": false, "is_archived": false }' 'http://localhost:4000/v1/trading-groups'JavaScript
await fetch('http://localhost:4000/v1/trading-groups', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/trading-groups', json={
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/trading-groups", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/trading-groups/{id}Delete a trading group (cascades memberships).
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/trading-groups/{id}'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/trading-groups/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/trading-groups/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/trading-groups/{id}Fetch one trading group.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/trading-groups/{id}'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/trading-groups/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/trading-groups/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/trading-groups/{id}Update a trading group.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "description": "string", "markup_pips_override": "string", "max_leverage_override": 0, "commission_per_lot_override": "string", "swap_free": false, "is_archived": false }' 'http://localhost:4000/v1/trading-groups/{id}'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/trading-groups/{id}', json={
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/trading-groups/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"description": "string",
"markup_pips_override": "string",
"max_leverage_override": 0,
"commission_per_lot_override": "string",
"swap_free": false,
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/trading-groups/{id}/membersList customers in a trading group.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/trading-groups/{id}/members'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}/members', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/trading-groups/{id}/members')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}/members');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/trading-groups/{id}/members", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/trading-groups/{id}/membersAdd customers to a trading group.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "customer_ids": [ "string" ] }' 'http://localhost:4000/v1/trading-groups/{id}/members'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}/members', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"customer_ids": [
"string"
]
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/trading-groups/{id}/members', json={
"customer_ids": [
"string"
]
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}/members');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"customer_ids": [
"string"
]
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/trading-groups/{id}/members", bytes.NewReader([]byte(`{
"customer_ids": [
"string"
]
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/trading-groups/{id}/members/{customerId}Remove a customer from a trading group.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/trading-groups/{id}/members/{customerId}'JavaScript
await fetch('http://localhost:4000/v1/trading-groups/{id}/members/{customerId}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/trading-groups/{id}/members/{customerId}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/trading-groups/{id}/members/{customerId}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/trading-groups/{id}/members/{customerId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()transactions
GET/v1/transactionsList transactions with filters (cursor-paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/transactions'
JavaScript
await fetch('http://localhost:4000/v1/transactions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/transactions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/transactions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/transactions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/transactionsRecord a transaction.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "traderId": "string", "accountId": "string", "kind": "deposit", "status": "pending", "amount": "string", "currency": "string", "reference": "string", "description": "string", "externalId": "string", "occurredAt": "2026-05-23T12:18:22.178Z", "metadata": {} }' 'http://localhost:4000/v1/transactions'JavaScript
await fetch('http://localhost:4000/v1/transactions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"traderId": "string",
"accountId": "string",
"kind": "deposit",
"status": "pending",
"amount": "string",
"currency": "string",
"reference": "string",
"description": "string",
"externalId": "string",
"occurredAt": "2026-05-23T12:18:22.178Z",
"metadata": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/transactions', json={
"traderId": "string",
"accountId": "string",
"kind": "deposit",
"status": "pending",
"amount": "string",
"currency": "string",
"reference": "string",
"description": "string",
"externalId": "string",
"occurredAt": "2026-05-23T12:18:22.178Z",
"metadata": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/transactions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"traderId": "string",
"accountId": "string",
"kind": "deposit",
"status": "pending",
"amount": "string",
"currency": "string",
"reference": "string",
"description": "string",
"externalId": "string",
"occurredAt": "2026-05-23T12:18:22.178Z",
"metadata": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/transactions", bytes.NewReader([]byte(`{
"traderId": "string",
"accountId": "string",
"kind": "deposit",
"status": "pending",
"amount": "string",
"currency": "string",
"reference": "string",
"description": "string",
"externalId": "string",
"occurredAt": "2026-05-23T12:18:22.178Z",
"metadata": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/transactions/export.csvExport filtered transactions as CSV (max 10k rows).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/transactions/export.csv'
JavaScript
await fetch('http://localhost:4000/v1/transactions/export.csv', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/transactions/export.csv')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/transactions/export.csv');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/transactions/export.csv", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()vip-tiers
GET/v1/vip-tiersList VIP tiers + current customer counts (tenant-scoped).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/vip-tiers'
JavaScript
await fetch('http://localhost:4000/v1/vip-tiers', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/vip-tiers')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/vip-tiers", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/vip-tiersCreate a VIP tier.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "rank": 0, "min_deposit_usd": "string", "min_volume_lots": "string", "min_equity_usd": "string", "min_trades_count": 0, "evaluation_window_days": 0, "trading_group_id": "string", "perks_json": {}, "color": "slate", "is_archived": false }' 'http://localhost:4000/v1/vip-tiers'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/vip-tiers', json={
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/vip-tiers", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/vip-tiers/{id}Delete a VIP tier. Refuses if any current or historical assignment references it — archive instead.
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/vip-tiers/{id}'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/vip-tiers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/vip-tiers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/vip-tiers/{id}Fetch one VIP tier.
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/vip-tiers/{id}'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/{id}', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/vip-tiers/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/vip-tiers/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()PATCH/v1/vip-tiers/{id}Update a VIP tier.
curl
curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "slug": "string", "rank": 0, "min_deposit_usd": "string", "min_volume_lots": "string", "min_equity_usd": "string", "min_trades_count": 0, "evaluation_window_days": 0, "trading_group_id": "string", "perks_json": {}, "color": "slate", "is_archived": false }' 'http://localhost:4000/v1/vip-tiers/{id}'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/{id}', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}),
});Python
import httpx
resp = httpx.patch('http://localhost:4000/v1/vip-tiers/{id}', json={
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("PATCH", "http://localhost:4000/v1/vip-tiers/{id}", bytes.NewReader([]byte(`{
"name": "string",
"slug": "string",
"rank": 0,
"min_deposit_usd": "string",
"min_volume_lots": "string",
"min_equity_usd": "string",
"min_trades_count": 0,
"evaluation_window_days": 0,
"trading_group_id": "string",
"perks_json": {},
"color": "slate",
"is_archived": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/vip-tiers/assign-manualManually assign a tier to a customer. Marks current is_current row historical and inserts a new one with source=manual. Sticks until another manual call (auto-eval will not touch manual rows).
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "customer_id": "string", "tier_id": "string", "reason": "string" }' 'http://localhost:4000/v1/vip-tiers/assign-manual'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/assign-manual', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"customer_id": "string",
"tier_id": "string",
"reason": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/vip-tiers/assign-manual', json={
"customer_id": "string",
"tier_id": "string",
"reason": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/assign-manual');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"customer_id": "string",
"tier_id": "string",
"reason": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/vip-tiers/assign-manual", bytes.NewReader([]byte(`{
"customer_id": "string",
"tier_id": "string",
"reason": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/vip-tiers/customersList customers grouped by current tier assignment (paginated).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/vip-tiers/customers'
JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/customers', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/vip-tiers/customers')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/customers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/vip-tiers/customers", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/vip-tiers/customers/{customerId}/historyAssignment history for one customer (newest first).
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/vip-tiers/customers/{customerId}/history'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/customers/{customerId}/history', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/vip-tiers/customers/{customerId}/history')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/customers/{customerId}/history');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/vip-tiers/customers/{customerId}/history", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/vip-tiers/evaluateEvaluate one customer (body.customer_id) or all tenant customers and update assignments. Skips customers with a manual is_current assignment.
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "customer_id": "string" }' 'http://localhost:4000/v1/vip-tiers/evaluate'JavaScript
await fetch('http://localhost:4000/v1/vip-tiers/evaluate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"customer_id": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/vip-tiers/evaluate', json={
"customer_id": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/vip-tiers/evaluate');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"customer_id": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/vip-tiers/evaluate", bytes.NewReader([]byte(`{
"customer_id": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()webauthn
GET/v1/auth/passkeys
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/passkeys'
JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/auth/passkeys')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/auth/passkeys", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/auth/passkeys/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/auth/passkeys/{id}'JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/auth/passkeys/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/auth/passkeys/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/passkeys/authenticate/finishComplete passkey login — verifies the assertion + mints a session cookie identical to /auth/login.
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "response": {} }' 'http://localhost:4000/v1/auth/passkeys/authenticate/finish'JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys/authenticate/finish', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"response": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/passkeys/authenticate/finish', json={
"response": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys/authenticate/finish');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"response": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/passkeys/authenticate/finish", bytes.NewReader([]byte(`{
"response": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/passkeys/authenticate/startBegin passkey login — returns the challenge options the browser passes to navigator.credentials.get().
curl
curl -X POST -H 'Content-Type: application/json' -d '{ "email": "user@example.com" }' 'http://localhost:4000/v1/auth/passkeys/authenticate/start'JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys/authenticate/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "user@example.com"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/passkeys/authenticate/start', json={
"email": "user@example.com"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys/authenticate/start');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"email": "user@example.com"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/passkeys/authenticate/start", bytes.NewReader([]byte(`{
"email": "user@example.com"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/passkeys/register/finish
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "label": "string", "response": {} }' 'http://localhost:4000/v1/auth/passkeys/register/finish'JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys/register/finish', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"label": "string",
"response": {}
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/passkeys/register/finish', json={
"label": "string",
"response": {}
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys/register/finish');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"label": "string",
"response": {}
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/passkeys/register/finish", bytes.NewReader([]byte(`{
"label": "string",
"response": {}
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/auth/passkeys/register/start
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "label": "string" }' 'http://localhost:4000/v1/auth/passkeys/register/start'JavaScript
await fetch('http://localhost:4000/v1/auth/passkeys/register/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"label": "string"
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/auth/passkeys/register/start', json={
"label": "string"
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/auth/passkeys/register/start');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"label": "string"
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/auth/passkeys/register/start", bytes.NewReader([]byte(`{
"label": "string"
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()webhooks
GET/v1/webhooks/deliveries
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/webhooks/deliveries'
JavaScript
await fetch('http://localhost:4000/v1/webhooks/deliveries', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/webhooks/deliveries')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/deliveries');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/webhooks/deliveries", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/webhooks/deliveries/{id}/retry
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/webhooks/deliveries/{id}/retry'JavaScript
await fetch('http://localhost:4000/v1/webhooks/deliveries/{id}/retry', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/webhooks/deliveries/{id}/retry')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/deliveries/{id}/retry');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/webhooks/deliveries/{id}/retry", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/webhooks/subscriptions
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/webhooks/subscriptions'
JavaScript
await fetch('http://localhost:4000/v1/webhooks/subscriptions', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/webhooks/subscriptions')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/subscriptions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/webhooks/subscriptions", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/webhooks/subscriptions
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "url": "https://example.com", "events": [ "string" ] }' 'http://localhost:4000/v1/webhooks/subscriptions'JavaScript
await fetch('http://localhost:4000/v1/webhooks/subscriptions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"url": "https://example.com",
"events": [
"string"
]
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/webhooks/subscriptions', json={
"url": "https://example.com",
"events": [
"string"
]
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/subscriptions');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"url": "https://example.com",
"events": [
"string"
]
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/webhooks/subscriptions", bytes.NewReader([]byte(`{
"url": "https://example.com",
"events": [
"string"
]
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/webhooks/subscriptions/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/webhooks/subscriptions/{id}'JavaScript
await fetch('http://localhost:4000/v1/webhooks/subscriptions/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/webhooks/subscriptions/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/subscriptions/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/webhooks/subscriptions/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/webhooks/subscriptions/{id}/test
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/webhooks/subscriptions/{id}/test'JavaScript
await fetch('http://localhost:4000/v1/webhooks/subscriptions/{id}/test', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/webhooks/subscriptions/{id}/test')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/webhooks/subscriptions/{id}/test');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/webhooks/subscriptions/{id}/test", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()workflows
GET/v1/workflows
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/workflows'
JavaScript
await fetch('http://localhost:4000/v1/workflows', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/workflows')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/workflows');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/workflows", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()POST/v1/workflows
curl
curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' -H 'Content-Type: application/json' -d '{ "name": "string", "triggerType": "string", "condition": {}, "actions": [ {} ], "isActive": false }' 'http://localhost:4000/v1/workflows'JavaScript
await fetch('http://localhost:4000/v1/workflows', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"triggerType": "string",
"condition": {},
"actions": [
{}
],
"isActive": false
}),
});Python
import httpx
resp = httpx.post('http://localhost:4000/v1/workflows', json={
"name": "string",
"triggerType": "string",
"condition": {},
"actions": [
{}
],
"isActive": false
})
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/workflows');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"name": "string",
"triggerType": "string",
"condition": {},
"actions": [
{}
],
"isActive": false
}');
echo curl_exec($ch);Go
req, _ := http.NewRequest("POST", "http://localhost:4000/v1/workflows", bytes.NewReader([]byte(`{
"name": "string",
"triggerType": "string",
"condition": {},
"actions": [
{}
],
"isActive": false
}`)))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()DELETE/v1/workflows/{id}
curl
curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/workflows/{id}'JavaScript
await fetch('http://localhost:4000/v1/workflows/{id}', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.delete('http://localhost:4000/v1/workflows/{id}')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/workflows/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("DELETE", "http://localhost:4000/v1/workflows/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()GET/v1/workflows/{id}/runs
curl
curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/workflows/{id}/runs'JavaScript
await fetch('http://localhost:4000/v1/workflows/{id}/runs', {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});Python
import httpx
resp = httpx.get('http://localhost:4000/v1/workflows/{id}/runs')
resp.raise_for_status()
print(resp.json())PHP
$ch = curl_init('http://localhost:4000/v1/workflows/{id}/runs');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
echo curl_exec($ch);Go
req, _ := http.NewRequest("GET", "http://localhost:4000/v1/workflows/{id}/runs", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()