Your account & billing¶
Everything TradLyt knows about your integration, readable with the subscription key you already have. You are billed from these numbers, so you can see them — there is no number on your invoice that isn't on this page.
These three read your whole book
Unlike the per-client endpoints, these accept only the subscription key —
never a client's relayed tlyt_ user key. A client must never be able to
enumerate your other clients.
The account¶
GET /account
Seats, enabled features, and the rate limit in force. No client data.
{
"id": "0ccb25ea-d1ad-4ea3-93ea-57d48d678276",
"name": "Acme Broking",
"slug": "acme-broking",
"key_prefix": "tlyt_sk_q7KQDjhk",
"status": "active",
"seats_purchased": 100,
"seats_used": 48,
"seats_available": 52,
"seats_peak": 48,
"seats_peak_at": "2026-10-29T02:50:58.708959+00:00",
"features": { "stats": true, "pretrade": true, "sizing": false },
"rate_limit_per_minute": null,
"effective_rate_limit": 3000,
"data_usage_consent": false,
"created_at": "2026-10-27T06:37:32.243636+00:00"
}
| Field | Type | Description |
|---|---|---|
key_prefix |
string |
First 16 characters of your key — enough to confirm which key is in use without carrying the secret. |
status |
enum |
active, or suspended (every SDK call then returns 403). |
seats_used |
integer |
Seats held right now. Falls when you deprovision. |
seats_peak |
integer |
Highest concurrent seats you have ever held, and when. seats_used is a live gauge, so this is the only record of the peak. |
features |
object |
Per-account switches. A call to a disabled feature returns 403. |
rate_limit_per_minute |
integer \| null |
Your contracted ceiling across your whole book. null means the platform default applies. |
effective_rate_limit |
integer |
What the limiter will actually enforce — read this one. |
Timestamps
Every timestamp on this page is ISO-8601 with an explicit UTC offset
(+00:00), microseconds included. Parse the offset rather than assuming a
zone. The one deliberate exception in the SDK is exit_time on
exit-analytics, which is rendered in IST
(+05:30) so it agrees with the date field beside it. period strings
(YYYY-MM) are IST calendar months — a trade at 23:00 IST on the 31st belongs
to that month, which is how every other number we show you is bucketed.
The usage report¶
GET /account/usage
The same adoption and behavioural report TradLyt sees for your account, nothing withheld: per-client TradLyt Score and trajectory, biggest leak in ₹, warnings shown and whether they were followed, activity status, best and worst instrument, which guardrails each client has armed — plus your per-endpoint API call counts and error rate.
The shape mirrors the behavioural stats response per client, inside
users[], with a book-level rollup in behaviour and the API breakdown in api.
This moves
It is computed live from current state, which is right for a dashboard and
wrong for an invoice: read September's active clients in November and the
number has changed, because clients went dormant in between. Never
reconcile an invoice against this endpoint — use /account/billing, where
a closed month is frozen.
The one field worth building a workflow around is activity.status per client:
| Status | Meaning |
|---|---|
active |
Trading at a normal cadence. |
cooling |
Still trading, but at under half last month's frequency. The one worth a phone call — they're still here, which is the point of catching it early. |
lapsing |
No trades for 30+ days. |
dormant |
No trades for 60+ days. |
no_trades |
Never traded since provisioning. |
Billing statements¶
GET /account/billing
| Parameter | Type | Description |
|---|---|---|
period |
string |
YYYY-MM for one statement. Omit to list every period plus the month in progress. |
What you are billed for¶
A seat is billable in a month if at least one SDK call named it that month.
That is the month we did work on that client's behalf. Two consequences, both deliberate:
- A seat that sat provisioned all month without a single call is not billed.
It is reported as
idle_seatsinstead. If a client washes out on day 3 of a 90-day evaluation, you pay for one month, not three. - A failed call still counts the seat. A
422from a malformed order is still work done, and the alternative would let a month be zeroed by sending bad requests.
trades_synced and warnings_shown appear on the statement as context. They are
not the basis — they come from timestamps whose meaning you control, and a
late bulk sync would otherwise bill a month twice.
One statement¶
{
"period": "2026-09",
"status": "closed",
"rule": "a seat is billable in a month if >=1 SDK call named it that month",
"billable_seats": 41,
"idle_seats": 7,
"seats_purchased": 100,
"seats_used_at_close": 48,
"total_calls": 6303,
"total_errors": 17,
"pretrade_calls": 4090,
"trades_synced": 2841,
"warnings_shown": 657,
"billable_refs": ["CLIENT00001", "CLIENT00002", "CLIENT00003", "…"],
"idle_refs": ["CLIENT00044", "CLIENT00051", "…"],
"seats": [
{ "user_ref": "CLIENT00001", "calls": 215, "pretrade_calls": 180,
"first_call_at": "2026-09-02T04:03:11.618581+00:00",
"last_call_at": "2026-09-27T09:41:02.093375+00:00" }
],
"endpoints": [
{ "method": "POST", "endpoint": "/api/v1/sdk/v1/pre-trade",
"calls": 5064, "errors": 2, "last_status": 200,
"last_call_at": "2026-09-30T10:26:51.703272+00:00" }
],
"rate_per_seat": 149.0,
"amount": 6109.0,
"currency": "INR",
"closed_at": "2026-11-01T02:00:11.512430+00:00"
}
| Field | Type | Description |
|---|---|---|
status |
enum |
closed — frozen, and will never change. Or open — the month is still running and the numbers will move. |
rule |
string |
The billable definition this statement was computed under. Stored per period, so changing the rule later never retroactively re-justifies a statement you were already invoiced for. |
billable_seats |
integer |
The number you are charged for. |
idle_seats |
integer |
Provisioned but unused this month. Not charged. |
seats_used_at_close |
integer |
Seats held when the period was frozen. |
billable_refs[] |
array |
Every user_ref that counted. Diff this against your own roster — that's what it's for. |
idle_refs[] |
array |
The provisioned clients that made no call this month, by name. These are the seats you are not being charged for. |
seats[] |
array |
The line-by-line reconciliation. One row per billable seat: user_ref, calls, pretrade_calls, first_call_at, last_call_at. If a number is ever disputed, this is the evidence for it. |
endpoints[] |
array |
Which endpoints the month's calls went to, with calls, errors and last_status each. Useful for spotting an integration that is retrying or 4xx-ing without anyone noticing. |
rate_per_seat / amount |
float \| null |
null until a rate is contracted; we never show an amount nobody agreed. |
seats[], endpoints[] and idle_refs[] are returned only when you ask for a
single period. The list view omits them to keep the payload small, and
closed_at is absent while a period is still open.
Every period¶
Omit period and you get each closed statement newest-first, plus the month in
progress so a mid-month check shows a running total rather than an empty list.
{
"rule": "a seat is billable in a month if >=1 SDK call named it that month",
"periods": [
{ "period": "2026-10", "status": "open", "billable_seats": 38, "…": "…" },
{ "period": "2026-09", "status": "closed", "billable_seats": 41, "…": "…" }
]
}
A period is closed automatically on the 1st of the following month. Until then it
reads open, and billable_seats is a running count.
Errors¶
| Code | Meaning |
|---|---|
401 |
Missing or invalid subscription key. |
403 |
Account suspended, or a client's user key was used instead of the subscription key. |
422 |
period is not a valid YYYY-MM. Returned rather than an empty statement, which would read as "you owe nothing". |