Real-time voice, three HTTP calls.
fg-voice-1 hears, answers and speaks over an OpenAI-compatible API. Point your existing SDK at our base URL; the reply streams back sentence by sentence, each one ready to synthesize.
Free in beta — 2,000 requests a day, no card. Paid plans will be announced in advance.
Talk to fg-voice-1 — by voice, right now.
Hear. Think. Speak.
Three endpoints, your code in between. No WebRTC, no sockets, no SDK to install — plain HTTP with one SSE stream in the middle.
POST /v1/audio/transcriptions
POST /v1/chat/completions
stream: true every SSE delta is a finished sentence, not a token. Hand it straight to synthesis instead of buffering the whole reply.POST /v1/audio/speech
# text → mp3, one call curl https://fg-platform.com/v1/audio/speech \ -H "Authorization: Bearer $FG_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "fg-voice-1", "voice": "sergei", "input": "Sir, the report is ready to send." }' --output reply.mp3
import OpenAI from 'openai'; import fs from 'node:fs'; // the same SDK — the base URL and the key change const fg = new OpenAI({ baseURL: 'https://fg-platform.com/v1', apiKey: process.env.FG_API_KEY, // fg-… }); const heard = await fg.audio.transcriptions.create({ file: fs.createReadStream('question.webm'), model: 'fg-voice-1', }); const stream = await fg.chat.completions.create({ model: 'fg-voice-1', stream: true, messages: [{ role: 'user', content: heard.text }], }); for await (const part of stream) { const line = part.choices[0].delta.content; // a whole sentence if (!line) continue; const speech = await fg.audio.speech.create({ model: 'fg-voice-1', voice: 'sergei', input: line, }); play(Buffer.from(await speech.arrayBuffer())); }
Latency, measured.
Median time each call spends on our side, taken from live platform traffic rather than a benchmark rig.
Median of live platform traffic, 14–19 August 2026 (n = 109 / 346 / 352 calls). Our side of the call only — the network between you and us is not ours to promise.
- Model
fg-voice-1— one id for all three calls; listed byGET /v1/models.- Streaming
- SSE. Each delta is a finished sentence, ready to synthesize — not a token you have to reassemble.
- Voices
- By name,
sergei— also what you get whenvoiceis left out. By id, any of 900+ voices in the catalog. - Languages
- Speech in and out: English and Russian. Text: any language the visitor writes in. Recognition takes the language from the audio — nothing to set per request.
- Audio out
- mp3, 44.1 kHz, mono, 128 kbps, chunked. Input up to 4096 characters per call.
- Audio in
- webm/opus, mp3, wav, m4a — up to 32 MB per file,
multipart/form-data. - Compatibility
- OpenAI request and response shape, including errors:
error.type,error.code—nullwhen the failure came from a provider rather than from the request. - Context
max_tokens1–4096, 1024 by default. Your ownsystemmessage sets the persona; the last 40 messages ofmessagesare kept.- From the browser
- CORS is open; the key travels in the
Authorizationheader. Keep it server-side in production. - Limits
- 120 requests a minute per key, 2,000 a day per account in beta.
A key in a minute. $0 in beta.
No card. Sign up, confirm your email, create a key — the next line you write is a working call.
Build it yourself
- Sign up and confirm your email — an unconfirmed account can't call the API
- Create a key in the console — fg-… is shown once, save it
- Point your SDK at https://fg-platform.com/v1
Free in beta — 2,000 requests a day, no card. Paid plans will be announced in advance. Existing keys keep working.
What beta gives you
- 2,000 requests a day per account
- 120 requests a minute per key
- 900+ voices by id, English and Russian speech
- Keys, usage and the daily counter in the console