nimeet Docs
中文

REST API Overview and Conventions

Authentication, envelopes, pagination, errors, idempotency, request tracing and the product endpoint index.

Generated from the public REST API definitions

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

This page is the entry point to the REST API Reference. Every API table is generated at build time from the public REST API definition: the product groups below, and the methods / paths / parameters / request bodies / responses / curl on each group page, are rendered straight from the interface definition by a script — there is no hand-copied interface list.

Prerequisites and request example

  • Base URL: https://api.your-domain.example (an example value; replace it with your control-plane address).
  • Authentication: server-side calls use Authorization: Basic base64(customerId:customerSecret); console calls use Authorization: Bearer <session>.
  • Request headers: write requests must send Content-Type: application/json; include X-Request-Id to simplify troubleshooting.
  • Response: a successful call returns the resource object; a failure returns the unified error envelope { code, message, reason, sdkCode, details? }.
bash
curl -s https://api.your-domain.example/v1/tokens \
  -u "$CUSTOMER_ID:$CUSTOMER_SECRET" \
  -H 'Content-Type: application/json' \
  -d '{"channelName":"weekly-sync","uid":10001,"role":"host","ttlSeconds":3600}'

When to use REST and when to use an SDK

ScenarioUseNotes
A client joins, publishes and subscribesClient SDKSee the SDK platform overview; the token is signed by your backend
Server issues or renews a tokenPOST /v1/tokensRequires the project Basic credential (customerId:customerSecret)
Server queries channels / kicks / mutes/v1/channels/*Semantic paths; for the Agora equivalents see Agora-compatible channels
Server starts recording / media push / media pull / transcodingThe matching product groupAll follow the "task" model: create → query → stop/destroy
Retrieving quality and usage data/v1/analytics/*See Analytics for the metric definitions
Used by the console pages themselves/console/*Console BFF, the browser holds a Bearer session

Permission and credential boundaries

CredentialWhere it appearsWho can see it
appIdClient SDK initializationPublic (can be shipped to browsers/apps)
customerId / customerSecretAuthorization: Basic base64(...)Server side only; rotate immediately if leaked
appCertificateUsed only to sign tokensServer side only, never distributed
Console sessionAuthorization: Bearer <session>The console frontend

What each group page contains

  • The operation index for that group (method / path / summary, clickable);
  • For every operation: a parameter table (name/location/required/type/constraints), request body field table plus example, response table, and a copy-ready curl;
  • The components.schemas used by that group (field tables expanded from the interface definition).

Relationship to other pages

  • Error envelope and error codes: full error-code table (generated from the errors interface definition).
  • Callback (webhook) events: callback event reference (generated from the callbacks interface definition).
  • End-to-end runnable scripts: the bundled examples scripts; see Quickstart for how to run them.

Next steps

Authentication

Credential familiesUsageDescription
projectBasicbasicHeader Authorization: Basic base64(customerId:customerSecret),matches the Agora RESTful API.
consoleBearerbearerHeader Authorization: Bearer <session>,call POST /console/auth/login。
opsTokenbeareroperator token (NIMEET_OPS_TOKEN), required by the /internal/ops/** surface; when the token is unset that surface is closed
sfuWebhookSignatureapiKeySFU webhook signature verified by the media adapter (see verifyAndParseWebhook); a bad or missing signature is rejected with invalid_token

Project credentials(Basic)must stay on the server; browsers/mobile clients only hold { appId, rtcToken, rtcUid }。

Common conventions

  • write operations(POST/PUT/PATCH)must carry Content-Type: application/json,otherwise returns 415 unsupported_media_type。
  • list pagination uses page_no(0-based)and page_size(1..500,default 100)。
  • failure responses use the unified { code, message, reason, sdkCode, details? },for the complete error catalogue see Error codes。
  • every response echoes X-Request-Id,include it first when troubleshooting.
  • Agora-compatible paths use the /dev/v1/*、/v1/apps/{appid}/cloud_recording/*、/v1/projects/{appid}/fls/* prefix, the response uses Agora's success/data、{resourceId,sid,serverResponse} envelope.
  • Idempotency: duplicate submissions of create endpoints may return the same resource; query the current state before retrying a failed write (see Error codes 's 409 Description)。

Product groups and operation index

189 operations, 15 product groups, Each group has its own page:

tag (page)DescriptionOperations
tokensToken issuance, renewal, verification and uid mapping (IM integration).5
channelsChannel and participant queries plus moderation.7
ban-rulesKicking rules (Agora `kicking-rule` semantics).4
agora-channelAgora-compatible RTC REST surface (`/dev/v1`).8
recordingsCloud recording tasks and Agora-compatible cloud_recording flow.13
streamingBypass RTMP/HLS streaming tasks.10
webhooksCallback endpoint configuration, delivery log and ingest.1
analyticsCrystal Ball: real-time monitoring, usage, quality, call search and data insights.7
consoleConsole BFF: sessions, projects, keys, services, collaborators, audit.80
media-pushMedia Push: converters that push one RTC channel to a CDN address.5
media-gatewayMedia Gateway: RTMP ingress streaming keys, flow configuration templates and online streams.12
media-pullMedia Pull: cloud players that pull an online media stream into an RTC channel.6
cloud-transcodingCloud Transcoding: builder tokens, transcoding tasks and adaptive-bitrate templates.7
notificationsMessage-notification service addresses (firewall allow-list).2
whiteboardInteractive Whiteboard rooms, scenes, content, replay and tokens.22

Schema dictionary

components.schemas declarations and reference counts:

  • Referenced by operations: 68
  • Total declarations (including aliases):58

Each group page also expands the schemas used by that group.

AgoraRecordingFile — object{ fileName, duration, size }
FieldTypeRequiredDescription
fileNamestringis
durationnumberisseconds; 0 while the file is still being written
sizenumberisbytes; 0 while the file is still being written
AgoraRecordingLayout — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, layout }is
AgoraRecordingQuery — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, status, fileList, error }is
AgoraRecordingResource — object{ resourceId }
FieldTypeRequiredDescription
resourceIdstringissingle-use marker valid for 30 s; pass it to start
AgoraRecordingStart — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringisour recording task id (Agora calls it sid)
serverResponseobject{ taskId, state }is
AgoraRecordingStop — object{ resourceId, sid, serverResponse }
FieldTypeRequiredDescription
resourceIdstringis
sidstringis
serverResponseobject{ taskId, status, fileList }is
AnalyticsCallEvent — object{ ts, kind, uid, detail }
FieldTypeRequiredDescription
tsstringisformat date-time
kindenum(join | leave | network | video-send | audio-send)is
uidintegeris
detailstring
AnalyticsCallSession — object
FieldTypeRequiredDescription
projectIdstringis
channelNamestringis
startedAtstringisformat date-time
endedAtstring | nullisformat date-time
peakUsersintegeris
usersarray<object>is
eventsarray<object{ ts, kind, uid, detail }>is
AnalyticsCallUser — object
FieldTypeRequiredDescription
uidintegeris
userIdstring | nullis
roleenum(host | audience)is
platformintegerisAgora platform code (0 iOS, 1 Android, 2 Windows, 5 Web, 6 macOS, 7 Linux, 8 Other)
joinedAtstringisformat date-time
leftAtstring | nullisformat date-time
durationSecondsnumberis
audioFreezeRatenumberis
videoFreezeRatenumberis
networkDelayRatenumberis
AnalyticsDiagnosis — object{ video, audio, network }
FieldTypeRequiredDescription
videoenum(good | warn | bad)is
audioenum(good | warn | bad)is
networkenum(good | warn | bad)is
AnalyticsQualityBucket — object
FieldTypeRequiredDescription
bucketStartstringisformat date-time
averageLoginTimeMsnumberis
audioFreezeRatenumberis
videoFreezeRatenumberis
networkDelayRatenumberis
inCallUsersintegeris
inCallChannelsintegeris
joinAttemptsintegeris
joinSuccessesintegeris
joinWithin5sintegeris
AnalyticsUsageBucket — object{ bucket, type, minutes, channels, users }
FieldTypeRequiredDescription
bucketstringis
typeenum(audio | video | recording | streaming | transcoding)is
minutesnumberis
channelsintegeris
usersintegeris
BanRule — object
FieldTypeRequiredDescription
idinteger
channelNamestring | null
uidinteger | null
ipstring | null
privilegesarray<enum(join_channel | publish_audio | publish_video)>
expireAtstring | nullformat date-time
createdAtstringformat date-time
BillingOverview — object
FieldTypeRequiredDescription
providerobjectis
plansarray<object>is
subscriptionanyis
invoicesarray<object>is
topUpsarray<object>is
chargesarray<object>is
taxProfileanyis
totalsobject{ outstanding, paid, credit, currency }is
generatedAtstringisformat date-time
BillingPlan — object
FieldTypeRequiredDescription
idstringis
namestringis
pricePerMonthnumberismonthly list price in major units (see x-money-scale)
currencystringISO-4217 currency code;pattern ^[A-Z]{3}$
includedMinutesnumberismetered minutes included before overage
descriptionstringis
featuresarray<string>is
BillingProvider — object
FieldTypeRequiredDescription
kindenum(sandbox | live)is
livebooleanis
configuredbooleanis
currencystringisISO-4217 currency code;pattern ^[A-Z]{3}$
taxRatePercentnumberis
disclaimerstringis
capabilitiesobject{ payInvoice, topUp, subscribe }is
BillingTotals — object{ outstanding, paid, credit, currency }
FieldTypeRequiredDescription
outstandingnumberisinvoiced but unpaid amount
paidnumberissettled amount
creditnumberisunconsumed top-up credit
currencystringisISO-4217 currency code;pattern ^[A-Z]{3}$
ChannelSummary — object{ channelName, userCount, profile, createdAt }
FieldTypeRequiredDescription
channelNamestring
userCountinteger
profileenum(communication | live)
createdAtstring | nullformat date-time
Error — object{ code, message, reason, sdkCode, details }
FieldTypeRequiredDescription
codestringisstable machine code, see errors.json
messagestringis
reasonstring
sdkCodeintegerAgora-aligned client error number
detailsobject
FlsEntryPoint — object{ entryPoint, entryPoints }
FieldTypeRequiredDescription
entryPointstringis
entryPointsarray<string>is
FlsEntryPointDelete — object{ deleted, entryPoint }
FieldTypeRequiredDescription
deletedbooleanis
entryPointstringis
FlsEntryPointList — object{ entryPoints }
FieldTypeRequiredDescription
entryPointsarray<string>is
FlsTaskAccepted — object{ streamName, taskId, state, region }
FieldTypeRequiredDescription
streamNamestringis
taskIdstringis
stateenum(starting | running | stopping | stopped | failed | expired)is
regionstringis
FlsTaskStop — object{ streamName, taskId, state }
FieldTypeRequiredDescription
streamNamestringis
taskIdstringis
stateenum(starting | running | stopping | stopped | failed | expired)is
Invoice — object
FieldTypeRequiredDescription
idstringis
projectIdstring | nullis
projectNamestringis
periodstringisbilling period label, e.g. 2026-10
currencystringisISO-4217 currency code;pattern ^[A-Z]{3}$
subtotalnumberisamount before tax
taxnumberistax amount
totalnumberisamount due
statusenum(open | paid | void)is
issuedAtstringisformat date-time
paidAtstring | nullisformat date-time
chargeIdstring | nullis
linesarray<object{ type, minutes, amount }>is
InvoiceLine — object{ type, minutes, amount }
FieldTypeRequiredDescription
typestringis
minutesnumberis
amountnumberisline amount
PaymentCharge — object
FieldTypeRequiredDescription
idstringis
kindenum(invoice | topup)is
referenceIdstringis
amountnumberischarged amount
currencystringisISO-4217 currency code;pattern ^[A-Z]{3}$
providerenum(sandbox)is
statusenum(succeeded)is
simulatedbooleanis
createdAtstringisformat date-time
Point — object{ x, y }
FieldTypeRequiredDescription
xnumberis
ynumberis
Project — object
FieldTypeRequiredDescription
idstringis
appIdstringis
customerIdstringis
namestringis
authModeenum(token | appid)is
statusenum(active | suspended)is
tokenTtlSecondsintegeris
privilegeTtlSecondsintegeris
servicesobject{ recording, streaming, analytics }is
quotasobject{ recordingConcurrent, streamingConcurrent, maxChannels }is
createdAtstringisformat date-time
updatedAtstringisformat date-time
Quotas — object{ recordingConcurrent, streamingConcurrent, maxChannels }
FieldTypeRequiredDescription
recordingConcurrentintegeris
streamingConcurrentintegeris
maxChannelsintegeris0 = unlimited
RecordingTaskBody — object
FieldTypeRequiredDescription
idstring
channelNamestring
modeenum(composite | individual | web)
stateenum(starting | running | stopping | stopped | failed | expired)
layoutobject{ preset, canvasWidth, canvasHeight, backgroundColor }
filesarray<object{ objectKey, url, format, durationSeconds, sizeBytes }>
usageSecondsnumber
errorstring | null
startedAtstring | null
endedAtstring | null
RecordingTaskList — object{ total, tasks }
FieldTypeRequiredDescription
totalintegeris
tasksarray<object>is
ScenePpt — object{ src, width, height }
FieldTypeRequiredDescription
srcstringisImage URL (http(s) or object-storage path).
widthintegeris>= 1
heightintegeris>= 1
Services — object{ recording, streaming, analytics }
FieldTypeRequiredDescription
recordingbooleanis
streamingbooleanis
analyticsbooleanis
StreamingTask — object
FieldTypeRequiredDescription
idstring
channelNamestring
entryPointstring
streamNamestring
rtmpUrlstring
hlsUrlstring
stateenum(starting | running | stopping | stopped | failed | expired)
idleTimeoutSecondsinteger
lastActiveAtstringformat date-time
errorstring | null
StreamingTaskList — object{ total, streams }
FieldTypeRequiredDescription
totalintegeris
streamsarray<object>is
Subscription — object{ planId, status, startedAt, currentPeriodEnd, pricePerMonth, includedMinutes }
FieldTypeRequiredDescription
planIdstringis
statusenum(active | cancelled)is
startedAtstringisformat date-time
currentPeriodEndstringisformat date-time
pricePerMonthnumberissubscription price in major units
includedMinutesnumberis
TaxProfile — object{ legalName, country, taxId, address, updatedAt, status }
FieldTypeRequiredDescription
legalNamestringis
countrystringisISO-3166 alpha-2
taxIdstringis
addressstringis
updatedAtstringisformat date-time
statusenum(unverified)isthis deployment never validates the tax id against an authority
TokenIssueResponse — object
FieldTypeRequiredDescription
appIdstringis
channelNamestringis
rtcTokenstringis
rtcUidintegeris1..2147483647
roleenum(host | audience)is
privilegesarray<string>is
controlTokenstringOpaque control-plane token for REST diagnostics/renewal. TokenIssueResult.controlToken is optional; toResult() always sets it.
mediaRoomstringSFU room name when the media adapter namespaces by App ID (TokenIssueResult.mediaRoom).
expireAtstringisformat date-time
privilegeExpireAtstringisformat date-time
TopUp — object
FieldTypeRequiredDescription
idstringis
amountnumberiscredited amount
currencystringisISO-4217 currency code;pattern ^[A-Z]{3}$
statusenum(succeeded)is
providerenum(sandbox)is
chargeIdstringis
notestringis
createdAtstringisformat date-time
UserView — object
FieldTypeRequiredDescription
uidinteger
userIdstring | null
roleenum(host | audience)
platforminteger
joinedAtstringformat date-time
audioMutedboolean
videoMutedboolean
publishingobject{ audio, video, screen }
WebhookDelivery — object
FieldTypeRequiredDescription
idstringis
projectIdstringis
envelopeobject{ noticeId, productId, eventType, notifyMs, sid, payload }is
urlstringis
stateenum(pending | delivering | delivered | failed | dropped)is
attemptsintegeris
maxAttemptsintegeris
nextAttemptAtstring | nullisformat date-time
lastStatusCodeinteger | nullis
lastErrorstring | nullis
createdAtstringisformat date-time
updatedAtstringisformat date-time
WhiteboardImage — object
FieldTypeRequiredDescription
idstringis
scenePathstringis
srcstringis
widthnumberis
heightnumberis
xnumberis
ynumberis
lockedbooleanis
memberIdstringis
createdAtstringisformat date-time
WhiteboardMemberState — object
FieldTypeRequiredDescription
memberIdstringis
roleenum(admin | writer | reader)is
appliancestringiscanvas appliance name, e.g. pencil / pencilEraser / rectangle
strokeColorstringis
strokeWidthnumberis
canUndointegeris
canRedointegeris
WhiteboardOperation — object
FieldTypeRequiredDescription
seqintegeris
typeenum(scene.add | scene.switch | scene.clear | stroke.append | stroke.erase | stroke.undo | stroke.redo | image.insert | viewport.set | room.ban | room.close | member.join | member.leave)is
memberIdstringis
scenePathstring | nullis
strokeIdstring | nullis
roomVersionintegeris
payloadobjectisoperation-specific payload, already validated by the service
createdAtstringisformat date-time
WhiteboardPpt — object{ src, width, height }
FieldTypeRequiredDescription
srcstringis
widthnumberis
heightnumberis
WhiteboardReplay — object{ roomUUID, duration, from, to, frames }
FieldTypeRequiredDescription
roomUUIDstringis
durationnumberismilliseconds between the first and the last frame
fromstring | nullis
tostring | nullis
framesarray<object{ offset, operation }>is
WhiteboardRoom — object
FieldTypeRequiredDescription
uuidstringis
teamUUIDstringis
appUUIDstringis
isRecordbooleanis
isBanbooleanis
phaseenum(active | banned | closed)is
limitintegeris
versionintegeris
createdAtstringisformat date-time
updatedAtstringisformat date-time
closedAtstring | nullisformat date-time
WhiteboardRoomState — object
FieldTypeRequiredDescription
roomobjectis
currentScenePathstringis
viewportobject{ x, y, width, height, scale, updatedAt }is
scenesarray<object>is
memberStatesobjectismember id → current drawing state
canUndoStepsintegeris
canRedoStepsintegeris
WhiteboardSceneSummary — object
FieldTypeRequiredDescription
pathstringis
namestringis
pptanyis
strokeCountintegeris
imageCountintegeris
createdAtstringisformat date-time
updatedAtstringisformat date-time
WhiteboardSnapshot — object
FieldTypeRequiredDescription
roomUUIDstringis
appUUIDstringis
roomVersionintegeris
exportedAtstringisformat date-time
currentScenePathstringis
viewportobject{ x, y, width, height, scale, updatedAt }is
scenesarray<object{ path, name, ppt, strokes, images }>is
operationsarray<object>
WhiteboardStroke — object
FieldTypeRequiredDescription
idstringis
scenePathstringis
appliancestringiscanvas appliance name, e.g. pencil / pencilEraser / rectangle
colorstringis
widthnumberis
pointsarray<array<number>>isflat [x, y, ...] point list
memberIdstringis
seqintegeris
undonebooleanis
erasedbooleanis
createdAtstringisformat date-time
WhiteboardViewport — object{ x, y, width, height, scale, updatedAt }
FieldTypeRequiredDescription
xnumberis
ynumberis
widthnumberis
heightnumberis
scalenumberis
updatedAtstringisformat date-time
XlaMetricSet — object
FieldTypeRequiredDescription
samplesintegeris
joinAttemptsintegeris
joinSuccessRatenumber | nullisjoinSuccess / joinAttempt samples; null when there is no sample
joinWithin5sRatenumber | nullis
videoFreezeRatenumber | nullis
audioFreezeRatenumber | nullis
networkDelayMsnumber | nullis
availabilitynumber | nullistelemetry availability: observed 5-minute buckets / buckets in the month
observedBucketsintegeris
expectedBucketsintegeris
XlaMonthReport — object
FieldTypeRequiredDescription
monthstringisYYYY-MM
fromstringisformat date-time
tostringisformat date-time
scopeobject{ kind, projectId, projectName }is
metricsobjectis
projectsarray<any>is
insufficientbooleanis
reasonstring | nullis
notestringishow each metric is computed (no modelled percentages)
generatedAtstringisformat date-time
XlaProjectRow — any

No field declarations.

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.