nimeet Docs
中文

Error Codes

Every REST error code with HTTP status, category, SDK error number, retryability and cause, generated from the public error-code definition.

Generated from the public error-code definitions

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

How to handle errors

  1. Start with the HTTP status: 401/403 check credentials, service activation and ban rules; 404 confirm the resource;

409 query the current state first; 415 add Content-Type; 429 back off; 5xx back off and keep the X-Request-Id.

  1. Then branch on code: it is the stable machine code and is safe for retry decisions and alert classification.
  2. On the SDK side branch on sdkCode, so code migrating from Agora can reuse existing checks.

Error envelope

Every failed REST call returns the same envelope. code is the stable machine code (see the table below), message and reason are human-readable reasons (covering both the Agora RTC REST habit of reading message and the cloud-recording habit of reading reason), and sdkCode is the numeric error number exposed to clients.

json
{
  "code": "recording_quota_exceeded",
  "message": "recording concurrency limit reached",
  "reason": "recording concurrency limit reached",
  "sdkCode": 22,
  "details": {
    "limit": 5,
    "active": 5
  }
}

The response always echoes X-Request-Id, which is the same id used in logs, callbacks and audit records; include it when troubleshooting.

Generated at build time from the public error-code definition: 42 error codes, plus the success entry ok (HTTP 200) which is not counted.

Full error-code table

retryable is currently always false: the field is advisory in the error-code definition and is not yet set per error code. The table keeps the original values (the retryable column); follow the HTTP-semantic guidance in the “Retry guidance” column, and see FAQ and limits.

codeHTTPsdkCodeSDK constantCategoryretryableMeaningRetry guidance
invalid_channel_name400-102ERR_INVALID_CHANNEL_NAMEValidationfalseinvalid channel nameFix the request before retrying
invalid_parameter400-2ERR_INVALID_ARGUMENTValidationfalseinvalid parameterFix the request before retrying
RTC_TOKEN_INVALID_REQUEST400-2ERR_INVALID_ARGUMENTValidationfalseinvalid RTC token requestFix the request before retrying
RTC_UID_MAPPING_INVALID_REQUEST400-2ERR_INVALID_ARGUMENTValidationfalseinvalid RTC uid mapping requestFix the request before retrying
invalid_appid401-101ERR_INVALID_APP_IDAuthenticationfalseinvalid appidCheck credentials or refresh the token; do not retry unchanged
invalid_credentials401-110ERR_INVALID_TOKENAuthenticationfalseinvalid credentialsCheck credentials or refresh the token; do not retry unchanged
invalid_token401-110ERR_INVALID_TOKENAuthenticationfalseinvalid tokenCheck credentials or refresh the token; do not retry unchanged
missing_authorization401-110ERR_INVALID_TOKENAuthenticationfalsemissing Authorization headerCheck credentials or refresh the token; do not retry unchanged
token_channel_mismatch401-110ERR_INVALID_TOKENAuthenticationfalsetoken does not match channelCheck credentials or refresh the token; do not retry unchanged
token_expired401-109ERR_TOKEN_EXPIREDAuthenticationfalsetoken expiredCheck credentials or refresh the token; do not retry unchanged
token_not_yet_valid401-110ERR_INVALID_TOKENAuthenticationfalsetoken not yet validCheck credentials or refresh the token; do not retry unchanged
token_privilege_expired401-109ERR_TOKEN_EXPIREDAuthenticationfalsetoken privilege expiredCheck credentials or refresh the token; do not retry unchanged
token_uid_mismatch401-110ERR_INVALID_TOKENAuthenticationfalsetoken does not match uidCheck credentials or refresh the token; do not retry unchanged
unauthorized401-9ERR_NO_PERMISSIONAuthenticationfalseauthentication requiredCheck credentials or refresh the token; do not retry unchanged
app_disabled403-101ERR_INVALID_APP_IDAuthenticationfalseapp is disabledCheck ban rules, service activation and key rotation
banned403-17ERR_JOIN_CHANNEL_REJECTEDAuthenticationfalseuser is banned by a kicking ruleCheck ban rules, service activation and key rotation
join_rejected403-17ERR_JOIN_CHANNEL_REJECTEDAuthenticationfalsejoin channel rejectedCheck ban rules, service activation and key rotation
RTC_TOKEN_DENIED403-17ERR_JOIN_CHANNEL_REJECTEDAuthenticationfalseRTC token deniedCheck ban rules, service activation and key rotation
service_not_enabled403-1ERR_FAILEDAuthenticationfalseservice is not activated for this projectCheck ban rules, service activation and key rotation
channel_not_found404-113ERR_NOT_IN_CHANNELNot foundfalsechannel not foundConfirm the resource exists (channel / job / rule)
collaborator_not_found404-1ERR_FAILEDNot foundfalsecollaborator not foundConfirm the resource exists (channel / job / rule)
outbox_not_found404-1ERR_FAILEDNot foundfalseoutbox event not foundConfirm the resource exists (channel / job / rule)
project_not_found404-1ERR_FAILEDNot foundfalseproject not foundConfirm the resource exists (channel / job / rule)
recording_not_found404-1ERR_FAILEDNot foundfalserecording task not foundConfirm the resource exists (channel / job / rule)
streaming_not_found404-1ERR_FAILEDNot foundfalsestreaming task not foundConfirm the resource exists (channel / job / rule)
user_not_found404-113ERR_NOT_IN_CHANNELNot foundfalseuser not in channelConfirm the resource exists (channel / job / rule)
webhook_not_found404-1ERR_FAILEDNot foundfalsewebhook endpoint not foundConfirm the resource exists (channel / job / rule)
already_in_channel409-19ERR_ALREADY_IN_USEConflictfalseparticipant already in channelQuery the current state before deciding to retry
project_exists409-1ERR_FAILEDConflictfalseproject already existsQuery the current state before deciding to retry
recording_invalid_state409-8ERR_INVALID_STATEConflictfalserecording task is not in a valid state for this operationQuery the current state before deciding to retry
streaming_invalid_state409-8ERR_INVALID_STATEConflictfalsestreaming task is not in a valid state for this operationQuery the current state before deciding to retry
unsupported_media_type415-4ERR_NOT_SUPPORTEDValidationfalseunsupported media typeSet Content-Type: application/json
rate_limited429-12—Rate limittruetoo many requestsRetry with exponential backoff (quota or rate limit)
recording_quota_exceeded429-22—Quotatruerecording concurrency quota exceededRetry with exponential backoff (quota or rate limit)
streaming_quota_exceeded429-22—Quotatruestreaming concurrency quota exceededRetry with exponential backoff (quota or rate limit)
internal_error500-1ERR_FAILEDInternal errortrueinternal server errorRetry with backoff; if it persists, report it with the X-Request-Id
recording_upstream_error502-1ERR_FAILEDUpstream dependencytrueegress upstream errorUpstream (Egress/RTMP) failure; retry with backoff
streaming_upstream_error502-1ERR_FAILEDUpstream dependencytruertmp upstream errorUpstream (Egress/RTMP) failure; retry with backoff
no_server_resources503-103ERR_NO_SERVER_RESOURCESUpstream dependencytrueno server resourcesDependency unavailable; retry with backoff
RTC_PROVIDER_DISABLED503-1ERR_FAILEDUpstream dependencytrueRTC provider is disabled by configurationDependency unavailable; retry with backoff
RTC_PROVIDER_UNAVAILABLE503-111ERR_CONNECTION_INTERRUPTEDUpstream dependencytrueRTC provider unavailableDependency unavailable; retry with backoff
upstream_unavailable503-111ERR_CONNECTION_INTERRUPTEDUpstream dependencytrueupstream service unavailableDependency unavailable; retry with backoff

Error numbers are stored as positive values in the interface definition; the SDK facade exposes the negative constant with the same absolute value through SdkErrorCode (for example invalid_appid → 101 → -101 ERR_INVALID_APP_ID). Same meaning, different sign: compare by absolute value across layers.

Agora error numbers visible to the SDK

The SDK facade (@nimeet/rtc-web and the equivalent platform wrappers) reports failures as { code, sdkCode, message, retryable }, where sdkCode uses the negative values below so applications migrating from Agora can keep their existing error branches. REST never returns negative values; it aligns through the positive sdkCode in the table above.

sdkCodeConstantMeaningMatching REST error code
-1ERR_FAILEDGeneric failure (unmapped fallback)No direct REST equivalent (connection layer)
-2ERR_INVALID_ARGUMENTInvalid argumentNo direct REST equivalent (connection layer)
-3ERR_NOT_READYSDK is not readyNo direct REST equivalent (connection layer)
-4ERR_NOT_SUPPORTEDCapability not supported on this platformNo direct REST equivalent (connection layer)
-5ERR_REFUSEDCall refusedNo direct REST equivalent (connection layer)
-7ERR_NOT_INITIALIZEDNot initialisedNo direct REST equivalent (connection layer)
-8ERR_INVALID_STATEOperation not allowed in the current stateNo direct REST equivalent (connection layer)
-9ERR_NO_PERMISSIONNo permissionNo direct REST equivalent (connection layer)
-10ERR_TIMEDOUTTimed outNo direct REST equivalent (connection layer)
-17ERR_JOIN_CHANNEL_REJECTEDJoin rejectedNo direct REST equivalent (connection layer)
-18ERR_LEAVE_CHANNEL_REJECTEDLeave rejectedNo direct REST equivalent (connection layer)
-19ERR_ALREADY_IN_USEAlready in the channel / resource in useNo direct REST equivalent (connection layer)
-101ERR_INVALID_APP_IDInvalid App IDNo direct REST equivalent (connection layer)
-102ERR_INVALID_CHANNEL_NAMEInvalid channel nameNo direct REST equivalent (connection layer)
-103ERR_NO_SERVER_RESOURCESInsufficient server resourcesNo direct REST equivalent (connection layer)
-109ERR_TOKEN_EXPIREDToken expiredNo direct REST equivalent (connection layer)
-110ERR_INVALID_TOKENInvalid tokenNo direct REST equivalent (connection layer)
-111ERR_CONNECTION_INTERRUPTEDConnection interrupted (auto reconnect)No direct REST equivalent (connection layer)
-112ERR_CONNECTION_LOSTConnection lost (rejoin required)No direct REST equivalent (connection layer)
-113ERR_NOT_IN_CHANNELNot in a channelNo direct REST equivalent (connection layer)

The facade adds codes that do not come from Agora: RTC_RECONNECTING, RTC_PUBLISH_DENIED and RTC_DEVICE_NOT_FOUND. Disconnect reason -111 reconnects automatically; -112 requires joining again.

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.