Skip to content

Commit 62804ea

Browse files
authored
readme updates (#1230)
will merge after api release
1 parent ac07115 commit 62804ea

1 file changed

Lines changed: 137 additions & 1 deletion

File tree

livekit-api/README.md

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,140 @@
22

33
The official server API crate for [LiveKit](https://livekit.com).
44

5-
Use this crate to generate access tokens and invoke LiveKit server APIs for agent dispatch, ingress, egress, SIP, and more.
5+
Use this crate to generate access tokens and invoke LiveKit server APIs for rooms, egress, ingress, SIP, agent dispatch, and more.
6+
7+
## Server API
8+
9+
`LiveKitApi` is a single entry point to every server API, exposing each service through an accessor (`room()`, `egress()`, `ingress()`, `sip()`, `agent_dispatch()`, `connector()`).
10+
11+
```rust,no_run
12+
use livekit_api::services::LiveKitApi;
13+
use livekit_api::services::room::CreateRoomOptions;
14+
15+
#[tokio::main]
16+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
17+
let lk = LiveKitApi::with_api_key("https://my.livekit.host", "my-key", "my-secret");
18+
19+
let room = lk
20+
.room()
21+
.create_room(
22+
"my-room",
23+
CreateRoomOptions { empty_timeout: 600, max_participants: 20, ..Default::default() },
24+
)
25+
.await?;
26+
27+
println!("created room {}", room.name);
28+
Ok(())
29+
}
30+
```
31+
32+
Individual service clients (`RoomClient`, `SIPClient`, etc.) can also be created directly with the same constructors.
33+
34+
### Authentication
35+
36+
The server API supports two modes of operation:
37+
38+
- **API key & secret** — recommended for backend use. `LiveKitApi::new(host)` reads the key and secret from the `LIVEKIT_API_KEY` and `LIVEKIT_API_SECRET` environment variables; `LiveKitApi::with_api_key(host, key, secret)` takes them explicitly instead. Either way, a short-lived token is signed for each request.
39+
- **Access token** — for client-side use where the API secret must not be exposed. `LiveKitApi::with_token(host, token)` sends a pre-signed [access token](https://docs.livekit.io/frontends/reference/tokens-grants/) verbatim on every request; its grants must cover the calls you make.
40+
41+
### Agent dispatch
42+
43+
Explicitly dispatch an agent into a room (see [Agent dispatch](https://docs.livekit.io/agents/server/agent-dispatch/)):
44+
45+
```rust,no_run
46+
use livekit_api::services::LiveKitApi;
47+
use livekit_protocol as proto;
48+
49+
#[tokio::main]
50+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
51+
let lk = LiveKitApi::with_api_key("https://my.livekit.host", "my-key", "my-secret");
52+
53+
lk.agent_dispatch()
54+
.create_dispatch(proto::CreateAgentDispatchRequest {
55+
room: "my-room".to_owned(),
56+
agent_name: "my-agent".to_owned(),
57+
..Default::default()
58+
})
59+
.await?;
60+
Ok(())
61+
}
62+
```
63+
64+
### Error handling
65+
66+
Service methods return `ServiceResult<T>` (`Result<T, ServiceError>`). A failed server call is a `ServiceError::Twirp(ServerError)`; when the server returns a structured error it is `ServerError::Twirp(ServerErrorCode)`, which carries the error code and message. (`ServerError`'s former `TwirpError`/`TwirpErrorCode`/`TwirpResult` type names remain as deprecated aliases.)
67+
68+
```rust,no_run
69+
use livekit_api::services::LiveKitApi;
70+
71+
#[tokio::main]
72+
async fn main() {
73+
let lk = LiveKitApi::with_api_key("https://my.livekit.host", "my-key", "my-secret");
74+
match lk.room().delete_room("my-room").await {
75+
Ok(_) => {}
76+
Err(e) => eprintln!("delete_room failed: {e}"),
77+
}
78+
}
79+
```
80+
81+
### Handling SIP call errors
82+
83+
When a SIP call fails (e.g. the callee is busy or declines), the server attaches a SIP status to the error. `SipCallError::from_error` decodes it from a returned error, exposing the SIP status code and reason:
84+
85+
```rust,no_run
86+
use livekit_api::services::sip::CreateSIPParticipantOptions;
87+
use livekit_api::services::{LiveKitApi, SipCallError};
88+
89+
#[tokio::main]
90+
async fn main() {
91+
let lk = LiveKitApi::with_api_key("https://my.livekit.host", "my-key", "my-secret");
92+
93+
let result = lk
94+
.sip()
95+
.create_sip_participant(
96+
"ST_trunk".to_owned(),
97+
"+15105550100".to_owned(),
98+
"my-room".to_owned(),
99+
CreateSIPParticipantOptions {
100+
wait_until_answered: Some(true),
101+
..Default::default()
102+
},
103+
None,
104+
)
105+
.await;
106+
107+
if let Err(err) = result {
108+
if let Some(sip) = SipCallError::from_error(&err) {
109+
eprintln!("{sip}"); // e.g. "SIP call failed: 486 Busy Here (resource_exhausted)"
110+
if sip.sip_status_code() == Some(486) {
111+
// callee is busy
112+
}
113+
}
114+
}
115+
}
116+
```
117+
118+
## Access tokens
119+
120+
Access tokens are generated with `AccessToken`:
121+
122+
```rust,no_run
123+
use livekit_api::access_token::{AccessToken, VideoGrants};
124+
125+
fn main() -> Result<(), Box<dyn std::error::Error>> {
126+
let token = AccessToken::with_api_key("my-key", "my-secret")
127+
.with_identity("participant-identity")
128+
.with_name("Participant Name")
129+
.with_grants(VideoGrants {
130+
room_join: true,
131+
room: "my-room".to_owned(),
132+
..Default::default()
133+
})
134+
.to_jwt()?;
135+
136+
println!("{token}");
137+
Ok(())
138+
}
139+
```
140+
141+
By default, tokens expire 6 hours after generation. Override this with `.with_ttl(duration)`.

0 commit comments

Comments
 (0)