Live on api.naelix.com

Real-time calling,
wired straight in.

Naelix is a video and voice calling API built on a WebRTC SFU. Drop in 1:1 calls, group meetings, and screen share without standing up mediasoup, TURN, or signaling infrastructure yourself.

<300ms
Median connect time
1:1 & group
Same API, either shape
2 headers
To authenticate
Why Naelix

Built for teams shipping calling as a feature, not a product.

You want your users talking to each other. You don't want to be the one debugging ICE candidates at 2am.

Sub-second connect

Routed through a mediasoup SFU with a TURN fallback that's tried in parallel, not after — calls join fast even on restrictive networks.

1:1 to 200-person rooms

The same signaling contract scales from a direct call to a large standup — simulcast and active-speaker detection built in.

Screen share, native

One API call swaps a video producer for a screen-share track — no separate room, no reconnect, no second bill.

Your users, your identity

Naelix authenticates your service, not your end users — pass whoever's calling in the request, no separate account system to sync.

Try it now

Generate a key pair.

Every integration authenticates with an API key and a secret key — no per-user tokens to mint or rotate on your side.

naelix — credentials
Real, working credentials — limited to 3 per day per visitor.
API Key nlx_key_••••••••••••••••••••
Secret Key nlx_secret_••••••••••••••••••••
The secret key is shown once, right here — store it now. This is a trial credential meant for testing the API, not production traffic.
Authentication

Two headers, no user tokens.

Naelix authenticates the service calling it, not the end user placing the call. Send your API key and secret key on every request — Naelix trusts the user identity you pass alongside them, the same way you already trust your own session layer.

  • X-Api-Key — identifies your integration.
  • X-Secret-Key — proves it's really you. Never expose this in a browser or mobile app.

Base URL for every request — this same origin:

https://api.naelix.com
# Create a 1:1 call room
POST /calls
X-Api-Key: nlx_key_7f2a9c1e4b8d3f60
X-Secret-Key: nlx_secret_9b1c...e02f
Content-Type: application/json

{
  "callerId": "user_482",
  "mode": "video"
}

# 201 Created
{
  "id": "a1b2c3d4-...",
  "type": "one_to_one",
  "mode": "video",
  "locked": false,
  "participantCount": 0
}
API reference

Every endpoint, grouped by resource.

The same surface Swagger documents interactively — this is the quick-scan version. meetings covers group calls, calls covers 1:1 — see the Endpoint surface note above for why they're separate.

Calls apiKey + secretKey

POST/callsCreate a 1:1 call room. Body: callerId (required), id, mode (video | audio_only).
GET/calls/:idGet a call's current state.
POST/calls/:id/endEnd a call for both participants.

Meetings apiKey + secretKey

POST/meetingsCreate a group meeting room. Body: hostId (required), id, mode, waitingRoomEnabled, chatEnabled, reactionsEnabled, screenShareEnabled.
GET/meetings/:idGet a meeting's current state.
POST/meetings/:id/endEnd a meeting for every participant.
DELETE/meetings/:idRemove a meeting's in-memory record.

Moderation apiKey + secretKey

POST/meetings/:id/muteMute a participant.
POST/meetings/:id/kickRemove a participant (alias of remove).
POST/meetings/:id/removeRemove a participant from the meeting.
POST/meetings/:id/promotePromote a participant to co-host.
POST/meetings/:id/demoteDemote a co-host back to participant.
POST/meetings/:id/lockLock the meeting against new joins.
POST/meetings/:id/unlockUnlock the meeting.

Participants apiKey + secretKey

GET/participants/:meetingIdList a meeting's current participants.

Developer & ops public, no auth

POST/developer/api-keysGenerate a trial (apiKey, secretKey) pair — what the button above calls. Rate-limited per visitor.
GET/healthService health, mediasoup worker stats, meeting counts.
GET/metricsPrometheus metrics (plain-text exposition format).
Real-time signaling

Socket.IO, not REST, for the call itself.

REST creates and manages rooms; the actual join/produce/consume flow runs over Socket.IO on two namespaces — /calls (1:1, no moderation) and /meetings (group, full moderation surface). Connect with auth: {'{'} apiKey, secretKey, userId, displayName {'}'}, then emit joinRoom with an ack callback to get back rtpCapabilities and start producing/consuming media.

Client → server (ack-based request/response)

joinRoom · leaveRoom · createTransport · connectTransport · produce · consume · pauseProducer · resumeProducer · closeProducer · resumeConsumer · setPreferredLayers · restartIce · startScreenShare · stopScreenShare · raiseHand · lowerHand · lowerParticipantHand · inviteToSpeak · reaction · chatMessage · mute · requestUnmute · kick · lockMeeting · unlockMeeting · endMeeting · promoteModerator · demoteModerator · admitWaitingParticipant · rejectWaitingParticipant · heartbeat

Server → client (broadcast)

userJoined · userLeft · newProducer · producerClosed · videoEnabled · videoDisabled · audioMuted · audioUnmuted · unmuteRequested · handRaised · handLowered · reaction · chatMessage · screenShareStarted · screenShareStopped · participantRemoved · participantRoleChanged · meetingLocked · meetingUnlocked · meetingEnded · meetingStateUpdated · waitingRoomJoined · waitingRoomParticipant · waitingRoomRejected · admitted · activeSpeakerChanged · forceMuted · errorEvent · heartbeatAck

Integrate

Call it from wherever your backend lives.

Every sample creates a call and prints the returned id.