Usage is how much of Livqeno your account has used: call minutes, chat messages, and live-streaming time. On the Free plan, usage is counted against fixed free allowances; on a paid plan the same amounts are included every month and usage past them is billed. Read this page before you launch, so you can estimate whether your app fits, and so your app handles the "allowance used up" error well.
You don't report usage yourself. Livqeno counts it on its own servers every time someone joins a call, sends a message, or hosts a stream.
Every Livqeno account gets three separate free allowances:
| Product | Included | Unit |
|---|---|---|
| RTC | 10,000 | participant-minutes/account |
| Chat | 100,000 | messages/account |
| Live Streaming | 100 | host-hours/account |
- Each one is counted on its own. Using up chat doesn't touch your RTC minutes, and the other way around.
- See all three in the dashboard under Usage.
RTC: participant-minutes
One participant-minute = one person in one room for one minute.
| Call | Minutes used |
|---|---|
| 2 people for 10 minutes | 20 |
| 3 people for 10 minutes | 30 |
Planning example: a telehealth app with 30-minute, two-person visits uses 2 × 30 = 60 participant-minutes per visit. 10,000 minutes covers about 166 visits.
- If someone drops and rejoins, each session counts only for the time they were connected.
- Live streaming hosts and viewers don't count here. Live streaming has its own allowance (below).
Chat: messages
One message = one message, counted once when the server saves it. Not once per person who receives it. A message to 100 members still counts as 1.
User A sends "hello" → 1 chat message
User B sends "hi" → 1 chat message
Total → 2 chat messagesThese don't count: typing indicators, presence, read and delivery receipts, and reactions. Only sent messages count.
Retries never count twice. The SDK adds a clientMessageId to every
message. A retried send returns the original message and uses nothing new,
even an hour later on another connection. See Chat messages.
Live Streaming: host-hours
Live streaming has its own 100 host-hours. Only the time a host or co-host is actually connected counts, not how long the stream lasts.
Stream starts: 10:00
Host leaves: 10:37
→ 37 minutes of host-hours consumed
Host reconnects:
10:00 → 10:20 = 20 min
10:25 → 10:40 = 15 min
→ 35 minutes consumed — the 5-minute gap is excluded- Two co-hosts streaming for an hour each = 2 host-hours.
- Viewers never use anything. Not host-hours, not RTC minutes. 100 viewers or none, the cost is the same.
100 viewers watching for 1 hour
does NOT consume 100 × 60 minutes of anything.
The host's connected time is the only thing metered.Stream limits (separate from the allowance)
Free-plan accounts can also own up to 3 active projects. Creating a fourth
fails with 403 RAVEN_PROJECT_LIMIT_EXCEEDED. Archiving or deleting a project
frees a slot, projects you already have are never removed, and paid plans have
no project limit.
Every stream also has these limits:
| Limit | Default | What happens |
|---|---|---|
| Live streams at once | 1 | One LIVE stream per account, across all your projects and environments. A second fails with 403 RAVEN_STREAM_CONCURRENCY_LIMIT_EXCEEDED until the first ends. |
| Viewers per stream | 100 | The 101st viewer token fails with 403 RAVEN_STREAM_VIEWER_LIMIT_EXCEEDED. |
| Stream length | 4 hours | A stream still LIVE after 240 minutes is ended automatically. |
Hitting one of these means "not right now". It does not mean your allowance is used up.
How RTC and live-streaming time is measured
Livqeno's servers measure the time with their own clock:
- The meter starts when Livqeno accepts the join: the token is checked, a media server is assigned, and it confirms the participant. Livqeno also decides then whether it counts as RTC, host-hours, or nothing (viewers), using its own data, never what the app claims.
- It's updated regularly during the call, and again when the person leaves.
- If a server crashes, the session is counted only up to the last moment it was confirmed alive. You aren't charged for a Livqeno outage.
Your app can't change its own usage. The SDK never reports usage, and no request contains a duration or message count.
Usage won't exactly match connection times. Connection records come from best-effort app telemetry and are for debugging. When they differ, the usage figure is the correct one.
Whose allowance is used
Always the project owner's, for all three products.
If you're added to someone else's project, your work there uses their allowance, not yours. The project's usage page tells you when you're viewing a project you don't own.
Reading your usage
Use the dashboard, or call the API with a dashboard session:
curl https://api.livqeno.com/v1/usage \
-H "Authorization: Bearer $SESSION_JWT"{
"includedMinutes": 10000,
"usedMinutes": 4812,
"remainingMinutes": 5188,
"usedPercent": 48.1,
"exhausted": false,
"exhaustedAt": null,
"enforced": true,
"source": "FREE_TIER",
"grantedAt": "2026-02-14T09:12:04.881Z",
"usedSeconds": 288721,
"liveSessions": 2,
"chat": {
"used": 43200,
"limit": 100000,
"unit": "messages"
},
"liveStreaming": {
"hostHoursUsed": 37,
"hostHoursLimit": 100,
"concurrentStreams": 1,
"maxConcurrentStreams": 1,
"maxViewers": 100,
"maxStreamDurationMinutes": 240
}
}- RTC numbers are at the top level (
includedMinutesand so on). Older code that reads them still works. - Chat and Live Streaming are in the
chatandliveStreamingfields.
Other endpoints:
| Endpoint | What it adds |
|---|---|
GET /v1/usage/detail | RTC session history, a daily summary, and a per-project breakdown. Chat and Live Streaming get totals only, no history yet. History is paged: pass limit (1–200, default 50) and offset, and read the total from historyPage.total. |
GET /v1/projects/{projectId}/usage | RTC numbers for one project. chat and liveStreaming stay account-wide. |
See the Observability API reference.
When an allowance runs out
Each allowance is enforced on its own. Running out of one never affects the others.
| Runs out | What's refused |
|---|---|
| RTC | New RTC tokens (POST /v1/rooms/{roomId}/rtc-tokens returns 403 RAVEN_USAGE_LIMIT_EXCEEDED) and new room joins (signaling error frame, USAGE_LIMIT_EXCEEDED). |
| Chat | New messages, when sent. Same code and status. |
| Live Streaming | Adding a new host or co-host. Same code and status. Viewers aren't affected. |
What keeps working:
- Anything already running. A live call is never cut off. A message already accepted isn't rejected later. So your total can end up a little over the limit.
- Everything else: projects, API keys, the parts of Chat and Live Streaming that didn't run out, webhooks, observability, and the dashboard.
So treat it as a final error. Don't retry:
try {
const grant = await livqeno.tokens.create({ room: roomId, identity: 'alice' });
} catch (err) {
if (err.code === 'RAVEN_USAGE_LIMIT_EXCEEDED') {
// Retrying will not help — nothing frees up over time.
// The allowance figures ride on the error, so no second request is needed.
return showOutOfAllowance(err.details.product, err.details.remaining);
}
throw err;
}The error includes product, unit, included, used, and remaining.
The RTC error also includes the older includedMinutes, usedMinutes, and
remainingMinutes, so older code keeps working.
Don't mix these up:
| Error | Meaning |
|---|---|
RAVEN_USAGE_LIMIT_EXCEEDED | You're out of allowance. Final. |
RAVEN_STREAM_CONCURRENCY_LIMIT_EXCEEDED | Too many live streams right now. Try after one ends. |
RAVEN_STREAM_VIEWER_LIMIT_EXCEEDED | This stream is full of viewers. |
RAVEN_BILLING_SPEND_CAP_REACHED | Paid plan: this month reached the spend cap you set. Raise or clear it in Billing. |
RAVEN_BILLING_ACCOUNT_SUSPENDED | Paid plan: an invoice is unpaid past its grace period. Pay it in Billing. |
All allowances and limits are set by Livqeno. There's nothing to configure in your project.
Paid plans
Pick a plan in the dashboard under Billing, or compare them on the pricing page. On a paid plan:
- The free amounts above are included every month, and usage past them is billed per 1,000 minutes or messages instead of being refused.
- The live-streaming free-tier caps (one live stream at a time, 100 viewers, 4 hours per stream) don't apply to streams started on the plan.
- You can set a monthly spend cap. New sessions are refused with
RAVEN_BILLING_SPEND_CAP_REACHEDonce the month's total reaches it. Calls already in progress are never cut off.
Prices
Per 1,000 units. INR prices are before 18% GST.
| Usage | USD | INR | Included each month |
|---|---|---|---|
| RTC minutes, up to 720p received | $2.49 | ₹199 | 10,000 RTC minutes, shared by all three RTC rates |
| RTC minutes, audio-only | $0.79 | ₹49 | (same pool) |
| RTC minutes, Full HD received | $5.99 | ₹479 | (same pool) |
| Live host minutes | $2.49 | ₹199 | 6,000 |
| Live viewer minutes | $0.99 | ₹79 | 10,000 |
| Chat messages | $0.10 | ₹8 | 100,000 |
| HLS / restream encode minutes | $15 | ₹1,200 | 60 |
| Recording minutes | $9 | ₹720 | 60 |
How minutes are counted:
- RTC minutes: every participant's time in a call. A minute is audio-only when nobody else in the room is sending video, and Full HD when the video that participant receives adds up to more than 1280×720. The included minutes go to the most expensive rate first.
- Viewer minutes: real-time viewers are counted once a minute, on the
origin room and its edges. HLS viewers are counted from the SDK player's
heartbeat, every 30 seconds while the video is playing. Use the SDK
players, or forward
playback.beaconfrom the credential to your own player. - Host, encode and recording minutes: measured exactly, as before.
| Plan | Monthly fee | What you get |
|---|---|---|
| Pay as you go | none | Usage only |
| Startup | $49 / ₹2,999 | The fee comes back as usage credit |
| Growth | $499 / ₹39,999 | The fee comes back as usage credit, and 15% off all usage |
| Enterprise | by contract | Contact us |
USD accounts pay by card (Stripe). INR accounts get a payable invoice link each month (Razorpay: UPI, cards, netbanking). Invoices are monthly, and the dashboard shows this month's running estimate, rated exactly as the invoice will be.