LumireCRM

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()

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()

tags

GET/v1/customers/{customerId}/tagsList tags currently on a customer.

curl

curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{customerId}/tags'

JavaScript

await fetch('http://localhost:4000/v1/customers/{customerId}/tags', {
  method: 'GET',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.get('http://localhost:4000/v1/customers/{customerId}/tags')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/customers/{customerId}/tags');
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/{customerId}/tags", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
DELETE/v1/customers/{customerId}/tags/{tagId}Remove a tag from a customer.

curl

curl -X DELETE --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{customerId}/tags/{tagId}'

JavaScript

await fetch('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}', {
  method: 'DELETE',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.delete('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}');
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/{customerId}/tags/{tagId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
POST/v1/customers/{customerId}/tags/{tagId}Apply a tag to a customer. Idempotent.

curl

curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/customers/{customerId}/tags/{tagId}'

JavaScript

await fetch('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.post('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/customers/{customerId}/tags/{tagId}');
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/{customerId}/tags/{tagId}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
GET/v1/tagsList customer tag definitions for the current tenant.

curl

curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tags'

JavaScript

await fetch('http://localhost:4000/v1/tags', {
  method: 'GET',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.get('http://localhost:4000/v1/tags')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/tags');
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/tags", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
POST/v1/tags

curl

curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tags'

JavaScript

await fetch('http://localhost:4000/v1/tags', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.post('http://localhost:4000/v1/tags')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/tags');
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/tags", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
GET/v1/tags/{id}

curl

curl -X GET --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tags/{id}'

JavaScript

await fetch('http://localhost:4000/v1/tags/{id}', {
  method: 'GET',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.get('http://localhost:4000/v1/tags/{id}')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/tags/{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/tags/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
PATCH/v1/tags/{id}

curl

curl -X PATCH --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tags/{id}'

JavaScript

await fetch('http://localhost:4000/v1/tags/{id}', {
  method: 'PATCH',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.patch('http://localhost:4000/v1/tags/{id}')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/tags/{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/tags/{id}", nil)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
POST/v1/tags/{id}/archiveSoft-archive a tag — keeps assignment history but hides from pickers.

curl

curl -X POST --cookie 'lumirecrm_session=REPLACE_ME' 'http://localhost:4000/v1/tags/{id}/archive'

JavaScript

await fetch('http://localhost:4000/v1/tags/{id}/archive', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
});

Python

import httpx
resp = httpx.post('http://localhost:4000/v1/tags/{id}/archive')
resp.raise_for_status()
print(resp.json())

PHP

$ch = curl_init('http://localhost:4000/v1/tags/{id}/archive');
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/tags/{id}/archive", 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()