nimeet Docs
中文

Troubleshooting

Symptom-first index: join failures, no video, missing recordings, missing callbacks, token expiry, CORS and firewalls.

Version v1.1.0 · Updated 2026-10-26 · revision 1

Indexed by the symptom you see. Every row states what to check first, how to check it, and what the root cause is — do not change code on a hunch.

Joining and authentication

SymptomCheck firstCommon root causeFix
401 missing_authorizationrequest headersAuthorization: Basic … was left outadd base64(customerId:customerSecret)
401 invalid_credentialsthe credentials page in the consolethe secret is the old value from before rotationupdate the environment variables and restart the service
401 invalid_appidwhether customerId and appId belong to the same projectcredentials reused across projectsone set of credentials per project
400 invalid_channel_namethe channel-name character setcontains spaces/non-ASCII/too longuse [A-Za-z0-9_-], ≤128
403 bannedGET /dev/v1/kicking-rulematched a join_channel bandelete the ban rule
403 service_not_enabledthe project services pagerecording/streaming not enabledenable it and retry
SDK reports -110 / INVALID_TOKENGET /v1/tokens/verify?token=&channelName=the token does not match the channel/appId, or has expiredissue a new one; check pexp
SDK reports -109 / TOKEN_EXPIREexp in the token payloadthe token lifetime is overrejoin with a new token
Kicked right after joiningcallback log 104/108the same uid joined somewhere else (uid conflict)use a unique uid per client

Media and video

SymptomCheck firstCommon root causeFix
Audio only, no videothe user-published callbackno subscribe, or no play(containerId)add the subscribe and render calls
The local preview is black but the remote side can see itcameraTrack.play()the container id does not exist or has zero sizecheck the DOM/container and the CSS
The other side cannot see mewhether publish succeededaudience role / the token has no publish_* privilegesswitch to the host role and re-issue the token
Stuck in RECONNECTINGthe SFU address resolution chainthe reverse proxy does not allow WebSocketenable Upgrade pass-through
Screen share is blackthe capture sourceprotected window / macOS permission missingshare the whole screen; grant permission in System Settings and restart
Stutters on a weak network without degradingwhether dual stream is onthe publisher did not enable dual streamenableDualStream()
Video is upside down or mirroredthe render layerfront-camera mirroringadjust mirrorMode

Recording

SymptomCheck firstCommon root causeFix
403 service_not_enabledproject servicesrecording not enabledenable it
429 recording_quota_exceededdetails.limit / details.activeconcurrent recordings at the capqueue, or raise the quota — see Quota
start fails after acquirethe time gapresourceId has only a 30-second TTLstart immediately; do not store it for later
The job stays startingGET /v1/recordings/{id}the egress node is unavailable / the queue is fullcheck the operator surface
Recording completes but the file 404sstorage vendor configurationbucket permissions or path prefix are wrongrun the recording-storage self-check
The recording is blacknobody publishing in the channelnobody was on stage when recording startedjoin first, then record, or extend the wait

Streaming / pulling / gateway

SymptomCheck firstCommon root causeFix
converter state=failedthe error in callback 202the RTMP address refused the connectionverify the address with ffmpeg/OBS
OBS ingest rejectedstreamkeyexpired, channel mismatch, or the template does not existre-issue the streamkey
The stream is in the channel but not visibleonline-streamsthe ingest never established a sessioncheck the gateway handshake log and sid
Pull status=failedthe player detail errorthe source address is unreachable (private network/localhost)switch to a URL the server can reach
Pulled video has no audioaudioOptionsmuted by default, or the track is missingcheck whether the source has an audio track

Callbacks

SymptomCheck firstCommon root causeFix
Nothing arrives at allwebhook configurationnot configured / enabled:falseconfigure it in the console
It arrives but signature verification failswhich body you verifyre-serializing after deserializationverify against the raw bytes
Only some events arrivethe subscribed event listthe event is not tickedadd the subscription
The delivery log is all 4xxyour receiverpath 404 / missing Content-Typefix the receiver
Gives up after 9 retriesdelivery logthe receiver returned 5xx for a long timefix it, then replay manually

Self-check order

  1. Is the API alive? curl -s $NIMEET_API_BASE/healthz
  2. Do the credentials work? Issue a token with POST /v1/tokens and verify it with GET /v1/tokens/verify.
  3. Does the full path work? Join a channel with the Web SDK or a client SDK and publish a track.
  4. Do callbacks arrive? Configure the webhook and check GET /v1/webhook/deliveries.

If everything is green and you still cannot pin the problem down, include the X-Request-Id and the time of the error in your support request — every server log, callback delivery and audit record carries that id.

Generated by the documentation build pipeline · 2026-10-31 01:24:02 UTC · Documentation center v1.1.0.

Content follows the public API definitions.

ni-meet is a self-hosted RTC PaaS with a LiveKit-based media plane (Apache-2.0) and an Agora-compatible API.