curl --request POST \
--url http://localhost:3000/api/v1/meetings/join \
--header 'Content-Type: application/json' \
--data '
{
"agent": "<string>",
"artifactId": "<string>",
"asyncWorker": true,
"capture": "<string>",
"context": "<string>",
"dryRun": true,
"duration": "<string>",
"emptyGrace": "<string>",
"includeSessionContext": true,
"initialPrompt": "<string>",
"initialPromptDelay": "<string>",
"live": true,
"local": true,
"maxDuration": "<string>",
"name": "<string>",
"out": "<string>",
"profile": "<string>",
"profileDir": "<string>",
"project": "<string>",
"provider": "<string>",
"skipFinalize": true,
"sync": true,
"tools": "<string>",
"url": "<string>",
"voiceRuntime": "<string>"
}
'import requests
url = "http://localhost:3000/api/v1/meetings/join"
payload = {
"agent": "<string>",
"artifactId": "<string>",
"asyncWorker": True,
"capture": "<string>",
"context": "<string>",
"dryRun": True,
"duration": "<string>",
"emptyGrace": "<string>",
"includeSessionContext": True,
"initialPrompt": "<string>",
"initialPromptDelay": "<string>",
"live": True,
"local": True,
"maxDuration": "<string>",
"name": "<string>",
"out": "<string>",
"profile": "<string>",
"profileDir": "<string>",
"project": "<string>",
"provider": "<string>",
"skipFinalize": True,
"sync": True,
"tools": "<string>",
"url": "<string>",
"voiceRuntime": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
agent: '<string>',
artifactId: '<string>',
asyncWorker: true,
capture: '<string>',
context: '<string>',
dryRun: true,
duration: '<string>',
emptyGrace: '<string>',
includeSessionContext: true,
initialPrompt: '<string>',
initialPromptDelay: '<string>',
live: true,
local: true,
maxDuration: '<string>',
name: '<string>',
out: '<string>',
profile: '<string>',
profileDir: '<string>',
project: '<string>',
provider: '<string>',
skipFinalize: true,
sync: true,
tools: '<string>',
url: '<string>',
voiceRuntime: '<string>'
})
};
fetch('http://localhost:3000/api/v1/meetings/join', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/v1/meetings/join",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent' => '<string>',
'artifactId' => '<string>',
'asyncWorker' => true,
'capture' => '<string>',
'context' => '<string>',
'dryRun' => true,
'duration' => '<string>',
'emptyGrace' => '<string>',
'includeSessionContext' => true,
'initialPrompt' => '<string>',
'initialPromptDelay' => '<string>',
'live' => true,
'local' => true,
'maxDuration' => '<string>',
'name' => '<string>',
'out' => '<string>',
'profile' => '<string>',
'profileDir' => '<string>',
'project' => '<string>',
'provider' => '<string>',
'skipFinalize' => true,
'sync' => true,
'tools' => '<string>',
'url' => '<string>',
'voiceRuntime' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/v1/meetings/join"
payload := strings.NewReader("{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/v1/meetings/join")
.header("Content-Type", "application/json")
.body("{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/v1/meetings/join")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"mode": "dry-run",
"project": "<string>",
"provider": "<string>",
"providerRuntime": "<string>",
"request": {
"meetingUrl": "<string>",
"botName": "<string>",
"maxMinutes": 123
},
"runtime": "cloud"
}Join a meeting through a native Ravi meeting provider
curl --request POST \
--url http://localhost:3000/api/v1/meetings/join \
--header 'Content-Type: application/json' \
--data '
{
"agent": "<string>",
"artifactId": "<string>",
"asyncWorker": true,
"capture": "<string>",
"context": "<string>",
"dryRun": true,
"duration": "<string>",
"emptyGrace": "<string>",
"includeSessionContext": true,
"initialPrompt": "<string>",
"initialPromptDelay": "<string>",
"live": true,
"local": true,
"maxDuration": "<string>",
"name": "<string>",
"out": "<string>",
"profile": "<string>",
"profileDir": "<string>",
"project": "<string>",
"provider": "<string>",
"skipFinalize": true,
"sync": true,
"tools": "<string>",
"url": "<string>",
"voiceRuntime": "<string>"
}
'import requests
url = "http://localhost:3000/api/v1/meetings/join"
payload = {
"agent": "<string>",
"artifactId": "<string>",
"asyncWorker": True,
"capture": "<string>",
"context": "<string>",
"dryRun": True,
"duration": "<string>",
"emptyGrace": "<string>",
"includeSessionContext": True,
"initialPrompt": "<string>",
"initialPromptDelay": "<string>",
"live": True,
"local": True,
"maxDuration": "<string>",
"name": "<string>",
"out": "<string>",
"profile": "<string>",
"profileDir": "<string>",
"project": "<string>",
"provider": "<string>",
"skipFinalize": True,
"sync": True,
"tools": "<string>",
"url": "<string>",
"voiceRuntime": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
agent: '<string>',
artifactId: '<string>',
asyncWorker: true,
capture: '<string>',
context: '<string>',
dryRun: true,
duration: '<string>',
emptyGrace: '<string>',
includeSessionContext: true,
initialPrompt: '<string>',
initialPromptDelay: '<string>',
live: true,
local: true,
maxDuration: '<string>',
name: '<string>',
out: '<string>',
profile: '<string>',
profileDir: '<string>',
project: '<string>',
provider: '<string>',
skipFinalize: true,
sync: true,
tools: '<string>',
url: '<string>',
voiceRuntime: '<string>'
})
};
fetch('http://localhost:3000/api/v1/meetings/join', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/v1/meetings/join",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent' => '<string>',
'artifactId' => '<string>',
'asyncWorker' => true,
'capture' => '<string>',
'context' => '<string>',
'dryRun' => true,
'duration' => '<string>',
'emptyGrace' => '<string>',
'includeSessionContext' => true,
'initialPrompt' => '<string>',
'initialPromptDelay' => '<string>',
'live' => true,
'local' => true,
'maxDuration' => '<string>',
'name' => '<string>',
'out' => '<string>',
'profile' => '<string>',
'profileDir' => '<string>',
'project' => '<string>',
'provider' => '<string>',
'skipFinalize' => true,
'sync' => true,
'tools' => '<string>',
'url' => '<string>',
'voiceRuntime' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/v1/meetings/join"
payload := strings.NewReader("{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/v1/meetings/join")
.header("Content-Type", "application/json")
.body("{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/v1/meetings/join")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent\": \"<string>\",\n \"artifactId\": \"<string>\",\n \"asyncWorker\": true,\n \"capture\": \"<string>\",\n \"context\": \"<string>\",\n \"dryRun\": true,\n \"duration\": \"<string>\",\n \"emptyGrace\": \"<string>\",\n \"includeSessionContext\": true,\n \"initialPrompt\": \"<string>\",\n \"initialPromptDelay\": \"<string>\",\n \"live\": true,\n \"local\": true,\n \"maxDuration\": \"<string>\",\n \"name\": \"<string>\",\n \"out\": \"<string>\",\n \"profile\": \"<string>\",\n \"profileDir\": \"<string>\",\n \"project\": \"<string>\",\n \"provider\": \"<string>\",\n \"skipFinalize\": true,\n \"sync\": true,\n \"tools\": \"<string>\",\n \"url\": \"<string>\",\n \"voiceRuntime\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"mode": "dry-run",
"project": "<string>",
"provider": "<string>",
"providerRuntime": "<string>",
"request": {
"meetingUrl": "<string>",
"botName": "<string>",
"maxMinutes": 123
},
"runtime": "cloud"
}Body
Registered Ravi agent id for live meeting mode
Internal artifact id for async worker continuation
Internal background worker mode
Capture mode passed to the provider
Freeform context injected into the live meeting agent prompt
Validate and print provider invocation without joining
Recorder duration hint
Seconds to wait after the meeting appears empty
Inject recent Ravi session history into the live meeting prompt
Initial prompt for the native Ravi meeting session after join
Delay before --initial-prompt is spoken
Enable native Ravi live agent mode
Run the recorder in Chrome on this machine instead of sending the cloud bot
Hard cap while waiting for the meeting to end
Visible meeting participant name
Recorder output base directory
Reusable meeting profile id
Persistent browser profile directory
Console project for the cloud bot (default: linked project)
Meeting provider id. Currently: google-meet
Skip final meeting.raw artifact registration
Wait for provider completion before returning
Comma-separated Ravi tool names allowlist for live mode
Meeting URL
Voice runtime for live meeting mode. Current ready default: ravi-native