Skip to content

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_seats instead. 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 422 from 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".