Console Guide
Sign-in, projects, key rotation, service enablement, token builder, usage, analytics, webhooks, members and audit.
The console is the self-hosted admin UI: sign in, create projects, obtain credentials, enable services, generate tokens, review usage and Analytics, configure webhooks, and manage members and audit. This page is organised around what you do in the UI, and every action comes with the equivalent REST call so you can script it.
Routes and pages
| Page | Path | What you can do |
|---|---|---|
| Sign in | /login | Sign in with email and password to get a session |
| Project list | /projects | View and open projects |
| New project | /projects/new | Create a project, choose the services to enable, set quotas |
| Project overview | /p/:projectId/overview | Channel count, task count, usage over the last 24h |
| Settings | /p/:projectId/settings | Rename, quotas, rotate keys |
| Services | /p/:projectId/services | Enable/disable recording, streaming, and so on |
| Token generator | /p/:projectId/tokens | Generate and verify debug tokens |
| Webhook | /p/:projectId/webhook | Configure the URL and secret, inspect the delivery log, replay |
| Members | /p/:projectId/collaborators | Add/remove collaborators and their roles |
| Audit | /p/:projectId/audit | Who changed what, and when |
| Usage | /p/:projectId/usage | Minutes and amount by hour/day/month |
| Analytics | /p/:projectId/crystal-ball | Real-time monitoring, quality, call investigation, data insights |
| Recordings | /p/:projectId/recordings | Recording task list and status |
| Streams | /p/:projectId/streams | Stream task list and status |
First things first: create a project and save its credentials
In the UI: /projects/new → fill in a name → tick the services to enable → create.
customerSecret and appCertificate are shown only once; close the dialog and they are gone for good. Store them in your secret manager immediately. If you lose them, rotation is the only remedy (see below).
Equivalent call:
curl -s -X POST "$NIMEET_API_BASE/console/projects" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION" \
-H 'Content-Type: application/json' \
-d '{"name":"my-project","services":{"recording":true,"streaming":true}}'Key rotation (the most dangerous operation)
Entry point: the project settings page → rotate Customer Secret / App Certificate. You can also call:
curl -s -X POST "$NIMEET_API_BASE/console/projects/$PROJECT_ID/keys/rotate" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION" \
-H 'Content-Type: application/json' \
-d '{"scope":"all"}'scope accepts all / customerSecret / appCertificate. After rotation:
- if
customerSecretchanged → every server-side Basic call returns 401 immediately, so update your server configuration before rotating; - if
appCertificatechanged → every token already issued becomes invalid immediately, and clients in an active call are disconnected at the next expiry check.
Recommended rhythm: announce one hour ahead → update the server configuration → rotate → watch the 401 invalid_token curve → have clients renew or reconnect proactively.
Enabling services
Entry point: the project services page. Once a service is disabled, the corresponding endpoints return 403 service_not_enabled (there is no silent degradation).
curl -s -X POST "$NIMEET_API_BASE/console/projects/$PROJECT_ID/services" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION" \
-H 'Content-Type: application/json' \
-d '{"recording":true,"streaming":false}'Token generator
Entry point: the Token generator page; fill in channel name / uid / role / TTL, and after generating you can copy the token straight into a debug client. While generating you can also click "Verify" to read the privilege bits and expiry back (equivalent to GET /v1/tokens/verify).
curl -s -X POST "$NIMEET_API_BASE/console/projects/$PROJECT_ID/token" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION" \
-H 'Content-Type: application/json' \
-d '{"channelName":"weekly-sync","uid":10001,"role":"host","ttlSeconds":600}'Webhook configuration and delivery log
Entry point: the Webhook page → fill in the URL and secret → select events → save. Saving triggers a test delivery immediately (X-Request-Id can be used to trace it).
curl -s -X PUT "$NIMEET_API_BASE/console/projects/$PROJECT_ID/webhook" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION" \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com/hooks/nimeet","secret":"$WEBHOOK_SECRET","events":["channel_create","user_join"],"enabled":true}'
# delivery log (failure reason, response code, retry count)
curl -s "$NIMEET_API_BASE/console/projects/$PROJECT_ID/webhook/deliveries?limit=20" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION"
# replay one failed delivery
curl -s -X POST "$NIMEET_API_BASE/console/projects/$PROJECT_ID/webhook/deliveries/$DELIVERY_ID/replay" \
-H "Authorization: Bearer $NIMEET_CONSOLE_SESSION"Signature and retry semantics are in Callback integration.
Members and audit
- The members page lets you add/remove collaborators and assign roles (
owner/admin/developer/viewer); - The audit page lists project-level changes in reverse chronological order (who, when, what changed); it is commonly used for accountability and troubleshooting after a key rotation;
- Both actions have REST equivalents:
/console/projects/{projectId}/collaboratorsand/console/projects/{projectId}/audit.
Usage and Analytics
- Usage page:
minutesand the amount by hour/day/month; the definitions are in Billing model; - Analytics page: real-time curves for the last 30 minutes, quality distribution, call investigation, data insights; the definitions are in Analytics;
- Both draw on the same API as the console, so the numbers you see on the page can be reproduced directly over REST.
FAQ
| Symptom | Cause | Fix |
|---|---|---|
| 401 when signing in | Wrong email/password, or the seeded password was changed | Check CONSOLE_SEED_PASSWORD |
| Empty project list | The session belongs to another account | Sign out and sign in again |
| Credentials not visible | They are returned once and the dialog was closed | Rotate the keys |
| Everything returns 401 after rotation | The server still uses the old secret | Update the environment variables and restart |
| Empty delivery log | The event has not happened yet, or the service is not enabled | Trigger a join and check again |
| Usage numbers are 0 | Wrong time window (it defaults to today) | Switch the time window |