<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sarah Lindauer</title>
    <description>The latest articles on DEV Community by Sarah Lindauer (@sarahlindauer).</description>
    <link>https://dev.to/sarahlindauer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3113467%2Ffe893101-b2f2-40f0-83b5-ffa96221e22e.png</url>
      <title>DEV Community: Sarah Lindauer</title>
      <link>https://dev.to/sarahlindauer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarahlindauer"/>
    <language>en</language>
    <item>
      <title>Build a Voice Agent That Calls to Confirm Fraud Alerts</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:55:50 +0000</pubDate>
      <link>https://dev.to/getstreamhq/build-a-voice-agent-that-calls-to-confirm-fraud-alerts-26a9</link>
      <guid>https://dev.to/getstreamhq/build-a-voice-agent-that-calls-to-confirm-fraud-alerts-26a9</guid>
      <description>&lt;p&gt;This tutorial &lt;strong&gt;builds a voice agent&lt;/strong&gt; that places an outbound call to a cardholder, reads back a suspicious transaction, and either clears it or freezes the card, all in Python with &lt;a href="https://visionagents.ai/" rel="noopener noreferrer"&gt;Vision Agents&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You’ll use speech-to-text from Deepgram, an LLM for the conversation, Cartesia for the voice, and Twilio to place the call. The build is for a fictional issuer, Meridian Bank.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The interesting constraint is that a fraud-alert call and a scam call open identically ("we noticed suspicious activity on your card"), and the only thing that separates them is what the agent does next. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A real bank confirms a transaction and never asks the customer to prove themselves with sensitive data. A scammer asks for exactly that. So the rules that keep this bot legitimate are the same rules that keep it from sounding like a scam, and we enforce them in the agent's instructions. &lt;/p&gt;

&lt;p&gt;Let’s build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6rv1cmy2i29hxjwf8irg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6rv1cmy2i29hxjwf8irg.gif" alt="Fraud alert voice agent demo" width="600" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meridian Bank's fraud system flags a charge and places an outbound call to the cardholder. &lt;/p&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identifies itself as Meridian Bank's fraud line and states why it is calling.
&lt;/li&gt;
&lt;li&gt;Reads the flagged transaction back: merchant, amount, location.
&lt;/li&gt;
&lt;li&gt;Asks the customer to confirm or deny it.
&lt;/li&gt;
&lt;li&gt;If confirmed, it clears the hold so the purchase completes.
&lt;/li&gt;
&lt;li&gt;If denied, it freezes the card, opens a dispute, and hands off to a human specialist.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It runs over &lt;a href="https://getstream.io/video/docs/api/architecture-and-benchmark/" rel="noopener noreferrer"&gt;Stream's edge network for low latency&lt;/a&gt;, with Twilio bridging the phone call. &lt;/p&gt;

&lt;p&gt;The trust boundary from the opening shows up concretely in steps one through three: &lt;strong&gt;1)&lt;/strong&gt; the agent identifies itself, &lt;strong&gt;2)&lt;/strong&gt; reads a transaction back, and &lt;strong&gt;3)&lt;/strong&gt; takes a yes or no. &lt;/p&gt;

&lt;p&gt;It never turns the call into a request for the customer's card number, PIN, password, codes, or money. We'll enforce that in the instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Vision Agents Fits This
&lt;/h2&gt;

&lt;p&gt;A fraud callbot is a plumbing problem more than a model problem. &lt;/p&gt;

&lt;p&gt;You need to place a phone call, understand speech coming through a phone codec (mulaw at 8kHz, with background noise and interruptions), respond fast enough that it feels like a conversation and not an interactive voice menu, and take real actions like freezing a card. &lt;/p&gt;

&lt;p&gt;The interesting part is the fraud logic. Everything between the phone line and the model is undifferentiated work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/vision-agents/" rel="noopener noreferrer"&gt;Vision Agents&lt;/a&gt; collapses that work into one &lt;code&gt;Agent&lt;/code&gt; object with swappable parts. Speech-to-text, the LLM, and &lt;a href="https://getstream.io/blog/text-to-speech/" rel="noopener noreferrer"&gt;text-to-speech&lt;/a&gt; are constructor arguments you can change in a single line. Turn detection is built into Deepgram, so the agent knows when the caller stopped talking. Actions are ordinary async Python functions you register with a decorator. The phone call bridges in through the Twilio plugin without changing the agent itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1k713ljalek9dvjwa1yo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1k713ljalek9dvjwa1yo.png" alt="Fraud alert voice agent process diagram" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The customer can also join from anywhere, not just a phone. &lt;/p&gt;

&lt;p&gt;The agent runs on a Stream call, and Stream ships &lt;a href="https://getstream.io/video/sdk/" rel="noopener noreferrer"&gt;frontend SDKs&lt;/a&gt; for React, iOS, Android, Flutter, React Native, JavaScript, and Unity. So the same fraud agent can take a Twilio phone call, answer from a "verify this charge" button inside your mobile banking app, or run in a browser. &lt;/p&gt;

&lt;p&gt;You build the agent once and let the customer reach it however they already talk to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Vision Agents uses &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt; and targets Python 3.13 for the examples. Install the framework with the plugins this build needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv add &lt;span class="s2"&gt;"vision-agents[getstream, deepgram, cartesia, openai, twilio]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get a free Stream API key from &lt;a href="https://getstream.io/try-for-free/" rel="noopener noreferrer"&gt;the Stream dashboard&lt;/a&gt;. The free tier includes 333,000 participant minutes per month, which is more than enough to build and test this.&lt;/p&gt;

&lt;p&gt;Set your keys in a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;STREAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;STREAM_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;DEEPGRAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;CARTESIA_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;TWILIO_ACCOUNT_SID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;NGROK_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;NGROK_URL&lt;/code&gt; is the public hostname Twilio will use to reach your machine during development. More on that in the phone section.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Agent
&lt;/h2&gt;

&lt;p&gt;Start with the agent itself, no phone yet. This is the part you can run in a browser to hear it work before wiring up telephony.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.plugins&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cartesia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Edge&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;agent_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Meridian Fraud Line&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FRAUD_INSTRUCTIONS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;STT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nova-3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eager_turn_detection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cartesia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TTS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sonic-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things to note, all of which matter in practice:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;llm = openai.LLM(model="gpt-5.5")&lt;/code&gt; is the conversation. This is a one-line swap: any current OpenAI model works, and you can drop in Gemini, Claude, or an OpenAI-compatible endpoint by changing this line alone. &lt;code&gt;gpt-5.5&lt;/code&gt; is OpenAI's current flagship at the time of writing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stt=deepgram.STT(...)&lt;/code&gt; sets up speech-to-text. &lt;code&gt;eager_turn_detection=True&lt;/code&gt; lowers latency by letting the model decide sooner that the caller has finished talking. It costs a few more tokens but the call feels more natural, which matters when someone is already on edge about a possible fraud charge. Pass &lt;code&gt;model=&lt;/code&gt; explicitly. The plugin's default has changed between releases, so pinning the model keeps your behavior stable.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tts=cartesia.TTS(...)&lt;/code&gt; sets up the voice. Pin &lt;code&gt;model_id&lt;/code&gt; for the same reason.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;edge=getstream.Edge()&lt;/code&gt; is the transport. It runs on Stream's global edge network, which Stream reports at sub-second join times and audio latency under 30 milliseconds on the transport hop, with a P50 voice round-trip around 240 milliseconds across the full speech-to-text, LLM, and text-to-speech pipeline. Twilio will bridge the phone call into this same call later.&lt;/p&gt;

&lt;p&gt;To run it in a browser during development, wire it to the CLI launcher:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AgentLauncher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.plugins&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cartesia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# ... as above ...
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;join_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;simple_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Introduce yourself as Meridian Bank&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s fraud line and explain you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calling about a recent transaction that needs to be confirmed.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nc"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AgentLauncher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;join_call&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;join_call&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run main.py run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens a browser UI where you can talk to the agent directly. You will hear it introduce itself and start the confirmation flow. Get this feeling right before you put it on a phone, because debugging tone and pacing is much easier in the browser than over a live call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Instructions Are the Product
&lt;/h2&gt;

&lt;p&gt;For most &lt;a href="https://getstream.io/video/voice-ai/" rel="noopener noreferrer"&gt;voice agents&lt;/a&gt;, the system prompt is a personality. For a fraud bot, it is the compliance boundary, and it is the &lt;strong&gt;single most important part of this build&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The instructions have to do two things at once: run the confirmation flow, and hold the line on what the agent will never ask for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FRAUD_INSTRUCTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are the automated fraud line for Meridian Bank. You are placing an outbound
call to a cardholder about a transaction our system flagged as unusual. Keep
replies short and conversational. Do not use special characters or formatting.

HOW TO OPEN THE CALL
- Say you are calling from Meridian Bank&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s fraud department.
- Say you are calling to confirm a recent transaction, nothing more.
- Do not create panic. This is a routine check, not an accusation.

HOW TO VERIFY THE TRANSACTION
- Read back only the flagged transaction: merchant, amount, and location.
- Ask the customer to confirm whether they made this purchase, yes or no.
- If they made it, tell them you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ll clear the hold and the purchase will go through.
- If they did not, tell them you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ll freeze the card, open a dispute, and connect
  them to a specialist.

WHAT YOU MUST NEVER DO
- Never ask for the full card number, CVV, PIN, or expiration date.
- Never ask for the online banking password or Social Security number.
- Never ask for a one-time passcode or verification code. No real fraud line
  ever asks for these. Asking would make you indistinguishable from a scammer.
- Never ask the customer to move, send, or reverse money.
- Never send or read out a link for them to click.
- We already have the customer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s account on file. You do not need to collect
  identifying secrets to do your job.

IF THE CUSTOMER IS UNSURE OR THE CALL GETS COMPLICATED
- Offer to let them hang up and call the number on the back of their card. A
  real bank encourages this. Then escalate to a human specialist.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The line that does the heavy lifting is the reasoning attached to the one-time passcode rule. A model told simply "do not ask for codes" can be argued out of it by a plausible-sounding edge case. A model told why (asking would make it indistinguishable from a scammer) holds the boundary under pressure, because the instruction now carries its own justification.&lt;/p&gt;

&lt;p&gt;This mirrors what real issuers publish. &lt;/p&gt;

&lt;p&gt;A legitimate fraud alert confirms a transaction with a yes or no. It does not extract secrets. Banks state plainly that they will never ask you to verify a full account number, CVV, PIN, or a verification code, and consumer protection guidance is absolute that no real fraud department will ever ask for a one-time code. Encoding that directly is what makes the agent credible to the person on the other end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving the Agent Actions
&lt;/h2&gt;

&lt;p&gt;The agent needs to do things, not just talk. &lt;/p&gt;

&lt;p&gt;In Vision Agents, you register plain async Python functions as tools with the &lt;code&gt;@llm.register_function()&lt;/code&gt; decorator, and the LLM calls them when the conversation calls for it.&lt;/p&gt;

&lt;p&gt;One rule to know before you write them: registered functions must be async. If you pass a synchronous function, registration raises a &lt;code&gt;ValueError&lt;/code&gt;. The framework checks with &lt;code&gt;inspect.iscoroutinefunction&lt;/code&gt; at registration time, so this fails fast rather than at runtime.&lt;/p&gt;

&lt;p&gt;Here are the four actions the fraud flow needs. Wire them onto the LLM before you attach it to the agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Confirm a flagged transaction was legitimate and clear the hold.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;confirm_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Call your core banking system to release the hold.
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confirmed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transaction_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Freeze the customer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s card after they deny a transaction.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;freeze_card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;card_last4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;frozen&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;card_last4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;card_last4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Open a fraud dispute for a denied transaction.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_dispute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dispute_opened&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transaction_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hand the call off to a human fraud specialist.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;escalate_to_human&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;escalating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Edge&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;agent_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Meridian Fraud Line&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FRAUD_INSTRUCTIONS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;STT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nova-3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eager_turn_detection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cartesia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TTS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sonic-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function name and its parameters become the tool schema the LLM sees, and the &lt;code&gt;description&lt;/code&gt; tells it when to call each one. Notice these functions take a transaction ID and a card's last four digits, never the full number. The tool signatures enforce the same boundary as the instructions: there is no parameter anywhere that could hold a full PAN, CVV, or code, so even a confused model cannot collect one.&lt;/p&gt;

&lt;p&gt;In a real deployment, the function bodies call your core banking and case-management systems. The LLM chains them on its own: a denial leads it to call &lt;code&gt;freeze_card&lt;/code&gt;, then &lt;code&gt;open_dispute&lt;/code&gt;, then &lt;code&gt;escalate_to_human&lt;/code&gt; in sequence. By default the framework allows up to three tool-calling rounds per turn; raise it with &lt;code&gt;openai.LLM(model="gpt-5.5", max_tool_rounds=5)&lt;/code&gt; if a flow needs more steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It on the Phone
&lt;/h2&gt;

&lt;p&gt;Now the outbound call. Twilio places the call and streams the audio to your agent over a &lt;a href="https://getstream.io/resources/projects/webrtc/fundamentals/real-time-communication-with-websockets/" rel="noopener noreferrer"&gt;WebSocket&lt;/a&gt;, and Vision Agents bridges that stream into the same Stream call the agent already runs on. The agent code above does not change. You are adding a thin telephony layer around it.&lt;/p&gt;

&lt;p&gt;The flow for an outbound call is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register the call and mint a one-time token for the media stream.
&lt;/li&gt;
&lt;li&gt;Tell Twilio to dial the customer and point its audio at your websocket URL.
&lt;/li&gt;
&lt;li&gt;When Twilio connects, validate the token, attach the phone audio to the Stream call, and let the agent run the conversation.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uvicorn&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WebSocket&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;twilio.rest&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.plugins&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;twilio&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;NGROK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NGROK_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;call_registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twilio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TwilioCallRegistry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiate_outbound_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;twilio_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TWILIO_ACCOUNT_SID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TWILIO_AUTH_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;call_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare_call&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;phone_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cardholder &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_users&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone_user&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;stream_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream_call&lt;/span&gt;

    &lt;span class="n"&gt;twilio_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;call_registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prepare&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prepare_call&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wss://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;NGROK_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/twilio/media/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;twilio_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;twilio_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;twiml&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;twilio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_media_stream_twiml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;from_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The websocket handler takes over once Twilio connects. It validates the token, accepts the media stream, waits for the prepared agent, and bridges the phone into the call with &lt;code&gt;attach_phone_to_call&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.websocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/twilio/media/{call_sid}/{token}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;media_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_sid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;twilio_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;call_registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_sid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;twilio_stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twilio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TwilioMediaStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;twilio_stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;twilio_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;twilio_stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twilio_stream&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;twilio_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;await_prepare&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;twilio_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stream_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream_call&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;twilio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach_phone_to_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream_call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twilio_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream_call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;participant_wait_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;simple_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Introduce yourself as Meridian Bank&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s fraud line and ask the &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer to confirm the flagged transaction.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;twilio_stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;call_registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_sid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, a small entry point starts the server and places the call. The token in the media URL is what stops a random WebSocket connection from hijacking a call, so it is validated before any audio flows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_with_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uvicorn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uvicorn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;server_task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;initiate_outbound_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;server_task&lt;/span&gt;


&lt;span class="nd"&gt;@click.command&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nd"&gt;@click.option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your Twilio number.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@click.option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The number to call.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run_with_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_number&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Place a call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run outbound.py &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="s2"&gt;"+15551234567"&lt;/span&gt; &lt;span class="nt"&gt;--to&lt;/span&gt; &lt;span class="s2"&gt;"+15559876543"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twilio sends audio as mulaw at 8kHz. The plugin handles the conversion to and from the format your pipeline expects, so you do not deal with codecs directly. Latency is higher in local development than in production. For a real deployment, run close to your users; on Stream's edge, that means deploying to the region nearest them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Compliance?
&lt;/h2&gt;

&lt;p&gt;A few things are worth saying plainly, and none of this is legal advice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the US, the TCPA restricts automated calls, but fraud-prevention calls from a financial institution have generally been treated as exempt under the FCC's rules because they are informational and time-sensitive rather than marketing. The rules around this shift periodically, so a real deployment needs a compliance review rather than a blog post's summary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the technical side, &lt;strong&gt;keep card data out of your transcripts and logs.&lt;/strong&gt; The pipeline in this tutorial never captures a full card number because it never asks for one, which is the cleanest way to stay out of trouble: the safest sensitive data is the data you never collect. The tool signatures back this up by only accepting a transaction ID and a card's last four digits.&lt;/p&gt;

&lt;p&gt;The behavioral rules in the instructions are not “polish you add at the end”. They are what make the call trustworthy to the person answering it. A bot that confirms a transaction and offers to let the customer call the number on the back of their card is behaving exactly like a real bank. A bot that asks for a verification code is behaving exactly like a scammer. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap between those two is the entire product.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Go Next
&lt;/h2&gt;

&lt;p&gt;You have an outbound fraud-alert agent that places a real phone call, confirms a transaction, and takes action on the result, with the trust boundary enforced in both the instructions and the tool signatures.&lt;/p&gt;

&lt;p&gt;From here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swap providers to fit your market.&lt;/strong&gt; The speech-to-text, LLM, and text-to-speech pieces are all one-line changes. &lt;a href="https://visionagents.ai/integrations/llm/sarvam" rel="noopener noreferrer"&gt;Sarvam AI&lt;/a&gt; covers Indian languages, for example.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add answering-machine handling&lt;/strong&gt; for the outbound path so the agent leaves a callback message instead of talking to voicemail.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move to a realtime &lt;a href="https://getstream.io/blog/speech-apis/" rel="noopener noreferrer"&gt;speech-to-speech model&lt;/a&gt;&lt;/strong&gt; if you want the lowest possible latency and can accept coarser transcripts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip the scaffolding entirely.&lt;/strong&gt; If you use Claude Code, Cursor, or Codex, &lt;a href="https://getstream.io/agent-skills/" rel="noopener noreferrer"&gt;Stream's Agent Skills&lt;/a&gt; let you drop the voice agent into your project and describe what you want in plain English:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add GetStream/agent-skills &lt;span class="nt"&gt;-s&lt;/span&gt; stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The phone build in this tutorial is grounded in the framework's own &lt;a href="https://github.com/GetStream/Vision-Agents/tree/main/examples/03_phone_and_rag_example" rel="noopener noreferrer"&gt;phone example&lt;/a&gt;, which pairs telephony with a knowledge base if you want the agent to answer follow-up questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Building
&lt;/h2&gt;

&lt;p&gt;Clone the repo, wire in your own fraud logic, and place a test call to your own phone: &lt;a href="https://github.com/GetStream/Vision-Agents" rel="noopener noreferrer"&gt;github.com/GetStream/Vision-Agents&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you're ready to move past a test number, &lt;a href="https://getstream.io/video/voice-ai/" rel="noopener noreferrer"&gt;Stream's Voice AI&lt;/a&gt; is where this goes to production: hosted STT, LLM, and TTS on a 60+ location edge network, with a P50 voice round-trip around 240 milliseconds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want your fraud agent deployed in the same region as your existing Stream chat and video, so a support call, a video session, and a fraud verification all run on one stack, &lt;a href="https://getstream.io/video/voice-ai/" rel="noopener noreferrer"&gt;join the hosted-agents waitlist&lt;/a&gt;. You can &lt;strong&gt;start building on the open-source framework right now&lt;/strong&gt; either way.  &lt;/p&gt;

</description>
      <category>voiceagent</category>
      <category>python</category>
      <category>fraudalert</category>
      <category>voiceai</category>
    </item>
    <item>
      <title>Build a Marketplace Voice Shopping Agent with Kimi K2.5 and Vision Agents</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:47:00 +0000</pubDate>
      <link>https://dev.to/getstreamhq/build-a-marketplace-voice-shopping-agent-with-kimi-k25-and-vision-agents-am4</link>
      <guid>https://dev.to/getstreamhq/build-a-marketplace-voice-shopping-agent-with-kimi-k25-and-vision-agents-am4</guid>
      <description>&lt;p&gt;A buyer opens your &lt;a href="https://getstream.io/chat/solutions/marketplaces/" rel="noopener noreferrer"&gt;marketplace app&lt;/a&gt; and says: "Find me running shoes under $120, size 10, from a seller who ships in two days." &lt;/p&gt;

&lt;p&gt;Text chatbots stall on requests like that. They need structured follow-ups, live inventory, and seller comparisons across multiple turns. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A voice agent with tool access handles it naturally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This tutorial walks through a voice shopping concierge for a fictional multi-seller marketplace called Pronto Market. Kimi K2.5 powers the reasoning and function calling. Deepgram transcribes speech. ElevenLabs speaks the replies. &lt;a href="https://getstream.io/vision-agents/" rel="noopener noreferrer"&gt;Vision Agents&lt;/a&gt; orchestrates the pipeline over &lt;a href="https://getstream.io/video/" rel="noopener noreferrer"&gt;Stream's WebRTC edge&lt;/a&gt;, so you can test the whole flow in a browser in under 30 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Build
&lt;/h2&gt;

&lt;p&gt;A conversational voice agent named &lt;strong&gt;Riley&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Searches a multi-seller product catalog by query, category, price, and rating
&lt;/li&gt;
&lt;li&gt;Compares sellers on ship time, return policy, and reviews
&lt;/li&gt;
&lt;li&gt;Adds items to a cart after confirming size and price
&lt;/li&gt;
&lt;li&gt;Looks up order status by order ID or email
&lt;/li&gt;
&lt;li&gt;Runs in your browser via Stream, using the same CLI flow as the &lt;a href="https://visionagents.ai/introduction/quickstart" rel="noopener noreferrer"&gt;Vision Agents quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74v52zrznzq6h77ly8hf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74v52zrznzq6h77ly8hf.gif" alt="Marketplace voice agent demo" width="720" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kimi has no native realtime speech API today, so we use a custom pipeline (STT → LLM → TTS) instead of a single speech-to-speech model. That tradeoff buys you two things Kimi excels at: reliable function calling across multi-step shopping flows, and the freedom to swap STT or TTS providers without rewriting your agent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want a camera-and-vision take on Kimi instead of a voice-and-commerce one, see our earlier walkthrough on &lt;a href="https://getstream.io/blog/kimi-k2-agent/" rel="noopener noreferrer"&gt;building a video agent with Kimi K2.5&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The catalog and order data live in a local Python module. That means a database, Stripe checkout, and external marketplace API &lt;strong&gt;aren’t required&lt;/strong&gt; to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.moonshot.ai/" rel="noopener noreferrer"&gt;Kimi K2.5&lt;/a&gt; (&lt;code&gt;kimi-k2.5&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Strong reasoning, native tool use, 256K context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;STT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fast transcription with eager turn detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TTS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://elevenlabs.io/" rel="noopener noreferrer"&gt;ElevenLabs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Natural, retail-friendly voice output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://getstream.io/video/" rel="noopener noreferrer"&gt;Stream WebRTC&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sub-500ms edge delivery, browser demo out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/GetStream/Vision-Agents" rel="noopener noreferrer"&gt;Vision Agents&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Provider-agnostic orchestration, open source&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Audio flows: user speaks → Deepgram STT → Kimi K2.5 (with tools) → ElevenLabs TTS → user hears the reply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note on model versions:&lt;/strong&gt; This tutorial uses &lt;code&gt;kimi-k2.5&lt;/code&gt;, released January 2026. Moonshot has since shipped newer models (k2.6, k2.7) and rotates the k2 series over time. If &lt;code&gt;kimi-k2.5&lt;/code&gt; no longer resolves when you run this, check the &lt;a href="https://platform.moonshot.ai/" rel="noopener noreferrer"&gt;Moonshot model list&lt;/a&gt; and swap the model string. The code stays the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;You'll need API keys from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://platform.moonshot.ai/" rel="noopener noreferrer"&gt;Moonshot Platform&lt;/a&gt; for &lt;code&gt;MOONSHOT_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt; for &lt;code&gt;DEEPGRAM_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elevenlabs.io/" rel="noopener noreferrer"&gt;ElevenLabs&lt;/a&gt; for &lt;code&gt;ELEVENLABS_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://getstream.io/try-for-free/" rel="noopener noreferrer"&gt;Stream&lt;/a&gt; for &lt;code&gt;STREAM_API_KEY&lt;/code&gt; and &lt;code&gt;STREAM_API_SECRET&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll also need Python 3.12 and &lt;a href="https://docs.astral.sh/uv/getting-started/installation/" rel="noopener noreferrer"&gt;uv&lt;/a&gt; installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Scaffold the Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv init pronto-voice-shop &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;pronto-voice-shop
uv add &lt;span class="s2"&gt;"vision-agents[openai,deepgram,elevenlabs,getstream]"&lt;/span&gt; python-dotenv
uv add &lt;span class="s2"&gt;"getstream&amp;gt;=3.4.0,&amp;lt;3.5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line pins the Stream Python SDK. Fresh installs currently resolve &lt;code&gt;getstream&lt;/code&gt; 3.5.0, which breaks &lt;code&gt;getstream.Edge()&lt;/code&gt; on vision-agents 0.6.x. Pin to 3.4.x until that compatibility issue is fixed upstream.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uv init&lt;/code&gt; creates &lt;code&gt;main.py&lt;/code&gt; and &lt;code&gt;pyproject.toml&lt;/code&gt;. We'll work in two files: &lt;code&gt;catalog.py&lt;/code&gt; for the mock data and tools, and &lt;code&gt;agent.py&lt;/code&gt; for the agent itself. Rename the generated file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;main.py agent.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in the project root and add your keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env&lt;/span&gt;
&lt;span class="nv"&gt;STREAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_stream_api_key
&lt;span class="nv"&gt;STREAM_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_stream_api_secret
&lt;span class="nv"&gt;MOONSHOT_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_moonshot_api_key
&lt;span class="nv"&gt;DEEPGRAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_deepgram_api_key
&lt;span class="nv"&gt;ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_elevenlabs_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vision Agents auto-loads these per plugin via &lt;code&gt;load_dotenv()&lt;/code&gt;. &lt;code&gt;MOONSHOT_API_KEY&lt;/code&gt; is required. The agent reads it directly in &lt;code&gt;setup_llm()&lt;/code&gt; and will not start without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add the Mock Marketplace Catalog
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;catalog.py&lt;/code&gt; in the project root. This file holds sellers, products, a session cart, and sample orders. Everything is in memory, so the tutorial runs without external services.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# catalog.py
&lt;/span&gt;
&lt;span class="n"&gt;SELLERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;peak-gear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Peak Gear Co.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30-day free returns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_ship_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trailhead-supply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Trailhead Supply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14-day returns, buyer pays shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_ship_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urban-run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Urban Run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;45-day returns on unworn items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_ship_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boot-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TrailRunner GTX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;footwear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;waterproof hiking boots gore-tex trail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;129.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;peak-gear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoe-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;City Sprint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;footwear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily running shoes breathable mesh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;89.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urban-run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jacket-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;StormShell Rain Jacket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outerwear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;waterproof packable rain jacket hiking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;79.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;S&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trailhead-supply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pack-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Daypack 28L&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;day hiking backpack hydration compatible&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;59.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;one-size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trailhead-supply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ORD-1042&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alex@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tracking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1Z999AA10123456784&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoe-005&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;estimated_delivery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-06-27&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ORD-1038&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jamie@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tracking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boot-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;estimated_delivery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-06-29&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;CART&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_product_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;500.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;min_rating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;query_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min_rating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;SELLERS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;query_lower&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query_lower&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;seller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SELLERS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ships_in_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_seller_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;seller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SELLERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown seller: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seller_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_ship_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_ship_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_cart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_product_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Product not found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not available. Available: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sizes&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;line_total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;CART&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cart_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CART&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;added&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cart_total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;line_total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CART&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_order_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No order found. Check the order ID or email and try again.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Register Tools on Kimi K2.5
&lt;/h2&gt;

&lt;p&gt;Replace the contents of &lt;code&gt;agent.py&lt;/code&gt; with the code below. The &lt;code&gt;setup_llm()&lt;/code&gt; function wires Kimi through the OpenAI-compatible Chat Completions API and registers four marketplace tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# agent.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AgentLauncher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vision_agents.plugins&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elevenlabs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;MARKETPLACE_INSTRUCTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;You are Riley, a voice shopping assistant for Pronto Market, a multi-seller marketplace.

Voice rules:
- One or two short sentences per turn. Max 25 words.
- Ask one clarifying question at a time.
- Before adding to cart, confirm product, size, and price.
- When comparing sellers, mention rating and ship time, not long feature lists.

Use tools to search, compare sellers, update the cart, and check orders. Never invent inventory.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_llm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletionsLLM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ChatCompletionsLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kimi-k2.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.moonshot.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MOONSHOT_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search marketplace products by query, category, max price, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and minimum seller rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;500.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;min_rating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_rating&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Get seller profile: rating, return policy, average ship time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_seller_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_seller_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seller_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add a product to the buyer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s cart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_cart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_to_cart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@llm.register_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Look up order status by order ID or buyer email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_order_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_order_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;getstream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Edge&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;agent_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Riley, Pronto Market&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MARKETPLACE_INSTRUCTIONS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;setup_llm&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;stt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;STT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eager_turn_detection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;elevenlabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TTS&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;join_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;simple_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Greet the buyer warmly. You are Riley from Pronto Market. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ask what they are looking for today.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="n"&gt;runner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AgentLauncher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;join_call&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;join_call&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kimi K2.5 supports function calling with automatic tool invocation. When a buyer asks about boots under $150, Kimi calls &lt;code&gt;search_products&lt;/code&gt;, reads the results, and speaks a short summary back through ElevenLabs. See the &lt;a href="https://visionagents.ai/integrations/kimi" rel="noopener noreferrer"&gt;Kimi integration docs&lt;/a&gt; and &lt;a href="https://visionagents.ai/guides/mcp-tool-calling" rel="noopener noreferrer"&gt;function calling guide&lt;/a&gt; for more patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Run It
&lt;/h2&gt;

&lt;p&gt;Start the agent from the project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run agent.py run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI prints a join link. Open it in your browser, allow microphone access, and start talking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try this script:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"I'm looking for waterproof hiking boots under $150."
&lt;/li&gt;
&lt;li&gt;"Which seller ships fastest?"
&lt;/li&gt;
&lt;li&gt;"Add size 10 to my cart."
&lt;/li&gt;
&lt;li&gt;"Where's order ORD-1042?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example dialogue:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Riley:&lt;/strong&gt; Hi, I'm Riley from Pronto Market. What are you shopping for today?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; Waterproof hiking boots under $150.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Riley:&lt;/strong&gt; I found three options. TrailRunner GTX from Peak Gear is $129.99, ships in two days. Want size 10?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; Which seller ships fastest?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Riley:&lt;/strong&gt; Urban Run ships in one day, but they sell running shoes, not boots. For boots, Peak Gear ships fastest at two days.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That back-and-forth is Kimi chaining tool calls across turns while keeping replies short enough for voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Demo to Production
&lt;/h2&gt;

&lt;p&gt;The mock catalog in &lt;code&gt;catalog.py&lt;/code&gt; is a stand-in for your real backend. In production, swap each tool function for calls to your own services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;search_products&lt;/code&gt;&lt;/strong&gt; → catalog search API (Algolia, Elasticsearch, or your OMS)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_seller_info&lt;/code&gt;&lt;/strong&gt; → seller profile service
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;add_to_cart&lt;/code&gt;&lt;/strong&gt; → cart session API (the same endpoints you'd expose to a text agent)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_order_status&lt;/code&gt;&lt;/strong&gt; → order management system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Text-based agentic commerce is standardizing around protocols like the &lt;a href="https://www.agenticcommerce.dev/" rel="noopener noreferrer"&gt;Agentic Commerce Protocol (ACP)&lt;/a&gt; and Google's Universal Commerce Protocol (UCP). Voice fits the same architecture: the input modality changes, but the checkout session, inventory lookup, and order tracking stay the same. Your voice agent calls the same REST or MCP endpoints a chat agent would.&lt;/p&gt;

&lt;p&gt;To reach buyers outside the browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phone:&lt;/strong&gt; extend this agent with &lt;a href="https://visionagents.ai/examples/twilio-phone-agent" rel="noopener noreferrer"&gt;Twilio phone integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile app:&lt;/strong&gt; join the same Stream call from &lt;a href="https://getstream.io/video/sdk/" rel="noopener noreferrer"&gt;Stream's client SDKs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed hosting:&lt;/strong&gt; &lt;a href="https://getstream.io/video/voice-ai/" rel="noopener noreferrer"&gt;Stream Voice AI&lt;/a&gt; runs production voice agents on Stream's global edge with co-located STT, LLM, and TTS. &lt;a href="https://getstream.io/video/voice-ai/" rel="noopener noreferrer"&gt;Join the waitlist&lt;/a&gt; for early access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Kimi K2.5 for Marketplace Voice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multi-tool reasoning.&lt;/strong&gt; A single shopping request often needs search, seller comparison, and cart update in sequence. Kimi K2.5 handles that reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;256K context window.&lt;/strong&gt; You can load full seller policy documents, return FAQs, or category guidelines into the system prompt without setting up RAG first. Useful when marketplace rules vary by seller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI-compatible API.&lt;/strong&gt; Kimi plugs into Vision Agents through &lt;code&gt;openai.ChatCompletionsLLM&lt;/code&gt; with a custom base URL. Same pattern works for other OpenAI-compatible providers if you want to benchmark latency or cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Room to grow.&lt;/strong&gt; The same &lt;code&gt;Agent&lt;/code&gt; class supports video processors later. A follow-up tutorial could let buyers hold up a product to the camera and ask "do you have this in size 10?"&lt;/p&gt;

&lt;p&gt;We like Kimi for marketplace flows because the model stays grounded when tool results come back mid-conversation. It summarizes inventory instead of inventing products, which matters when money is on the line.&lt;/p&gt;

&lt;p&gt;A tuning note: Moonshot's published guidance for K2.5 is temperature 1.0 for thinking mode and 0.6 for instant mode, with top_p 0.95. The code above doesn't set temperature, so you get the provider default. If you want shorter, more deterministic replies for voice, start at the instant-mode setting and test from there.&lt;/p&gt;

&lt;p&gt;Give it a try, swap in your catalog API, and let Riley handle the voice layer while Kimi does the reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Star &lt;a href="https://github.com/GetStream/Vision-Agents" rel="noopener noreferrer"&gt;Vision Agents on GitHub&lt;/a&gt;&lt;/strong&gt; if this helped. Pull requests and issue reports welcome.&lt;/p&gt;

</description>
      <category>voiceai</category>
      <category>visionagents</category>
      <category>voiceshoppingagent</category>
      <category>kimik2</category>
    </item>
    <item>
      <title>How To Build a Social Media App: Types, Features, Monetization</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Fri, 20 Mar 2026 20:32:54 +0000</pubDate>
      <link>https://dev.to/getstreamhq/how-to-build-a-social-media-app-types-features-monetization-132d</link>
      <guid>https://dev.to/getstreamhq/how-to-build-a-social-media-app-types-features-monetization-132d</guid>
      <description>&lt;p&gt;People leave social media apps for many reasons, such as a lack of trust in leadership, to improve mental health, or because of political alignment. Many are just looking for a more authentic social platform. To be that platform, you'll need to start with a roadmap and &lt;a href="https://getstream.io/blog/build-a-social-media-app/" rel="noopener noreferrer"&gt;build your social media network&lt;/a&gt; from the ground up.&lt;/p&gt;

&lt;p&gt;Let's take a high-level overview of what you need to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of the Social Media App Market
&lt;/h2&gt;

&lt;p&gt;Various social media platforms have come and gone over the years, with some staying around long term, like Snapchat, and others becoming popular before losing steam, like Clubhouse. As of winter 2023, older platforms like Facebook, Instagram, and YouTube are still on top, but &lt;a href="https://datareportal.com/social-media-users" rel="noopener noreferrer"&gt;TikTok is growing fast&lt;/a&gt;. Twitter usage has fluctuated in recent years, dipping in 2018 and 2019 before seeing growth again, while &lt;a href="https://www.businessofapps.com/data/pinterest-statistics/" rel="noopener noreferrer"&gt;Pinterest&lt;/a&gt; usage declined recently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.businessofapps.com/data/social-app-market/#:~:text=The%20average%20smartphone%20user%20spends%202%20hours%20and%2020%20minutes%20a%20day%20or%2070%20hours%20on%20social%20media%20apps%20every%20month%20and%2055%25%20of%20the%20population%2C%20or%204.88%20billion%20people%2C%20have%20social%20media%20accounts." rel="noopener noreferrer"&gt;Business of Apps&lt;/a&gt; says 4.88 billion people worldwide have social media accounts, and smartphone users spend 70 hours using social media apps monthly. According to a &lt;a href="https://www.grandviewresearch.com/press-release/global-social-networking-app-market" rel="noopener noreferrer"&gt;report by Grand View Research&lt;/a&gt;, Inc., the social networking app market is projected to rise to $310.37 billion US by 2030. It's expected to have a compound annual growth rate of 26.2% from 2023 to 2030. Grand View Research attributes this to an increase in demand for digital marketing services globally. It's also due to increased social media adoption from all age groups, increased use of smartphones, and increased internet access.&lt;/p&gt;

&lt;p&gt;Musk's Twitter purchase sent people away from the app, including prominent users, though many searched for alternatives to join. In the wake, alternative online communities have gained users. Some growth has been at a sustainable pace, like &lt;a href="https://www.businessofapps.com/data/discord-statistics/" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; and &lt;a href="https://www.businessofapps.com/data/reddit-statistics/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;, and some has been temporary, like the spike seen at Mastodon, which slowed in the months following.&lt;/p&gt;

&lt;p&gt;Among the &lt;a href="https://blog.hubspot.com/marketing/state-of-social-media" rel="noopener noreferrer"&gt;top social media trends&lt;/a&gt; are &lt;a href="https://getstream.io/blog/user-generated-content-examples/" rel="noopener noreferrer"&gt;user-generated content&lt;/a&gt; and highly personalized content. TikTok excels at both of these since users primarily create and share video content, and the app's #ForYou page is the main way users discover content. &lt;a href="https://getstream.io/blog/tiktok-feed-lessons/" rel="noopener noreferrer"&gt;TikTok's algorithms&lt;/a&gt; excel at helping users find content that resonates with them and feels genuine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.hootsuite.com/how-to-make-money-on-social-media/#:~:text=3.%20Enroll%20in%20platform%2Dspecific%20monetization%20programs" rel="noopener noreferrer"&gt;Monetization&lt;/a&gt; of user accounts is keeping them on platforms like TikTok and Facebook that pay them for the number of views their content garners as more people look to earn money on social media. &lt;a href="https://sproutsocial.com/insights/creator-marketing/" rel="noopener noreferrer"&gt;Influencer marketing&lt;/a&gt; continues to grow as a marketing tactic for many companies that have found authenticity is key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Social Media Apps
&lt;/h2&gt;

&lt;p&gt;Each &lt;a href="https://getstream.io/blog/social-app-types/" rel="noopener noreferrer"&gt;type of social media application&lt;/a&gt; has its own unique audience and purpose. For example, Facebook attracts older users for social networking, while Snapchat targets younger users and is designed for photo sharing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Social Networks | Examples: Facebook, LinkedIn
&lt;/h3&gt;

&lt;p&gt;Considered traditional or legacy apps, social networks allow people to interact in a multitude of ways, through profiles, activity feeds, posts, photo and video content, groups, and more. Sites like these are some of the most successful because they've continuously adapted over time while continuing to grow. People use Facebook to connect with faraway family and friends, and they use LinkedIn to build and maintain their professional network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Photo Sharing | Examples: Instagram, Snapchat
&lt;/h3&gt;

&lt;p&gt;Apps like Instagram allow users to share photos with captions and filters, as well as infographics and direct messages. Instagram launched at a time when mobile phone cameras became better, and Snapchat created something entirely new with ephemeral content that disappears within 24 hours. In recent years, Instagram and other photo apps have incorporated more video to compete with apps like TikTok.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Video Sharing | Examples: YouTube, TikTok
&lt;/h3&gt;

&lt;p&gt;Some video-sharing apps are better for longer videos, like YouTube and Vimeo, while others focus on short-form content, like TikTok. YouTube is one of the oldest video-sharing platforms, making it extremely well known. It's accessed by more than 2.5 billion people each month. TikTok's success comes from its interactive capabilities and its #ForYou page algorithm that keeps users scrolling for hours. The app has more than 3 billion downloads.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Sharing | Examples: Pinterest, SlideShare
&lt;/h3&gt;

&lt;p&gt;Content-sharing apps provide a place for users to share multiple types of content, but they typically lean toward informational content in visual formats. Pinterest serves as a virtual pinboard where users add links, images, and photos from around the internet. They can also upload their own content, like how-tos, recipes, and infographics. People gravitate toward Pinterest for planning and organizing their thoughts, like gathering ideas for a birthday party, inspiration for a kitchen renovation, or tips on childcare. SlideShare users upload professional presentation decks, making it a strong contender for business use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blogging/Microblogging | Examples: Medium, Twitter
&lt;/h3&gt;

&lt;p&gt;Blogs and microblogs are primarily text-based but include photos, videos, and links as well. On sites like Medium, users can publish articles or blogs with media embedded. Many professionals use the site to share long-form thought leadership content. Twitter, an early social media app, provides a place for users to have conversations, publicly or privately, in media attachments and a maximum of 280 characters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Post/Forum | Examples: Reddit, Quora
&lt;/h3&gt;

&lt;p&gt;Forum-type sites serve as a place to have conversations and connect mainly through text posts and comments. Reddit, founded in 2005, allows users to join communities where moderators help guide discussions on a number of topics, from current events to personal finance to favorite television shows. Question-and-answer platform Quora draws many professionals who have the know-how to answer questions and share knowledge about their areas of expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Messaging | Examples: WhatsApp, Discord
&lt;/h3&gt;

&lt;p&gt;Similar to text or SMS messages, social media messaging services are mostly used for sending text messages but also let users share photos, videos, gifs, audio, and more. &lt;a href="https://getstream.io/blog/whatsapp-features/" rel="noopener noreferrer"&gt;WhatsApp&lt;/a&gt; grew in popularity because it offered a way for users to message and call each other for free, including internationally. Discord drew a large audience of gamers and gave them a space to create &lt;a href="https://getstream.io/blog/in-game-chat/" rel="noopener noreferrer"&gt;online gaming communities&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Social Media App Build Process
&lt;/h2&gt;

&lt;p&gt;When you align the process of building your own social media app with the phases of &lt;a href="https://www.notion.so/blog/project-management-playbook-for-founders" rel="noopener noreferrer"&gt;project management&lt;/a&gt;, the roadmap to launching your product includes five phases.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Project Initiation&amp;nbsp;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Document the big picture for your app idea.&lt;/strong&gt; What niche will your social media app fill, or what problem will it solve for its users? You can do this with a &lt;a href="https://www.notion.so/blog/product-vision-boards-for-teams" rel="noopener noreferrer"&gt;product vision board&lt;/a&gt; or a product requirement document. These techniques help you outline your business goals, stay focused on your vision, and determine the target audience for your app.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Start your go-to-market strategy.&lt;/strong&gt; Develop an ideal customer profile and research your competitors. Begin thinking about how you'll position and market your app and what tactics might be best to promote it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Project Planning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Make key development decisions.&lt;/strong&gt; Will you develop your social media app for &lt;a href="https://getstream.io/chat/sdk/ios/" rel="noopener noreferrer"&gt;iOS&lt;/a&gt; or &lt;a href="https://getstream.io/chat/sdk/android/" rel="noopener noreferrer"&gt;Android&lt;/a&gt;? What development framework and tech stack will you use? What features do you want your app to have? Answering these questions will help you determine how long it will take to create your app and what resources you'll need. (We'll look at these decisions in depth later.)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Choose your project management methodology.&lt;/strong&gt; Waterfall, Kanban, Agile, or something else? Each method has pros and cons. Consider the outcomes you'd like to achieve with your social media app.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Create your project timeline and budget.&lt;/strong&gt; You'll be able to estimate timing and costs based on your selections to this point. For example, if you've opted to build an app for Apple iOS, you can include a line item in your budget for the &lt;a href="https://developer.apple.com/support/compare-memberships/" rel="noopener noreferrer"&gt;developer membership fee&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Project Execution&amp;nbsp;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Create an admin panel.&lt;/strong&gt; The admin panel will serve as your operations headquarters to control your app. It's a space where you can view user activations, ban users who violate your terms of service, oversee app features, and more.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Design your mobile app.&lt;/strong&gt; Create a wireframe for your app to map out its functionality using best practices for &lt;a href="https://getstream.io/blog/mobile-app-apis/" rel="noopener noreferrer"&gt;UI/UX design&lt;/a&gt;. Consistency in the design and simple, intuitive navigation help keep users coming back.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Complete app development and quality assurance.&lt;/strong&gt; Hand your project plans and design to the team who will develop your social media app. Complete QA testing to address bugs. Social media users will jump to another platform when one isn't working correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 4: Project Monitoring and Controlling&amp;nbsp;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Track project timeline, progress, and costs.&lt;/strong&gt; Maintain documentation on the progress of your app throughout, so you will have a thorough history of what went smoothly and what didn't. You can use that information going forward when making updates and adding features to your social media app.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Adjust for unexpected delays, issues, and cost overruns.&lt;/strong&gt; Modify your timeline and budget to accommodate &lt;a href="https://getstream.io/blog/hidden-build-costs/" rel="noopener noreferrer"&gt;changes to your product roadmap&lt;/a&gt;. There may be outside influences, like new legislation, or trends among competitors that prompt the adjustments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 5: Project Closing&amp;nbsp;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Launch your app and wrap up the project.&lt;/strong&gt; Release your social media app to the world and work on increasing downloads and building an active user base. Wrap up your project by making sure all related expenses are settled. Then archive all project plans, budgets, and documents.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gather feedback from the team and users.&lt;/strong&gt; Feedback helps you improve your social media app. You can also use this information on future projects or updates to your app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Considerations for the Application Development Phase
&lt;/h2&gt;

&lt;p&gt;The decisions you make during the development phase will impact which technologies you use — from the backend development to the frontend user experience to which app store it's available through.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pick Your Platform&amp;nbsp;
&lt;/h3&gt;

&lt;p&gt;Startups typically develop their app for either Apple iOS or Android first — not both. The choice will depend on factors like your timeline and target market. While Android usage leads the way globally, iOS usage leads in countries like Japan and the United States.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pin Down Your Development Framework&amp;nbsp;
&lt;/h3&gt;

&lt;p&gt;Selecting the type of &lt;a href="https://appmaster.io/blog/effective-software-development-framework" rel="noopener noreferrer"&gt;development framework&lt;/a&gt; to use will depend on your team's skills and your budget.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;SaaS&lt;/strong&gt; — Many &lt;a href="https://www.g2.com/categories/application-development-platforms" rel="noopener noreferrer"&gt;SaaS companies&lt;/a&gt; can help you build an app quickly with pre-built features. These services are DIY, so customization options will be limited.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CMS&lt;/strong&gt; — &lt;a href="https://www.g2.com/categories/online-community-management#learn-more" rel="noopener noreferrer"&gt;Community management software&lt;/a&gt; allows you to create online community spaces that you can control. While they can be useful for brands that already have a loyal following, they lack customization capabilities.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Open-source&lt;/strong&gt; — &lt;a href="https://www.designrush.com/agency/mobile-app-design-development/trends/free-app-builders" rel="noopener noreferrer"&gt;Open-source software&lt;/a&gt; is pre-built software that offers a lot of flexibility. You can even find no-code or low-code options, and some software is free.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Develop from the ground up&lt;/strong&gt; — To develop an app from scratch, you'll need to &lt;a href="https://www.turing.com/resources/know-all-about-hiring-an-app-developer" rel="noopener noreferrer"&gt;hire skilled developers or an app development company&lt;/a&gt;. This is an expensive option but gives you the ability to develop a custom app to suit your specific needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose Your Tech Stack&amp;nbsp;
&lt;/h3&gt;

&lt;p&gt;Your platform choice and development framework will help you narrow down the rest of your technology stack for your app. If you're not using an agency to create your app, closely evaluate your options for APIs, plugins, and &lt;a href="https://getstream.io/chat/sdk/" rel="noopener noreferrer"&gt;chat SDKs&lt;/a&gt;. These can be used to connect to app features like sign-in, chat, geolocation services, and more.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://getstream.io/blog/build-vs-buy-chat/" rel="noopener noreferrer"&gt;right external tech solutions&lt;/a&gt; can help you increase efficiencies and cut down your app development cost and timeline. Consider the limitations of the technology, cost, and scalability. Technology that's limited or can't scale to the size of your user base will result in a bad user experience and harm retention.&lt;/p&gt;

&lt;p&gt;You'll also need a database, such as &lt;a href="https://www.mysql.com/" rel="noopener noreferrer"&gt;MySQL&lt;/a&gt; or &lt;a href="https://aws.amazon.com/rds/" rel="noopener noreferrer"&gt;Amazon RDS&lt;/a&gt;, and a storage solution, like &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon AWS&lt;/a&gt; or &lt;a href="https://cloud.google.com/appengine" rel="noopener noreferrer"&gt;Google App Engine&lt;/a&gt;. Capabilities, cost, and scalability are equally important for your database and storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Select Your App Features
&lt;/h3&gt;

&lt;p&gt;Start with the basic &lt;a href="https://getstream.io/blog/social-media-app-features/" rel="noopener noreferrer"&gt;social media app features&lt;/a&gt;. Every social media network includes user profiles and activity feeds. Then consider what must-have features and advanced features will attract your target market and boost user engagement.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;User profiles&lt;/strong&gt; are an area where users can provide basic information about themselves, their company, or their organization.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Newsfeeds&lt;/strong&gt;, or &lt;a href="https://getstream.io/activity-feeds/" rel="noopener noreferrer"&gt;activity feeds&lt;/a&gt;, provide a list of actions that other users have taken and are updated in real time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Content&lt;/strong&gt; will depend on the type of social media network you create and can include text, images, video, or external links.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;In-app content creation&lt;/strong&gt; tools help users create content from scratch without having to leave the app.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Augmented reality&lt;/strong&gt; within social media lets users apply filters or effects to images.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Search bar functionality&lt;/strong&gt; on social media helps users find each other and find publicly viewable content about specific topics.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Social SEO&lt;/strong&gt; allows users to use SEO strategies to help make their profiles more visible in search engines.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Chat/messaging&lt;/strong&gt; services allow users of your app to connect privately and in small groups.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Groups/discussion forums&lt;/strong&gt; provide a place for users to connect with others on special interest topics.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Push notifications&lt;/strong&gt; send alerts to your users to let them know there is a new update or message.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security and safety features&lt;/strong&gt;, such as multi-factor authentication, keep users' information secure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Monetize Your App
&lt;/h2&gt;

&lt;p&gt;Part of creating a successful app is finding revenue streams to tap into. The &lt;a href="https://getstream.io/blog/social-media-business-models/" rel="noopener noreferrer"&gt;monetization strategies&lt;/a&gt; you focus on will depend on the type of site you're creating and your target users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advertising
&lt;/h3&gt;

&lt;p&gt;Digital advertising is standard for social media apps at this point. Even small advertising budgets can make a big difference for a small business on social media, as long as the algorithms for advertising are effective at pushing the ads to the right social media users.&lt;/p&gt;

&lt;p&gt;A self-serve platform makes it easy for business users to create and place their own ads. You'll also want to offer &lt;a href="https://blog.hootsuite.com/social-media-metrics/" rel="noopener noreferrer"&gt;meaningful ad metrics&lt;/a&gt;, like reach, impressions, and engagement rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  In-app Purchases
&lt;/h3&gt;

&lt;p&gt;In-app purchases might include subscriptions, special filters, exclusive features, points or tokens for games, or rewards or gifts that you can give content creators.&lt;/p&gt;

&lt;p&gt;Usage of in-app purchases can be very specific to the type of app you offer. On the video app TikTok, users can purchase gifts to give to other content creators. On Instagram, users can subscribe to exclusive content created by users who've opted to monetize their accounts. The app, in turn, takes a percentage of the money from the transaction or charges the monetized user a monthly fee.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subscriptions
&lt;/h3&gt;

&lt;p&gt;The subscription model is one that's in an evolving state as apps continue to look for ways to earn revenue. Some apps, such as &lt;a href="https://apps.apple.com/us/app/raya/id957215308" rel="noopener noreferrer"&gt;Raya&lt;/a&gt;, are exclusive, invite-only social networks. Tumblr offers a subscription to use the platform ad-free. On LinkedIn, you can subscribe as a premium member, which gives you access to view additional job applicant information, direct messaging features, and learning courses.&lt;/p&gt;

&lt;p&gt;In November 2022, after Musk's purchase of Twitter, he launched an account verification subscription service that allowed anyone to buy a verified account with a blue checkmark. The service was rolled back within 48 hours after users &lt;a href="https://www.engadget.com/twitter-blue-verification-impersonation-disaster-203656712.html" rel="noopener noreferrer"&gt;created fake accounts&lt;/a&gt; that looked authentic and caused chaos so extreme that it impacted the stock markets. For $8, someone purchased a verified account and spoofed the pharmaceutical company Eli Lilly. After the spoof account tweeted that insulin would be free, &lt;a href="https://gizmodo.com/twitter-eli-lilly-elon-musk-insulin-1849779323#:~:text=Most%20importantly%20for,in%20market%20cap." rel="noopener noreferrer"&gt;Eli Lilly's stock fell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Twitter's idea led other social media networks to explore similar strategies. In February 2023, &lt;a href="https://techcrunch.com/2023/02/27/social-media-apps-adopting-subscription-models/" rel="noopener noreferrer"&gt;Facebook announced a verification program&lt;/a&gt; that verifies a user's identity and offers customer support access, protection from impersonators, and other features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Partnerships
&lt;/h3&gt;

&lt;p&gt;Partner programs can be a lucrative way to encourage people to join your app and continuously create content. YouTube's Partner Program is available to users with at least 1,000 subscribers and 4,000 hours of videos they uploaded being watched. YouTube pays qualifying users who opt in a percentage of the ad sales for their videos.&lt;/p&gt;

&lt;p&gt;You can also partner with prominent, highly active social media users and brands to create promotional content for your app. Promotions from influencers help them grow their follower count and give you visibility with new users. Just be sure that both you and your partners follow all &lt;a href="https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers" rel="noopener noreferrer"&gt;FTC disclosure requirements&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs: How To Build a Social Media App&amp;nbsp;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does it cost to create a social media app?
&lt;/h3&gt;

&lt;p&gt;Cost can vary from a few thousand dollars using out-of-the-box/premade software and plugins to half a million or more for a custom-built platform with sophisticated proprietary technology. The discovery phase will help you learn which options align with your budget and best fit your vision.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to build a social media app?
&lt;/h3&gt;

&lt;p&gt;For a simple platform, it can take just a few weeks to build out your app, while a more complicated app with a lot of features can take six months or more.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it hard to create a social media app?
&lt;/h3&gt;

&lt;p&gt;While there are simple ways of creating social media apps, making them a success can be difficult. Your app needs to solve a problem for its users that makes it compelling to use and come back to. It needs to function well and be user-friendly, which takes the right team to make happen.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Is having your own social network profitable?
&lt;/h3&gt;

&lt;p&gt;It can be. The key to creating a social media network that's profitable is gaining enough active users. The higher the number of users you have, the easier it is to charge business users for advertising and partnerships.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the safest social media app?
&lt;/h3&gt;

&lt;p&gt;This depends on what you mean by safest. If you're referring to &lt;a href="https://startuptalky.com/privacy-focused-social-media-platforms/" rel="noopener noreferrer"&gt;privacy on social media&lt;/a&gt;, apps like Signal and MeWe have a heavy focus on protecting users' privacy. Signal, a messaging app similar to WhatsApp, has end-to-end encryption. MeWe has a strong privacy policy and no advertising. When considering safety from the perspective of &lt;a href="https://hacked.com/which-social-media-services-are-best-for-you/" rel="noopener noreferrer"&gt;online harassment and abuse&lt;/a&gt;, sites like Twitter and Instagram allow you to create private accounts and easily block other users.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I make an app with no experience?
&lt;/h3&gt;

&lt;p&gt;Absolutely. You should understand the basics of the process and of the social media market, but the development process doesn't require experience.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to know coding to create an app?
&lt;/h3&gt;

&lt;p&gt;You can use services that allow you to build apps without coding by choosing features that are already built. Or, you can build a team that has the knowledge to build the app for you or even hire a company that specializes in social networking app development.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Which social media app makes the most money?
&lt;/h3&gt;

&lt;p&gt;Facebook earns the most revenue of social media apps, with $116.6 billion in revenue in 2022.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Media App Development for Startups
&lt;/h2&gt;

&lt;p&gt;There are many paths you can take to build your social media app, but you don't have to learn how to code your app design from scratch or hire a development team. You can integrate important core features like chat and activity feeds easily with Stream. With this basic functionality in place, you can focus your efforts on the best ways to build the rest of your app and make it a success.&lt;/p&gt;

</description>
      <category>socialmedia</category>
      <category>softwaredevelopment</category>
      <category>startup</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best Visual AI Agents in 2026: Real-Time &amp; Multimodal Tools</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Tue, 03 Mar 2026 23:03:09 +0000</pubDate>
      <link>https://dev.to/getstreamhq/best-visual-ai-agents-in-2026-real-time-multimodal-tools-44g6</link>
      <guid>https://dev.to/getstreamhq/best-visual-ai-agents-in-2026-real-time-multimodal-tools-44g6</guid>
      <description>&lt;p&gt;Chatbot integration in popular software has become so widespread that it no longer offers a meaningful competitive edge. The real challenge now is moving beyond simple text interfaces to build products that can &lt;a href="https://getstream.io/blog/how-vision-models-work/" rel="noopener noreferrer"&gt;perceive the world as it is&lt;/a&gt; and carry out meaningful tasks.&lt;/p&gt;

&lt;p&gt;Visual AI agents give this edge by combining computer vision with agentic reasoning to perform tasks with little to no input from the user. &lt;/p&gt;

&lt;p&gt;This guide will go deeper into what AI agents are, some of the top picks, and supporting architecture, as well as how to choose the best visual AI agent(s) for your organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Visual AI Agents?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://getstream.io/glossary/vision-ai/" rel="noopener noreferrer"&gt;Visual AI&lt;/a&gt; agents are intelligent and autonomous systems that can plan, reason, and make decisions using visual information from photos, videos, and live feeds. What sets visual agents apart from existing computer vision systems, such as traditional &lt;a href="https://getstream.io/blog/visual-search/" rel="noopener noreferrer"&gt;visual search systems&lt;/a&gt;, is their ability to act on contextual information. &lt;/p&gt;

&lt;p&gt;Their core capabilities center around functions like object detection, spatial reasoning, multimodal understanding, and image-to-action.&lt;/p&gt;

&lt;p&gt;By merging computer vision with agentic AI, these systems can act on visual context with minimal explicit instruction. One common consumer-facing use case is hands-free, &lt;a href="https://getstream.io/glossary/conversational-ai/" rel="noopener noreferrer"&gt;conversational interactions&lt;/a&gt; with built-in AI assistants in smart glasses.&lt;/p&gt;

&lt;p&gt;Here are some broad categories of visual AI agents to illustrate other uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Robotics/perception agents&lt;/strong&gt; control objects in real-world settings like autonomous vehicle navigation, real-time object recognition and manipulation, and surveillance and escalation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative visual agents&lt;/strong&gt; generate and modify visual content. Examples include digital design assistants, automatic media post-production, and style transfer and editing.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytical agents&lt;/strong&gt; extract information from visual input to make decisions. They’re used for medical imaging analysis, retail shelf monitoring and footfall tracking, and &lt;a href="https://getstream.io/blog/ai-sports/" rel="noopener noreferrer"&gt;sports coaching&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 4 Best Visual AI Agents
&lt;/h2&gt;

&lt;p&gt;Many of the most powerful AI models &lt;a href="https://getstream.io/blog/multimodal-ai-agents/" rel="noopener noreferrer"&gt;are multimodal&lt;/a&gt;, allowing them to accept inputs in different forms, such as visual data, text data, and files. Some of our picks for the best visual AI agents aren't purpose-built to ingest purely visual data, but they happen to excel at it. &lt;/p&gt;

&lt;p&gt;With that out of the way, let’s look at some of the best visual AI agents on the market.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon Bedrock Agents
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g1h59r4gk366bs05q39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g1h59r4gk366bs05q39.png" alt="AskUI Vision Agent" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/bedrock/agents/" rel="noopener noreferrer"&gt;Bedrock Agents&lt;/a&gt; can be configured to work as visual agents by using foundation models with an orchestration layer that translates visual data into tool calls. It can ingest video and photos using Kinesis, M3U8, and S3.&lt;/p&gt;

&lt;p&gt;Agents can be built using the AWS console. They’re deployed and maintained using AgentCore. Agents access actions through action groups that contain executable functions or &lt;a href="https://getstream.io/blog/what-is-mcp-infrastructure/" rel="noopener noreferrer"&gt;MCP-enabled tools&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The capabilities of these functions range from simple notifications on event triggers to controlling IoT devices and sending API requests. &lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Integration:&lt;/strong&gt; Any compatible AWS service can be layered with Bedrock Agents, resulting in a high degree of extensibility.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability:&lt;/strong&gt; Every step taken by an agent produces a trace. These traces outline the reasoning of the agents, the inputs given, the functions used, and the output received.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal UI Controls:&lt;/strong&gt; Supports direct computer use to imitate human interaction with software that doesn't allow agentic actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem Lock-In:&lt;/strong&gt; Bedrock Agents ties you tightly to AWS, making it difficult to migrate agent workflows to other platforms without a total rebuild.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Pricing:&lt;/strong&gt; Because it is meant largely for enterprise use, the cost to run Amazon Bedrock can be out of reach for smaller organizations and startups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Gemini
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdehs5r95ii9npx0vkcq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdehs5r95ii9npx0vkcq.png" alt="Google Gemini" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gemini.google.com/" rel="noopener noreferrer"&gt;Google Gemini&lt;/a&gt; can be used as a visual agent, as it combines multimodal perception along with &lt;a href="https://getstream.io/blog/reasoning-llms/" rel="noopener noreferrer"&gt;reasoning&lt;/a&gt; to act on what it sees.&lt;/p&gt;

&lt;p&gt;It uses Vision-Language-Action capabilities to translate visual data directly into low-level commands (like motor movements or mouse drags), while also being capable of high-level orchestration. By natively calling functions and tools, the agent can see a video (such as a specific error on a screen or a product defect in a livestream) and execute logic to fix it.&lt;/p&gt;

&lt;p&gt;To use &lt;a href="https://getstream.io/blog/gemini-vision-ai-capabilities/" rel="noopener noreferrer"&gt;Gemini as a visual agent&lt;/a&gt;, use the Observer-Think-Act loop using the Gemini API or Multimodal Live API. &lt;/p&gt;

&lt;p&gt;For static images or recorded video, the media is sent along with a tool definition, which results in a function call. For live feeds, the agent processes frames in real-time to trigger immediate actions while maintaining context through “Thought Signatures” that preserve its train of thought across sessions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal UI Controls:&lt;/strong&gt; Navigates and controls any visual interface without official APIs or HTML scraping.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Spatial Awareness:&lt;/strong&gt; Gemini can output 3D bounding boxes and trajectories, allowing it to work well with AR/XR and robotics.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bidirectional Streaming:&lt;/strong&gt; The Multimodal Live API allows the model to see a video stream and trigger function calls, like trigger_alert() or log_data(), as events unfold in real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resource Intensive:&lt;/strong&gt; High-resolution video and frequent screenshot loops consume tokens rapidly, seeing as it isn't priced specifically for ingesting visual input.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider Overload:&lt;/strong&gt; The popularity of Google Gemini leads to occasional processing overload, which can break autonomous loops mid-task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AskUI Vision Agent
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsha7zemf8m6h7wlrjoas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsha7zemf8m6h7wlrjoas.png" alt="AskUI Vision Agent" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/askui/vision-agent" rel="noopener noreferrer"&gt;AskUI Vision Agent&lt;/a&gt; is a specialized GUI-focused visual agent that works at the operating system level. Unlike more general-purpose models, AskUI is purpose-built to perceive mobile and desktop screens to interact with them exactly as a human would by taking control of input devices. &lt;/p&gt;

&lt;p&gt;AskUI treats the entire device screen as a live coordinate system. It employs a computer-use architecture, where it takes a screenshot, identifies UI elements visually (like buttons, text fields, and icons), and maps those elements to physical actions.&lt;/p&gt;

&lt;p&gt;Developers can integrate this agent by using the AskUI Python SDK or Typescript library. The first step is to create a “Controller” that bridges the AI to your OS. After that, intent-based commands are written (like agent.click(“Login”)), and the agent handles the rest.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal UI Controls:&lt;/strong&gt; Due to its computer-use functionality, AskUI can access software that does not support agentic communication.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Cost of Operation:&lt;/strong&gt; The SDK/CLI of AskUI is completely free, and it can use &lt;a href="https://getstream.io/blog/best-local-llm-tools/" rel="noopener noreferrer"&gt;natively-hosted LLMs&lt;/a&gt; to avoid API fees.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-First Execution:&lt;/strong&gt; Because the controller runs locally on your machine, it can automate highly secure, offline, or air-gapped environments where cloud-based agents might be restricted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual Fragility:&lt;/strong&gt; Since the only input is captured screenshots, UI changes like refreshes and unexpected pop-ups can break coordinate mapping.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Flexibility:&lt;/strong&gt; AskUI is strictly meant for UI operations, so it can’t perform agentic functions with camera feeds or other visual input.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  NVIDIA Metropolis
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld0k3tq3jmqy83995wet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld0k3tq3jmqy83995wet.png" alt="NVIDIA Metropolis" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.nvidia.com/en-us/autonomous-machines/intelligent-video-analytics-platform/" rel="noopener noreferrer"&gt;NVIDIA Metropolis&lt;/a&gt; is an enterprise-grade vision AI application platform designed to build and scale visual agents across edge and cloud environments, including devices like cameras and robots.&lt;/p&gt;

&lt;p&gt;Metropolis is a full-stack engineering ecosystem for physical spaces. It provides the specialized SDKs, microservices, and blueprints needed to turn video feeds into agentic actions in industries like manufacturing and retail, as well as in smart city deployments.&lt;/p&gt;

&lt;p&gt;Metropolis connects high-level vision language models (VLMs) with low-level sensor data. It uses models to analyze video at very high fidelity, with the &lt;a href="https://developer.nvidia.com/blog/optimizing-semiconductor-defect-classification-with-generative-ai-and-vision-foundation-models/" rel="noopener noreferrer"&gt;NVIDIA Cosmos reasoning model&lt;/a&gt; reaching over 96% accuracy in a wafer map defect classification test.&lt;/p&gt;

&lt;p&gt;Unlike standard LLMs and vision models that work one frame at a time, Metropolis uses tools like Multi-Camera Tracking to follow an object across 3D space, maintaining the state of the agent’s task as the subject moves.&lt;/p&gt;

&lt;p&gt;Metropolis uses a “Microservice Pipeline” with the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion (Video Storage Toolkit):&lt;/strong&gt; Manages live RTSP streams from multiple cameras.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference (DeepStream/NIM):&lt;/strong&gt; Runs the visual models on NVIDIA GPUs to extract real-time insights.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Logic (NVIDIA AI Blueprints):&lt;/strong&gt; Provides reference code for Video Search and Summarization. This allows agents to answer natural language queries and perform multi-step planning.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://getstream.io/blog/edge-computing/" rel="noopener noreferrer"&gt;&lt;strong&gt;Edge Computing&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt; Agents deploy onto NVIDIA Jetson hardware, allowing the AI to act locally even if the internet goes down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge-to-Cloud Flexibility:&lt;/strong&gt; Can run entirely on-site (on Jetson Orin) for execution with zero network latency or scale to the cloud for massive video archives.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Digital Twin Training:&lt;/strong&gt; Uses NVIDIA Omniverse to train visual agents in a virtual world before deploying them to the real world.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Throughput:&lt;/strong&gt; Optimized specifically for &lt;a href="https://blogs.nvidia.com/blog/metropolis-ai-blueprint-video/" rel="noopener noreferrer"&gt;NVIDIA hardware&lt;/a&gt;, which claims to be able to process video 30 times faster than real-time analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specialization:&lt;/strong&gt; An efficient implementation requires specialization in NVIDIA’s accelerated interface stack and hardware-aware AI deployment.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware Lock-In:&lt;/strong&gt; Requires specialized NVIDIA GPUs to run the software stack, like A100s, H100s, and Jetsons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon Bedrock Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS-managed custom agents that translate visual data into tool and API actions using action groups and foundation models.&lt;/td&gt;
&lt;td&gt;Enterprise workflows that combine with AWS services and automation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multimodal AI that reasons over images and video to directly execute actions.&lt;/td&gt;
&lt;td&gt;General-purpose visual reasoning, UI control, and live visual monitoring.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AskUI Vision Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OS-level visual agent that automates software by interacting with screens like a human.&lt;/td&gt;
&lt;td&gt;Desktop/mobile UI automation where APIs are unavailable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA Metropolis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full-stack vision AI agent platform for analyzing live camera feeds and physical environments.&lt;/td&gt;
&lt;td&gt;Smart cities, factories, retail analytics, and large-scale camera networks.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Infrastructure Powering Visual Agents
&lt;/h2&gt;

&lt;p&gt;While out-of-the-box agents are powerful, many specialized use cases require custom-built solutions. This involves assembling a stack of supporting technologies to bridge the gap between vision and execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vision-Language-Action Foundation Models
&lt;/h3&gt;

&lt;p&gt;The reasoning engine for modern visual agents is ‌vision-language-action models. These models are specifically trained to give outputs as actions instead of text or speech responses.&lt;/p&gt;

&lt;p&gt;Models like InternVL3 and NVIDIA’s Cosmos-based GR00T are trained to ground their reasoning in spatial coordinates, allowing them to point to options directly from visual feeds. These models enable agents to understand complex instructions like “turn off the machine when the light turns red” and translate them into actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Agent Orchestration Tools
&lt;/h3&gt;

&lt;p&gt;Complex visual tasks often require agent teams, consisting of specialized agents rather than a single monolithic model. &lt;a href="https://getstream.io/blog/best-ai-orchestration-tools/" rel="noopener noreferrer"&gt;Orchestration frameworks,&lt;/a&gt; like LangGraph, CrewAI, and Microsoft AutoGen, manage these collaborations, where one agent might focus on high-speed object detection (perception) while another handles long-term planning (reasoning). &lt;/p&gt;

&lt;p&gt;These tools ensure that state is maintained across tasks, allowing agents to remember a visual context even as the camera view changes or the task evolves over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Time Streaming Infrastructure
&lt;/h3&gt;

&lt;p&gt;To function in the real world, visual agents require a live paradigm that employs bidirectional streaming. Frameworks like &lt;a href="https://visionagents.ai/" rel="noopener noreferrer"&gt;Vision Agents&lt;/a&gt; make this practical by leveraging low-latency edge transport layers (such as Stream’s global edge network) and real-time video/audio pipelines to enable continuous ingestion of visual data. &lt;/p&gt;

&lt;p&gt;Similarly, StreamingVLM architectures enable agents to process unbounded video feeds by using specialized memory caches. This infrastructure makes agents situationally aware, treating live video as a continuous, unified context rather than a series of disconnected snapshots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Robotics &amp;amp; Edge Control Platforms
&lt;/h3&gt;

&lt;p&gt;Visual agents might be embedded into individual devices for certain tasks, but they can also run on control platforms for complex deployments that involve several robots or edge devices. For example, a centralized agent can use a warehouse’s cameras to optimize pallet placements before sending pathing commands to delivery robots via the platform.&lt;/p&gt;

&lt;p&gt;Compatibility and capabilities will vary by platform, but three popular open-source choices are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS IoT Greengrass&lt;/strong&gt;: An AWS service for edge devices that can use Bedrock Agents for scenarios like agricultural fleet control.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA Isaac&lt;/strong&gt;: A robotics development platform that tightly integrates with Metropolis for digital twin training with Isaac Sim.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viam&lt;/strong&gt;: A robotics and edge control platform that is a little more complicated for agent setup but is hardware-agnostic, costs nothing to start, and has premade modules for integrating with Gemini, ChatGPT Vision, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Evaluate the Best Visual AI Agent
&lt;/h2&gt;

&lt;p&gt;Choosing the right agent requires an understanding of its performance metrics, operational costs, and safety protocols. &lt;/p&gt;

&lt;p&gt;Let’s look at some of the most important metrics to evaluate a visual AI agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Flexibility
&lt;/h3&gt;

&lt;p&gt;Visual AI agents are often powered by multiple models across different tasks. General-purpose models are good at open-ended reasoning and scene understanding, while specialized models often outperform them in latency-sensitive or narrowly defined tasks.&lt;/p&gt;

&lt;p&gt;Model flexibility refers to an agent’s ability to route different stages of perception and reasoning to the most appropriate model, rather than forcing all workloads through one monolithic architecture. This is especially important in streaming environments, as it allows agents to choose between latency, reasoning depth, cost, and time constraints dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Latency vs Intelligence
&lt;/h3&gt;

&lt;p&gt;Visual agents often need to make split-second decisions, but this comes at the cost of a lower reasoning depth. &lt;a href="https://getstream.io/blog/realtime-ai-agents-latency/" rel="noopener noreferrer"&gt;Low-latency agents&lt;/a&gt; are essential for physical tasks like robotics or security monitoring, where sub-second responses are required. The quicker models have fewer parameters (1B-11B), and they usually run on the system's edge.&lt;/p&gt;

&lt;p&gt;High-intelligence agents take their time while making decisions, which comes in handy for tasks like complex GUI navigation or medical image analysis. These typically rely on larger, cloud-hosted models that can take several seconds to think through a visual scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Tradeoffs
&lt;/h3&gt;

&lt;p&gt;To evaluate the total cost of ownership, it's a good idea to compare the per-action &lt;a href="https://getstream.io/blog/artificial-intelligence-api/" rel="noopener noreferrer"&gt;LLM API&lt;/a&gt; costs of cloud providers against the infrastructure overhead of self-hosted models. Many organizations use a tiered cost model, which uses a smaller, cheaper model for routine monitoring tasks, and escalation to an expensive model occurs only when a visual anomaly is detected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Human-in-the-Loop Workflows
&lt;/h3&gt;

&lt;p&gt;For high-stakes decisions, such as authorizing a financial transaction or approving a medical diagnosis, a visual AI agent should support human-in-the-loop checkpoints. Some agents use confidence gating, which asks for human guidance if the model’s confidence score falls below a certain threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Which AI Has the Best Agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s impossible to definitively say which AI has the best agents overall for two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance Varies by Task&lt;/strong&gt;: A given agent may excel in some areas but be outperformed in others. AskUI Vision Agents is one of the best for workflow automations, but it’d be a poor choice for a shopping agent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequent Updates and Upgrades&lt;/strong&gt;:  AI companies are constantly improving their products, so the agent that scores the highest on a benchmark in March may lose to an updated competitor model in June.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. What Exactly Is Visual AI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visual AI is the use of computer vision in AI systems, which allows models to understand information present in images and videos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Is Siri an AI Agent?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apple’s Siri can be described as an AI agent as it can perform tasks and make decisions based on commands. However, Siri doesn't make proactive automated decisions without instruction from the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What Are Level 3 AI Agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Level 3 AI agents use LLM reasoning and &lt;a href="https://getstream.io/glossary/ai-agent-orchestration/" rel="noopener noreferrer"&gt;orchestration frameworks&lt;/a&gt; to make decisions and perform multi-step tasks without human intervention. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. What Is the Difference Between LLMs and AI Agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLMs are AI systems that can understand and respond in natural language. AI agents use LLMs along with tools, reasoning, and knowledge-base lookups to perform actions based on events or natural language requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Visual AI Agent Should Your Organization Use?
&lt;/h2&gt;

&lt;p&gt;While deciding, it’s important to remember that the right visual AI agent depends on your organization’s technical requirements rather than on general popularity. A team &lt;a href="https://visionagents.ai/cookbook/golf-coach" rel="noopener noreferrer"&gt;building a real-time golf coach&lt;/a&gt; will have different priorities than one working on a manufacturing quality control system.&lt;/p&gt;

&lt;p&gt;Here are our recommended use cases for the visual AI agents mentioned in this guide. You should use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Bedrock Agents&lt;/strong&gt; for highly customizable enterprise workflows that have deep integration with existing AWS services and automated tool-calling.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; if you need a versatile, general-purpose multimodal agent capable of sophisticated reasoning over live video and direct UI control.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AskUI Vision Agent&lt;/strong&gt; for cross-platform desktop or mobile workflow automation, especially when you need to interact with software that lacks accessible APIs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA Metropolis&lt;/strong&gt; for tasks involving large-scale camera networks where performance and reliability are essential.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>visualaiagents</category>
      <category>aiagents</category>
      <category>visualai</category>
      <category>visionai</category>
    </item>
    <item>
      <title>The 8 Best Platforms To Build Voice AI Agents</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Tue, 03 Mar 2026 21:12:38 +0000</pubDate>
      <link>https://dev.to/getstreamhq/the-8-best-platforms-to-build-voice-ai-agents-4oel</link>
      <guid>https://dev.to/getstreamhq/the-8-best-platforms-to-build-voice-ai-agents-4oel</guid>
      <description>&lt;p&gt;Voice assistants like Siri and Alexa are great for non-trivial everyday personal assistive tasks. However, they are limited in providing accurate answers to complex questions, real-time information, handling turns, and user interruptions. &lt;/p&gt;

&lt;p&gt;Try asking Siri about the best things to do with kids in a particular city or location. It won't provide an accurate answer because it can’t access web search tools. On devices supporting Apple Intelligence, asking the same question will be handed off to ChatGPT. &lt;/p&gt;

&lt;p&gt;As in-app conversational app features, &lt;a href="https://getstream.io/video/voice-agents/" rel="noopener noreferrer"&gt;voice agents&lt;/a&gt; are here to solve these limitations. &lt;/p&gt;

&lt;p&gt;The sections below will help you discover how to build AI voice agents and the best creation platforms. Although it is not required for this article, you can set up a local &lt;a href="https://github.com/GetStream/openai-tutorial-node" rel="noopener noreferrer"&gt;Node.js server&lt;/a&gt; and run our &lt;a href="https://github.com/GetStream/openai-tutorial-ios/" rel="noopener noreferrer"&gt;demo&lt;/a&gt; iOS/iPadOS voice agent in SwiftUI. After setting up your local Node server, you can also test the conversational agent for other platforms by following these step-by-step tutorials: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/sdk/react/tutorial/ai-voice-assistant/" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/sdk/android/tutorial/ai-voice-assistant/" rel="noopener noreferrer"&gt;Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/sdk/flutter/tutorial/ai-voice-assistant/" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://getstream.io/video/sdk/ios/tutorial/ai-voice-assistant/" rel="noopener noreferrer"&gt;iOS&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is an AI Voice Agent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9d2taazkhdwhvwisqo4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9d2taazkhdwhvwisqo4t.png" alt="AI voice agent" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A voice agent is a &lt;a href="https://getstream.io/glossary/conversational-ai/" rel="noopener noreferrer"&gt;conversational AI&lt;/a&gt; assistant capable of taking user instructions and responding with a human-like voice in real-time using a &lt;a href="https://getstream.io/blog/best-local-llm-tools/" rel="noopener noreferrer"&gt;local&lt;/a&gt; or cloud-based LLM. &lt;/p&gt;

&lt;p&gt;Like text-generation agents, voice-based ones use LLMs to output audio responses. The best way to think of it is to consider ChatGPT's voice mode, as illustrated in the above image. With the tap of a button and selecting your preferred voice, you can easily speak to ChatGPT for real-time responses. &lt;/p&gt;

&lt;p&gt;In the following sections, we’ll look at the top platforms for building a ChatGPT-like voice mode experience. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Build a Voice Agent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1gscq89jewly56gcldn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1gscq89jewly56gcldn.png" alt="Voice agent interaction" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like text-based AI agents, the support for &lt;a href="https://getstream.io/blog/mcp-llms-agents/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; in voice applications helps agents retrieve accurate, real-time information from services such as &lt;a href="https://www.perplexity.ai/" rel="noopener noreferrer"&gt;Perplexity&lt;/a&gt; and &lt;a href="https://exa.ai/" rel="noopener noreferrer"&gt;Exa&lt;/a&gt;. With MCP, you can build an agent to manage tasks through Slack and Linear using voice interactions. You can also connect voice agents to MCP tools for custom workflows. &lt;/p&gt;

&lt;p&gt;When creating your voice AI app, support for diverse accents may be needed. Luckily, major platforms, like the OpenAI Agents SDK, provide a &lt;a href="https://www.openai.fm/" rel="noopener noreferrer"&gt;library&lt;/a&gt; of voices to choose from. Voice-based agents can be used across many domains, including sales, marketing, customer support, small businesses, and enterprises.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video AI&lt;/strong&gt;: An excellent use case of voice agents in a video AI setting is &lt;a href="https://gemini.google/overview/gemini-live/?hl=en" rel="noopener noreferrer"&gt;Gemini Live&lt;/a&gt;. It uses your phone's camera to see and understand objects around you and provide answers through speech interactions. Gemini Live also allows users to screen share their phone device's screen to ask questions about the content on the selected screen. &lt;/li&gt;
&lt;/ul&gt;


    
  Gemini voice mode


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sales leads&lt;/strong&gt;: Use a voice agent to follow up and contact potential customers for inbound sales in enterprises and small businesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer support and call center&lt;/strong&gt;: Voice agents can receive customer complaints and help fix issues. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal assistant&lt;/strong&gt;: Like Gemini Live, you can create a voice system to help you understand your surroundings and what you’re looking at. Another trending application area is computer and &lt;a href="https://browser-use.com/" rel="noopener noreferrer"&gt;browser use&lt;/a&gt;. You can integrate a voice system with an AI browser agent to automate &lt;a href="https://getstream.io/blog/telemedicine-chat-and-scheduling/" rel="noopener noreferrer"&gt;online booking&lt;/a&gt; and appointment scheduling.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social platform&lt;/strong&gt;: Build voice agents to interact with people in &lt;a href="https://getstream.io/chat/solutions/social/" rel="noopener noreferrer"&gt;social communities&lt;/a&gt; by giving real-time voice responses to users' queries. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gaming&lt;/strong&gt;: Build character dialog and interactive narration systems with voice agents for &lt;a href="https://getstream.io/chat/solutions/gaming/" rel="noopener noreferrer"&gt;online gaming&lt;/a&gt; platforms. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telecare&lt;/strong&gt;: Use an AI voice to interact with patients and collect their information online in &lt;a href="https://getstream.io/chat/solutions/healthcare/" rel="noopener noreferrer"&gt;telehealth&lt;/a&gt; scenarios. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Top 8 Platforms To Build Voice-Enabled Apps
&lt;/h2&gt;

&lt;p&gt;Building a voice AI app can be daunting. Several aspects include backend infrastructure, audio quality, latency, and more. For these reasons, you can rely on frameworks, SDKs, and APIs to create AI solutions with voice as one of the main in-app features. &lt;/p&gt;

&lt;p&gt;Most of these voice agent-building platforms offer a Python-first approach. TypeScript-based options are now catching up. &lt;/p&gt;

&lt;p&gt;Let's look at the leading solutions and how to build quickly with them. &lt;/p&gt;

&lt;h3&gt;
  
  
  1. Stream Python AI SDK: Integrate In-App Voice AI
&lt;/h3&gt;

&lt;p&gt;Stream allows developers to build real-time &lt;a href="https://getstream.io/video/voice-agents/" rel="noopener noreferrer"&gt;audio apps&lt;/a&gt; in React, Swift, Android, Flutter, JavaScript, and Python. With minimal effort, the recently released &lt;a href="https://getstream.io/video/docs/python-ai/" rel="noopener noreferrer"&gt;Python AI SDK&lt;/a&gt; helps developers create complex voice AI services, such as meeting assistants and bots for &lt;a href="https://getstream.io/blog/video-conferencing-nextjs/" rel="noopener noreferrer"&gt;video conferencing&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You can use the Python SDK for transcribing, voice activity detection (VAD), converting speech to text, and vice versa. Aside from these features, you can integrate and extend your Stream-powered voice AI app with other leading platforms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/docs/python-ai/integrations/openai/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/docs/python-ai/integrations/cartesia/" rel="noopener noreferrer"&gt;Cartesia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/docs/python-ai/integrations/deepgram/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstream.io/video/docs/python-ai/integrations/elevenlabs/" rel="noopener noreferrer"&gt;EleveLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://getstream.io/video/docs/python-ai/integrations/kokoro/" rel="noopener noreferrer"&gt;Kokoro&lt;/a&gt; and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SDK's foundation is built with &lt;a href="https://getstream.io/resources/projects/webrtc/basics/welcome/" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; and the &lt;a href="https://platform.openai.com/docs/guides/realtime" rel="noopener noreferrer"&gt;OpenAI Real-Time API&lt;/a&gt; to endure low-latency communication. &lt;/p&gt;

&lt;h4&gt;
  
  
  Get Started with Stream Python AI SDK
&lt;/h4&gt;

&lt;p&gt;Creating your first voice app with the Stream's Python AI SDK requires a few steps: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set up a Python environment and install the necessary dependencies&lt;/strong&gt;. You can configure your Python virtual environment with this command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;python3 -m venv venv &amp;amp;&amp;amp; source venv/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You may also set it up using &lt;code&gt;uv&lt;/code&gt; and add a &lt;code&gt;.env&lt;/code&gt; file to your project’s root directory and fill it up with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;STREAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-stream-api-key
&lt;span class="nv"&gt;STREAM_API_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-stream-api-secret
&lt;span class="nv"&gt;STREAM_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://pronto.getstream.io/
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-your-openai-api-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign up for a Stream &lt;a href="https://dashboard.getstream.io/" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt; account, create an app, and grab its API key and secret to substitute the above placeholders. With the &lt;code&gt;STREAM_BASE_URL&lt;/code&gt;, you can create and join a Stream &lt;a href="https://pronto.getstream.io/" rel="noopener noreferrer"&gt;video call&lt;/a&gt; in your browser. &lt;/p&gt;

&lt;p&gt;Next, run the following commands to install the Python AI SDK.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install --pre "getstream[plugins]"

# or using uv
uv add "getstream[plugins]" --prerelease=allow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize a Stream client and user, and create a call&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;getstream&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Stream&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;getstream.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UserRequest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid4&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webbrowser&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;

&lt;span class="c1"&gt;# Load environment variables
&lt;/span&gt;&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize Stream client from ENV
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_env&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Generates a new user ID and creates a new user
&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My User&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# We can use this later to join the call
&lt;/span&gt;&lt;span class="n"&gt;user_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Generate a user ID for the OpenAI bot that is added later
&lt;/span&gt;&lt;span class="n"&gt;bot_user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-realtime-speech-to-speech-bot-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bot_user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OpenAI Realtime Speech to Speech Bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Create a call with a new generated ID
&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_or_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_by_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bot_user_id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create an OpenAI speech-to-speech pipeline&lt;/strong&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The following code snippet allows you to create a speech-to-speech pipeline by initializing the &lt;code&gt;OpenAIRealtime&lt;/code&gt; class of the SDK and launching the call with a web browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sts_bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAIRealtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-realtime-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a friendly assistant; reply in a concise manner.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;voice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alloy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Connect OpenAI bot
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sts_bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bot_user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="c1"&gt;# Sends a message to OpenAI from the user side
&lt;/span&gt;        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sts_bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_user_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Give a very short greeting to the user.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Handle exception
&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Delete users when done
&lt;/span&gt;    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete_users&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bot_user_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;EXAMPLE_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/join/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# The token is the user token we generated from the client before.
&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skip_lobby&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;call_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;webbrowser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to open browser: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Please manually open this URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you put the code snippets together in the above steps and test out the combined code, you should see an output similar to this: &lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    &lt;br&gt;
  Stream voice agent&lt;br&gt;
&lt;/p&gt;
&lt;h3&gt;
  
  
  2. OpenAI: Create Voice Apps
&lt;/h3&gt;

&lt;p&gt;OpenAI allows developers to integrate voice services with their apps in two ways. With its &lt;a href="https://openai.github.io/openai-agents-python/ref/voice/pipeline/" rel="noopener noreferrer"&gt;Python Agents SDK&lt;/a&gt; and &lt;a href="https://openai.github.io/openai-agents-js/guides/voice-agents/quickstart/" rel="noopener noreferrer"&gt;TypeScript SDK&lt;/a&gt;, you can easily add voice agents to any AI application. &lt;/p&gt;

&lt;p&gt;The SDK supports male and female &lt;a href="https://www.openai.fm/" rel="noopener noreferrer"&gt;TTSVoices&lt;/a&gt; such as Alloy, Ash, Coral, Echo, Fable, Onyx, Nova, Sage, and Shimmer. With its voice agent pipeline, you can transcribe an audio input into text, run a workflow for sequential text responses, and transform the text-based output into streaming audio. &lt;/p&gt;

&lt;p&gt;Another way to build audio/speech experiences with OpenAI is to use its &lt;a href="https://platform.openai.com/docs/guides/realtime" rel="noopener noreferrer"&gt;Realtime API&lt;/a&gt;. Using its &lt;a href="https://platform.openai.com/docs/guides/realtime#connect-with-webrtc" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; or &lt;a href="https://platform.openai.com/docs/guides/realtime#connect-with-websockets" rel="noopener noreferrer"&gt;WebSockets&lt;/a&gt; backend, developers can build multi-modal experiences supporting realtime text and speech generation, transcription, function calling, and more. &lt;/p&gt;

&lt;p&gt;Some of the unique features of building voice agents with OpenAI include the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Give your voice applications access to external &lt;a href="https://openai.github.io/openai-agents-js/guides/voice-agents/build/#tools" rel="noopener noreferrer"&gt;services&lt;/a&gt; to execute actions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent monitoring&lt;/strong&gt;: Provide &lt;a href="https://openai.github.io/openai-agents-js/guides/voice-agents/build/#guardrails" rel="noopener noreferrer"&gt;guardrails&lt;/a&gt; and rules for voice agents to follow. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent handoff&lt;/strong&gt;: Create multiple agents who can assign tasks to others. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio handling&lt;/strong&gt;: It uses WebRTC to handle audio input/output by default. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://getstream.io/blog/session-management/" rel="noopener noreferrer"&gt;Session management&lt;/a&gt;&lt;/strong&gt;: It allows configuring and customizing real-time sessions. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Get Started with OpenAI JS SDK
&lt;/h4&gt;

&lt;p&gt;With the sample code below, you can start building voice apps with the OpenAI JS SDK. Check out &lt;a href="https://openai.github.io/openai-agents-js/guides/voice-agents/quickstart/" rel="noopener noreferrer"&gt;voice agents quickstart&lt;/a&gt; to learn more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RealtimeAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RealtimeSession&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@openai/agents/realtime&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RealtimeAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RealtimeSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Automatically connects your microphone and audio output&lt;/span&gt;
&lt;span class="c1"&gt;// in the browser via WebRTC.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;client-api-key&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. ElevenLabs: Build Conversational Voice Agents
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is one of the leading platforms for building conversational AI applications. It provides developers and enterprises with all the building blocks for integrating low-latency voice agents with any service. &lt;/p&gt;

&lt;p&gt;The example below demonstrates a realistic &lt;a href="https://getstream.io/blog/text-to-speech/" rel="noopener noreferrer"&gt;text-to-speech&lt;/a&gt; interaction. &lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    &lt;br&gt;
  ElevenLabs interactive voice demo&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;With this platform, you can access categories of AI models for voice cloning, isolation, swapping, voice design, and making sound effects. Combinations of these models can be used to create and deploy interactive audio services. &lt;/p&gt;

&lt;p&gt;For example, its latest model (&lt;a href="https://elevenlabs.io/v3" rel="noopener noreferrer"&gt;Eleven V3&lt;/a&gt;) at the time of writing this article is an excellent choice for implementing realistic and expressive in-app text-to-speech. With its support for different categories of speech models, you have several options for video, audio, gaming, telehealth, and &lt;a href="https://getstream.io/chat/solutions/marketplaces/" rel="noopener noreferrer"&gt;marketplace&lt;/a&gt; applications. &lt;/p&gt;
&lt;h4&gt;
  
  
  Get Started with ElevenLabs
&lt;/h4&gt;

&lt;p&gt;ElevenLabs provides easy-to-use SDKs for Python and TypeScript developers. The sample code below is all you need to make your first API call to the Python voice AI SDK to create your text-to-speech app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;elevenlabs.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ElevenLabs&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;elevenlabs&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;elevenlabs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ElevenLabs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elevenlabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_to_speech&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The first move is what sets everything in motion.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JBFqnCBsd6RMkjVDRZzb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eleven_multilingual_v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mp3_44100_128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the &lt;a href="https://elevenlabs.io/docs/quickstart" rel="noopener noreferrer"&gt;developer quickstart&lt;/a&gt; to learn more about the TypeScript version of the SDK.  &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deepgram: Build Voice AI Solutions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71sce6nsd0bqgb8ey70a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71sce6nsd0bqgb8ey70a.png" alt="Deepgram voice agent UI" width="677" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt; is a voice AI application creation platform. Developers can use its API to build audio apps with text-to-speech, speech-to-speech, and speech-to-text models. To experience and see how Deepgram works, visit the URL above and try the interactive, real-time voice demo on the home page.  &lt;/p&gt;

&lt;p&gt;With Deepgram, you can try different models and APIs to build intelligent audio apps for use cases in customer service, telemedicine, sales, service ordering, etc. The quickest way to start building your app with Deepgram is to try its &lt;a href="https://playground.deepgram.com/" rel="noopener noreferrer"&gt;API playground&lt;/a&gt;.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Get Started with Deepgram
&lt;/h4&gt;

&lt;p&gt;One advantage of using Deepgram is that its APIs are available for Python, JavaScript, C#, and Go. To build your first voice agent with any of the Deepgram SDKs, configure your environment and install the platform-specific SDK. The example commands below are for Python. &lt;/p&gt;

&lt;p&gt;To begin with your preferred platform for implementing a voice agent, head to the &lt;a href="https://developers.deepgram.com/docs/voice-agent" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; guides.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;deepgram-agent-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;deepgram-agent-demo
&lt;span class="nb"&gt;touch &lt;/span&gt;index.py
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DEEPGRAM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_Deepgram_API_key_here"&lt;/span&gt;
@TODO other Python commands

&lt;span class="c"&gt;# Install the SDK&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;deepgram-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;
    &lt;br&gt;
  Deepgram interactive voice demo&lt;br&gt;
&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Vapi: Voice AI Agents For Developers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfv0gzkb3c1odw49dl1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfv0gzkb3c1odw49dl1b.png" alt="Vapi voice agent UI" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://vapi.ai/" rel="noopener noreferrer"&gt;Vapi&lt;/a&gt; platform helps developers build and deploy voice agents and AI products in Python, React, and TypeScript. It provides two ways to make intelligent voice apps. It's assistant's option allows you to create simple conversational services that may require a single system prompt for the underlying model's operations. &lt;/p&gt;

&lt;p&gt;Example use cases of Vapi Assistants include simple question and answer systems and chatbots. If an agentic system has a complex logic or involves a multi-step process, you can use the workflow feature of Vapi to build your agents. Applications in this category are suitable for appointment scheduling and service ordering. &lt;/p&gt;

&lt;p&gt;Vapi is an excellent choice for developers and enterprises developing voice AI products for call operations involving actual phone numbers. You can integrate it with several applications and model providers, such as Salesforce, Notion, Google Calendar, Slack, OpenAI, Anthropic, Gemini, and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual support&lt;/strong&gt;: The API supports multilingual operations. This means your app's users can speak to agents in English, Spanish, and 100+ other supported languages.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External tools&lt;/strong&gt;: Easily add external tools to allow your voice agent to perform accurate actions. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated testing&lt;/strong&gt;:  Use simulated AI voices to create test suites for production-ready agents. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin any model&lt;/strong&gt;: You can bring your favorite text-to-speech, speech-to-text, and speech-to-speech models from any major AI service provider. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Get Started with Vapi
&lt;/h4&gt;

&lt;p&gt;Making your first voice AI app with Vapi or integrating it with an existing app is simple. The React sample code below can get you started.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vapi&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@vapi-ai/web&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vapi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vapi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_PUBLIC_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Get your public api key from the dashboard&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;VapiAssistant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;callStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCallStatus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inactive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setCallStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;vapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_ASSISTANT_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Get your assistant id from the dashboard&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setCallStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;vapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;vapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;call-start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCallStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;vapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;call-end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCallStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;vapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAllListeners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;callStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inactive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt; : null&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;callStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/i&amp;gt; : null&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;callStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Stop&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt; : null&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="https://vapi.ai/" rel="noopener noreferrer"&gt;vapi.ai&lt;/a&gt; to try making voice agents for other platforms. &lt;/p&gt;

&lt;h3&gt;
  
  
  6. Play.ai: Build Real-Time Intelligent Voice Apps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr10m65mqqa3pds17wz6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr10m65mqqa3pds17wz6a.png" alt="PlayAI voice AI UI" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.ai/" rel="noopener noreferrer"&gt;PlayAI&lt;/a&gt; is a platform for making intelligent voice apps for the web and mobile. The platform allows engineers to create voice agents for healthcare, real estate, gaming, food delivery, &lt;a href="https://getstream.io/chat/solutions/ed-tech/" rel="noopener noreferrer"&gt;EdTech&lt;/a&gt;, and more. &lt;/p&gt;

&lt;p&gt;To see how the service works, check out the interactive voice chat demo from the above URL or try the &lt;a href="https://play.ai/playnote/my-notes" rel="noopener noreferrer"&gt;PlayNote&lt;/a&gt; web app, which allows you to turn JPEG, PDF, EPUB, CSV, and several other files into a human-like-sounding audio format. Like other platforms, PlayAI has a &lt;a href="https://play.ai/voices/voice-library" rel="noopener noreferrer"&gt;library&lt;/a&gt; of AI voices for experimenting with your apps. &lt;/p&gt;

&lt;p&gt;The PlayAI's &lt;a href="https://play.ai/api/sandbox" rel="noopener noreferrer"&gt;playground/sandbox&lt;/a&gt; provides a starting point for experimenting, testing speech generation, and building audio experiences. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18c8lggbs4qcbbxg8565.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18c8lggbs4qcbbxg8565.png" alt="PlayAI playground" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Get Started with PlayAI
&lt;/h4&gt;

&lt;p&gt;You can use the PlayAI text-to-speech &lt;a href="https://docs.play.ai/documentation/text-to-speech/tts-quickstart" rel="noopener noreferrer"&gt;API&lt;/a&gt; in Bash, Python, JavaScript, Go, Dart, and Swift. First, set your API credentials on your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# macOS (zsh)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PLAYAI_KEY="your_api_key_here"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PLAYAI_USER_ID="your_user_id_here"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc

&lt;span class="c"&gt;# Windows&lt;/span&gt;
setx PLAYAI_KEY &lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;
setx PLAYAI_USER_ID &lt;span class="s2"&gt;"your_user_id_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, make your first API call to create an audio from a text prompt using this Curl script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s1"&gt;'https://api.play.ai/api/v1/tts/stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PLAYAI_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-USER-ID: &lt;/span&gt;&lt;span class="nv"&gt;$PLAYAI_USER_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "PlayDialog",
    "text": "Hello! This is my first text-to-speech audio using PlayAI!",
    "voice": "s3://voice-cloning-zero-shot/baf1ef41-36b6-428c-9bdf-50ba54682bd8/original/manifest.json",
    "outputFormat": "wav"
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the above in your Terminal should output an audio file called &lt;strong&gt;hello.wav&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Pipecat: Build Voice AI Apps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmkv78n0p7df64yiluuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmkv78n0p7df64yiluuh.png" alt="Pipecat illustration" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/pipecat-alternatives/" rel="noopener noreferrer"&gt;Pipecat&lt;/a&gt; is one of the most widely used &lt;a href="https://github.com/pipecat-ai/pipecat" rel="noopener noreferrer"&gt;open-source&lt;/a&gt; frameworks for building conversational AI applications. The framework allows developers to create complex dialog systems, enterprise-grade customer support agents, multimodal interactions (video, voice, and images), and video meeting assistants. &lt;/p&gt;

&lt;p&gt;Check out this &lt;a href="https://x.com/sathvikdivili/status/1939404933192970473" rel="noopener noreferrer"&gt;X post&lt;/a&gt; to see a practical demo of Pipecat in action. &lt;/p&gt;

&lt;p&gt;The client SDKs for Web, iOS, Android, and C++ allow you to build low-latency conversational apps with several AI services, tools, and underlying backend technologies such as WebRTC and WebSockets. &lt;/p&gt;

&lt;h4&gt;
  
  
  Get Started with Pipecat
&lt;/h4&gt;

&lt;p&gt;You can start running Pipecat on a local machine by configuring your environment, installing the module, and switching to the cloud once your voice application is ready for production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the module&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;pipecat-ai

&lt;span class="c"&gt;# Set up your environment&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;dot-env.template .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the Pipecat’s &lt;a href="https://github.com/pipecat-ai/pipecat" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; for more code samples and detailed instructions on building conversational agents with the framework. &lt;/p&gt;

&lt;h3&gt;
  
  
  8. Cartesia: Create Realistic AI Voices
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy830pj0id47c8vojj34k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy830pj0id47c8vojj34k.png" alt="Cartesia voice UI" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cartesia.ai/" rel="noopener noreferrer"&gt;Cartesia&lt;/a&gt; is a developer-first platform for voice AI. The Cartesia API makes incorporating high-quality voices into any product easier. It also provides seamless support for extending voice agents with other platforms like LiveKit, Vapi, and Pipecat. You can build your speech applications in 15+ languages and deploy them anywhere and on any device. &lt;/p&gt;

&lt;p&gt;To learn more about how Cartesia works, you can check out its &lt;a href="https://cartesia.ai/sonic" rel="noopener noreferrer"&gt;Sonic&lt;/a&gt; text-to-speech and &lt;a href="https://cartesia.ai/ink" rel="noopener noreferrer"&gt;Ink-Whisper&lt;/a&gt; speech-to-text models.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Get Started with Cartesia
&lt;/h4&gt;

&lt;p&gt;Depending on your machine, there are a few installation requirements for using the &lt;a href="https://docs.cartesia.ai/2024-11-13/get-started/make-an-api-request" rel="noopener noreferrer"&gt;Cartesia API&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;ffmpeg

&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ffmpeg

&lt;span class="c"&gt;# Fedora&lt;/span&gt;
dnf &lt;span class="nb"&gt;install &lt;/span&gt;ffmpeg

&lt;span class="c"&gt;# Arch Linux&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you install any of the above for your computer, you can now make an API call to generate your first speech from text using cURL, Python, or JavaScript/TypeScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.cartesia.ai/tts/bytes"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Cartesia-Version: 2024-11-13"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"transcript": "Welcome to Cartesia Sonic!", "model_id": "sonic-2", "voice": {"mode":"id", "id": "694f9389-aac1-45b6-b726-9d9369183238"}, "output_format":{"container":"wav", "encoding":"pcm_f32le", "sample_rate":44100}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sonic-2.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To go further, you can try Cartesia's &lt;a href="https://docs.cartesia.ai/2024-11-13/use-an-sdk/python" rel="noopener noreferrer"&gt;Python&lt;/a&gt; and &lt;a href="https://docs.cartesia.ai/2024-11-13/use-an-sdk/javascript-typescript" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; SDKs. &lt;/p&gt;

&lt;h2&gt;
  
  
  Other Notable Voice AI Platforms
&lt;/h2&gt;

&lt;p&gt;There are other excellent services like &lt;a href="https://getstream.io/blog/livekit-alternatives/" rel="noopener noreferrer"&gt;LiveKit&lt;/a&gt;, &lt;a href="https://huggingface.co/spaces/hexgrad/Kokoro-TTS" rel="noopener noreferrer"&gt;Kokoro TTS&lt;/a&gt;, and &lt;a href="https://github.com/moonshine-ai/moonshine" rel="noopener noreferrer"&gt;Moonshine&lt;/a&gt; for creating voice applications. You can also use platforms like &lt;a href="https://unmute.sh/" rel="noopener noreferrer"&gt;Unmute.sh&lt;/a&gt; and &lt;a href="https://www.openai.fm/" rel="noopener noreferrer"&gt;OpenAI.fm&lt;/a&gt; to experiment and test with a library of natural and realistic AI voices.&lt;/p&gt;

&lt;p&gt;To make voice apps for specific use cases, such as phone call operations, you can use services like &lt;a href="https://www.bland.ai/" rel="noopener noreferrer"&gt;Bland AI&lt;/a&gt;, &lt;a href="https://www.retellai.com/" rel="noopener noreferrer"&gt;Retell AI&lt;/a&gt;, and &lt;a href="https://synthflow.ai/" rel="noopener noreferrer"&gt;Synthflow AI&lt;/a&gt;. If you want to try open-source TTS models, check out &lt;a href="https://github.com/resemble-ai/chatterbox/" rel="noopener noreferrer"&gt;Chatterbox TTS&lt;/a&gt; and the &lt;a href="https://huggingface.co/spaces?category=speech-synthesis" rel="noopener noreferrer"&gt;Speech Synthesis&lt;/a&gt; category on Hugging Face Spaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Voice Agents
&lt;/h2&gt;

&lt;p&gt;This article covered eight of the best platforms you can use today to make speech AI products. &lt;/p&gt;

&lt;p&gt;Although all the platforms covered in this article provide natural-sounding human-like voices, many have high latencies when interacting with agents. Some do not handle interruptions and noisy conditions properly. For example, many platforms will struggle to understand a user's voice, especially if a baby or a kid is playing and talking in the background.&lt;/p&gt;

&lt;p&gt;As this AI field keeps improving regularly, future speech models, APIs, and SDKs will enhance their interruption capabilities, noise detection, and ensure low-latency speech-to-speech, speech-to-text, and text-to-speech interactions. Many of these platforms are currently closed source, but as the voice AI landscape evolves rapidly, open-source alternatives will continue to emerge.&lt;/p&gt;

</description>
      <category>voiceaiagents</category>
      <category>voiceai</category>
    </item>
    <item>
      <title>Official Statement: Distinction Between GetStream.io and GetStream.live</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Tue, 27 Jan 2026 22:40:28 +0000</pubDate>
      <link>https://dev.to/getstreamhq/official-statement-distinction-between-getstreamio-and-getstreamlive-166p</link>
      <guid>https://dev.to/getstreamhq/official-statement-distinction-between-getstreamio-and-getstreamlive-166p</guid>
      <description>&lt;h3&gt;
  
  
  We are issuing this advisory to clarify confusion regarding our brand, GetStream.io (Stream), and an unrelated third-party website known as "GetStream.live."
&lt;/h3&gt;

&lt;p&gt;Stream is a legitimate technology company providing Chat and Activity Feed APIs for developers. We are &lt;strong&gt;NOT&lt;/strong&gt; affiliated, associated, or connected in any way with "&lt;strong&gt;GetStream.live&lt;/strong&gt;," a site primarily known for unauthorized sports streaming.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Important Security Warning for Users&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you arrived here searching for free sports streaming, please be aware that you have reached the wrong destination.&lt;/p&gt;

&lt;p&gt;We strongly advise caution if you intend to visit unauthorized streaming websites ending in &lt;code&gt;.live&lt;/code&gt; or similar TLDs. Cybersecurity researchers frequently associate illegal streaming sites with high risks of malware, browser hijackers, and phishing scams targeting personal data.&lt;/p&gt;

&lt;p&gt;GetStream.io maintains strict security protocols and is a trusted service provider for over a billion end-users globally. We do not host, stream, or provide access to copyrighted sports content.&lt;/p&gt;

&lt;p&gt;If you would like to watch your events online, we suggest a legal site like &lt;a href="https://www.espn.com/watch/" rel="noopener noreferrer"&gt;ESPN&lt;/a&gt;, &lt;a href="https://www.nba.com/watch/nba-tv" rel="noopener noreferrer"&gt;NBA&lt;/a&gt;, or &lt;a href="https://go3.tv/en/sports" rel="noopener noreferrer"&gt;Go3&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Stream?
&lt;/h2&gt;

&lt;p&gt;We build the world's most scalable Chat, Video, and Activity Feed infrastructure for applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For Developers:&lt;/strong&gt; If you are looking to integrate in-app chat or social feeds into your product, you are in the right place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For Sports Fans:&lt;/strong&gt; If you are looking for live sports, we recommend using authorized, legal streaming platforms to ensure your device security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is GetStream.io the same as GetStream.live?
&lt;/h3&gt;

&lt;p&gt;No. GetStream.io is a US-based SaaS technology company founded in 2014. GetStream.live is an entirely unrelated entity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does GetStream.live appear in search results when I search for your brand?
&lt;/h3&gt;

&lt;p&gt;Due to the similarity in naming, search engines may occasionally conflate the two distinct entities. We are publishing advisories like this one to help clarify the distinction for users and search algorithms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the .live associated with Getstreaming.TV?
&lt;/h3&gt;

&lt;p&gt;No, the .live site is not associated with the site you are on right now (.io), or &lt;a href="https://getstreaming.tv/" rel="noopener noreferrer"&gt;Getstreaming.TV&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Am I really at risk of having malware installed?
&lt;/h3&gt;

&lt;p&gt;Yes. The &lt;strong&gt;.live&lt;/strong&gt; site is using sports streams created illegally. These streams are not from official sources and can contain any malicious files the creator chooses to include.&lt;/p&gt;

&lt;h3&gt;
  
  
  I've read reviews that the .live site is a legit place to watch sports, is that not correct?
&lt;/h3&gt;

&lt;p&gt;If you are referring to &lt;a href="https://www.scamadviser.com/check-website/getstream.live" rel="noopener noreferrer"&gt;these reviews of the .live site&lt;/a&gt; those should definitely not be trusted.&lt;/p&gt;

</description>
      <category>api</category>
      <category>cybersecurity</category>
      <category>news</category>
      <category>security</category>
    </item>
    <item>
      <title>Hive Moderation Alternatives – Top 8 Competitors Compared</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Fri, 16 Jan 2026 18:28:25 +0000</pubDate>
      <link>https://dev.to/getstreamhq/hive-moderation-alternatives-top-8-competitors-compared-5pn</link>
      <guid>https://dev.to/getstreamhq/hive-moderation-alternatives-top-8-competitors-compared-5pn</guid>
      <description>&lt;p&gt;&lt;a href="https://getstream.io/blog/best-moderation/#4-hive-moderation-api" rel="noopener noreferrer"&gt;Hive Moderation&lt;/a&gt; is one of several platforms that help apps detect and filter &lt;a href="https://getstream.io/blog/user-generated-content-examples/" rel="noopener noreferrer"&gt;user-generated content&lt;/a&gt; across text, image, and video. It's often used in social, marketplace, dating, and gaming apps to flag nudity, hate speech, spam, and other forms of unwanted content.&lt;/p&gt;

&lt;p&gt;While Hive offers a wide range of moderation capabilities, it's not always the right fit for every team. Some platforms prioritize speed and developer experience, while others focus on moderation across specific content types, like chat or livestreams.&lt;/p&gt;

&lt;p&gt;This guide compares Hive to eight other moderation platforms. It highlights key differences in features, pricing, use cases, and customization options, so you can evaluate which tool makes the most sense for your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hive Moderation Overview
&lt;/h2&gt;

&lt;p&gt;Hive offers &lt;a href="https://getstream.io/blog/ai-content-moderation/" rel="noopener noreferrer"&gt;AI-powered content moderation&lt;/a&gt; across images, video, and text. Its models are trained on large-scale datasets and built to automatically detect a wide range of policy violations, from explicit content to violent imagery and hate symbols.&lt;/p&gt;

&lt;p&gt;Let's explore its pros and cons, notable features, primary use cases, and pricing plans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdx7uvrtfjhio69698v4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdx7uvrtfjhio69698v4.jpeg" alt="Hive Moderation website landing page" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Hive
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Multimodal Coverage:&lt;/strong&gt; Hive supports moderation across text, image, and video content, making it suitable for apps that deal with a variety of UGC formats.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pre-Trained AI Models:&lt;/strong&gt; Hive offers pre-trained classifiers for nudity, violence, drugs, weapons, hate symbols, and more, ready to use without additional training or labeling.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Real-Time Processing:&lt;/strong&gt; Hive is built to handle high-volume content pipelines and can return moderation decisions with low latency.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dashboard Tools:&lt;/strong&gt; Teams can manage thresholds, view flagged content, and adjust moderation settings through a web interface, without needing to go through engineering.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enterprise Adoption:&lt;/strong&gt; Hive is used by high-traffic apps and services, signaling its ability to scale with large content volumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Drawbacks of Hive
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Limited Moderation Dashboard:&lt;/strong&gt; Hive's dashboard provides essential controls for reviewing flagged content and setting thresholds, but it's less user-friendly and customizable than other &lt;a href="https://getstream.io/moderation/" rel="noopener noreferrer"&gt;AI moderation tools&lt;/a&gt; like Stream. Teams with more advanced workflow or UI requirements may find it limiting.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Moderation Breadth vs. Depth:&lt;/strong&gt; Hive covers a wide range of content types, but some customers may find its individual models less configurable than solutions that specialize in just one domain (e.g., text-only or chat moderation).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No Support for Adjacent Features:&lt;/strong&gt; Hive is a standalone moderation provider. It doesn't include additional tools like chat, video calling, or activity feeds. For teams building end-to-end user communication or &lt;a href="https://getstream.io/blog/app-engagement/" rel="noopener noreferrer"&gt;engagement features&lt;/a&gt;, this means integrating and managing additional vendors to complete the stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Main Hive Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/glossary/image-moderation/" rel="noopener noreferrer"&gt;Image Moderation&lt;/a&gt;:&lt;/strong&gt; Detects nudity, violence, weapons, drugs, hate symbols, and suggestive content in static images. Useful for moderating profile pictures, uploads, memes, or user-submitted graphics.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Video Moderation:&lt;/strong&gt; Scans video files and livestreams using scene detection. Automatically flags unsafe frames based on the same categories used in image moderation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/glossary/text-moderation/" rel="noopener noreferrer"&gt;Text Moderation&lt;/a&gt;:&lt;/strong&gt; Analyzes user messages, comments, and posts for profanity, hate speech, harassment, spam, and other policy violations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pre-Trained Classifiers:&lt;/strong&gt; Includes a library of ready-to-use classifiers, such as "Nudity," "Tobacco," "Guns," "Violence," and "Hate Symbols," each with adjustable thresholds.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Custom Thresholds and Confidence Scores:&lt;/strong&gt; Developers can tune the aggressiveness of moderation by setting confidence score thresholds per classifier, enabling fine-grained control over what gets flagged.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Moderation Dashboard:&lt;/strong&gt; A web-based interface allows teams to monitor flagged content, adjust thresholds, and review classifier output, without needing to write additional code.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Batch and Real-Time Processing:&lt;/strong&gt; Hive supports both synchronous API calls for real-time moderation and asynchronous workflows for batch processing large content queues.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Integration Support:&lt;/strong&gt; REST API available for integration into backend systems, mobile apps, or content management platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Hive Use Cases
&lt;/h3&gt;

&lt;p&gt;Hive is commonly used by apps that rely on user-generated content and need to automate moderation across multiple media types. Its flexibility and broad classifier set make it suitable for a range of industries and use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Social Networking Platforms:&lt;/strong&gt; Auto-flag explicit images, hate speech, or violent content shared in feeds, comments, or profiles. Hive is often used by large-scale social apps to reduce moderation queues and handle content at scale.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dating Apps:&lt;/strong&gt; Screen profile photos and bios for nudity, sexually suggestive content, or inappropriate language. Helps ensure &lt;a href="https://getstream.io/blog/trust-safety/" rel="noopener noreferrer"&gt;community safety&lt;/a&gt; and maintain app store compliance.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Online Marketplaces:&lt;/strong&gt; Detect counterfeit items, illegal goods, and scam listings in product descriptions or images. Useful for ensuring seller content aligns with platform policies.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Livestreaming Platforms:&lt;/strong&gt; Moderate video streams in near real-time, flagging scenes with weapons, drugs, or graphic content before they're widely viewed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gaming Communities:&lt;/strong&gt; Filter toxicity and abuse in user-generated messages, forums, or voice-to-text transcriptions—especially in multiplayer or chat-heavy games.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Messaging Apps:&lt;/strong&gt; Analyze text conversations for spam, harassment, or prohibited terms, especially in apps where real-time interaction happens at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hive Pricing
&lt;/h3&gt;

&lt;p&gt;Hive offers usage-based pricing for its moderation services.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Here's a breakdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text Moderation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standard Text Moderation:&lt;/strong&gt; $0.50 per 1,000 requests&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Text Moderation Explanations:&lt;/strong&gt; $1.50 per 1,000 requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Visual Moderation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Image Moderation:&lt;/strong&gt; $3.00 per 1,000 requests&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;OCR Moderation (Image):&lt;/strong&gt; $2.00 per 1,000 requests&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;OCR Moderation (Video):&lt;/strong&gt; $0.13 per minute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Audio Moderation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standard Audio Moderation:&lt;/strong&gt; $0.03 per minute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Additional Services&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/glossary/csam/" rel="noopener noreferrer"&gt;CSAM&lt;/a&gt; Detection:&lt;/strong&gt; Contact sales for pricing&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Demographic Classification:&lt;/strong&gt; Contact sales for pricing&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI Content Detection (Image, Text, Audio, Video):&lt;/strong&gt; Contact sales for pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams looking to explore Hive's services, they offer a pay-as-you-go Developer plan with $50+ in free credits upon adding a payment method. This plan includes access to over 10 Hive models, default rate limits, and the ability to train custom models using AutoML.&lt;/p&gt;

&lt;p&gt;Enterprise clients can opt for a &lt;strong&gt;Custom Pricing&lt;/strong&gt; plan, which provides access to all Hive models, the Hive Moderation Dashboard, higher rate limits, premium support, and multi-region deployment options.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Consider: Hive Versus a Competitor
&lt;/h2&gt;

&lt;p&gt;Choosing a content moderation provider involves finding the right balance between coverage, control, and complexity for your specific use case.&lt;/p&gt;

&lt;p&gt;When evaluating &lt;a href="https://getstream.io/blog/hive-ai-and-stream-chat-integration/" rel="noopener noreferrer"&gt;Hive&lt;/a&gt; against another provider, consider the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Which content types do you need to moderate?&lt;/strong&gt; Hive supports image, video, and text. If you're only moderating chat or user messages, a more focused platform with built-in chat-specific tools might offer a faster integration and better results.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Does your moderation provider offer other features you need?&lt;/strong&gt; If you're also planning to add in-app chat, activity feeds, livestreaming, or user engagement tools, it may be worth choosing a platform that bundles moderation alongside those capabilities. This can reduce integration complexity and save on vendor overhead.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Do you need to train custom models?&lt;/strong&gt; Hive offers AutoML support, but customization options may be limited compared to platforms that let you bring your own training data or control model logic directly.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Is developer experience a priority?&lt;/strong&gt; Some platforms offer SDKs, UI kits, and real-time test consoles to streamline integration. Hive primarily provides REST APIs and web dashboards, which may require more backend work.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Do you need moderation tooling beyond model output?&lt;/strong&gt; Some alternatives include full dashboards for safety teams, audit trails, user action history, or human-in-the-loop moderation queues—features that go beyond simple content classification.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How critical are &lt;a href="https://getstream.io/blog/content-compliance/" rel="noopener noreferrer"&gt;compliance&lt;/a&gt; and data handling?&lt;/strong&gt; If you work in healthcare, fintech, or education, check whether the provider offers &lt;a href="https://getstream.io/glossary/hipaa/" rel="noopener noreferrer"&gt;HIPAA&lt;/a&gt;, &lt;a href="https://getstream.io/glossary/gdpr/" rel="noopener noreferrer"&gt;GDPR&lt;/a&gt;, or SOC2 compliance and where data is processed geographically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answering these questions upfront will help narrow your shortlist and surface the tradeoffs between Hive and competitors that might not be obvious in a feature matrix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hive Versus Top 8 Moderation Competitors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hive vs. Stream
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd8u5wv908dpyfjpo9g9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd8u5wv908dpyfjpo9g9.jpeg" alt="Hive vs. Stream" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hive and &lt;a href="https://getstream.io/" rel="noopener noreferrer"&gt;Stream&lt;/a&gt; both offer AI-powered moderation, but they serve different use cases and development goals. Hive focuses on automated classification across image, video, and text. Stream includes &lt;a href="https://getstream.io/moderation/" rel="noopener noreferrer"&gt;moderation&lt;/a&gt; as part of a larger product suite—covering &lt;a href="https://getstream.io/chat/" rel="noopener noreferrer"&gt;chat&lt;/a&gt;, &lt;a href="https://getstream.io/video/" rel="noopener noreferrer"&gt;video&lt;/a&gt;, and &lt;a href="https://getstream.io/activity-feeds/" rel="noopener noreferrer"&gt;activity feeds&lt;/a&gt;—designed specifically for real-time app experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stream Main Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stream is often used by teams building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Chat and Messaging Apps:&lt;/strong&gt; Real-time moderation for 1:1, group, and &lt;a href="https://getstream.io/glossary/public-channel/" rel="noopener noreferrer"&gt;public channel&lt;/a&gt; conversations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/chat/solutions/social/" rel="noopener noreferrer"&gt;Social Platforms&lt;/a&gt;:&lt;/strong&gt; UGC moderation tied to feeds, reactions, and community interactions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/chat/solutions/live-events/" rel="noopener noreferrer"&gt;Virtual Events&lt;/a&gt;:&lt;/strong&gt; Moderated live chat and video in webinar or streaming contexts.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/chat/solutions/gaming/" rel="noopener noreferrer"&gt;Gaming&lt;/a&gt;:&lt;/strong&gt; In-game chat moderation with support for fast-moving, multiplayer interaction.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://getstream.io/chat/solutions/dating/" rel="noopener noreferrer"&gt;Dating&lt;/a&gt; and &lt;a href="https://getstream.io/chat/solutions/marketplaces/" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt; Apps:&lt;/strong&gt; Safe messaging between users, with tools for abuse detection and manual review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike Hive, Stream's moderation is deeply integrated with its other APIs, so you don't need to wire together a third-party moderation layer on top of your chat or video infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d5a5o4e0s11643aw2w2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0d5a5o4e0s11643aw2w2.jpeg" alt="Stream AI Moderation landing page" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stream Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Hive primarily focuses on AI-powered classification for image, video, and text content, Stream includes moderation as a native part of its product suite for in-app experiences.&lt;/p&gt;

&lt;p&gt;Here's how they differ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use case focus:&lt;/strong&gt; Hive is best for classifying media uploads; Stream is built for moderating in-app interactions like chat, calls, and feeds.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Moderation context:&lt;/strong&gt; Stream's moderation includes user-level controls (ban, mute, warn), message-level actions, and automated moderation workflows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Bundled capabilities:&lt;/strong&gt; Stream combines moderation with core chat, video, and feed infrastructure, reducing integration overhead and vendor sprawl.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Developer experience:&lt;/strong&gt; Stream offers SDKs, UI kits, and real-time moderation APIs designed for fast integration. Hive requires more backend orchestration.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Custom automation:&lt;/strong&gt; Stream supports slash commands, keyword filters, and webhook triggers for building automated trust and safety workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stream Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stream offers various &lt;a href="https://getstream.io/moderation/pricing/" rel="noopener noreferrer"&gt;pricing models&lt;/a&gt; tailored to your app's needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pay-As-You-Go:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Messages:&lt;/strong&gt; $2.00 per 1,000&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Images:&lt;/strong&gt; $4.00 per 1,000&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Video File:&lt;/strong&gt; $0.80 per minute of video&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Live Video:&lt;/strong&gt; $4.00 per 1,000 frames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  $5,000/ year&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Includes three moderators, 40 AI harm engines, and semantic filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Standard:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  $20,000/ year&lt;/li&gt;
&lt;li&gt;  Includes five moderators, 40 AI harm engines, and semantic filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enterprise:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  $50,000/ year&lt;/li&gt;
&lt;li&gt;  SAML, SSO, 99.999% SLA&lt;/li&gt;
&lt;li&gt;  Includes support for any size time, 40 AI harm engines, and semantic filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Hive vs. Sendbird
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30nh8uzjk6zvfwgmnytb.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30nh8uzjk6zvfwgmnytb.jpeg" alt="Hive vs. Sendbird" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/chat/stream-vs-sendbird/" rel="noopener noreferrer"&gt;Sendbird&lt;/a&gt; is a real-time communication platform that offers APIs for chat, voice, and video. It includes moderation features like profanity filters, user muting, and banning, along with a dashboard for managing flagged messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sendbird Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sendbird's moderation tools are designed to support common in-app messaging use cases, but their depth may be limited for teams with more complex safety requirements. For example, some developers use external services like Perspective API for toxicity scoring or adopt third-party tools like Lasso Moderation to extend Sendbird's capabilities.&lt;/p&gt;

&lt;p&gt;Hive, by contrast, is focused entirely on content moderation—across text, images, and video—and is built to operate at scale with AI-driven classification.&lt;/p&gt;

&lt;p&gt;If your platform deals primarily with chat, Sendbird may be a practical option. But if your app handles a mix of media types or needs more configurable, model-based moderation, Hive offers broader coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sendbird Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moderation features are included in &lt;a href="https://getstream.io/blog/what-i-learned-researching-chat-api-pricing/" rel="noopener noreferrer"&gt;Sendbird's chat pricing tiers&lt;/a&gt;. There is no standalone moderation plan, but profanity filtering, user bans, and admin controls are available starting at the Starter plan ($349/month for 5,000 MAU). Advanced moderation capabilities may require a Pro or Enterprise plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hive vs. WebPurify
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k11eq6974oik2w8uxtc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k11eq6974oik2w8uxtc.jpeg" alt="Hive vs. WebPurify" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.webpurify.com/" rel="noopener noreferrer"&gt;WebPurify&lt;/a&gt; is a content moderation service offering AI-powered and human moderation for text, images, and video. It's known for its customizable profanity filters, scalable image moderation APIs, and optional human review services. WebPurify is often used in platforms that rely heavily on user-uploaded photos or profile content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebPurify Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both Hive and WebPurify support moderation across text, image, and video, but their approaches differ. Hive relies entirely on AI models trained on large datasets, while WebPurify offers hybrid moderation with optional human review for higher accuracy or edge cases.&lt;/p&gt;

&lt;p&gt;WebPurify also emphasizes configurability, allowing teams to create and manage their own word filters and thresholds via a dashboard. Hive provides broader coverage with pre-trained classifiers for violence, nudity, hate symbols, and more, but less customization at the rule level.&lt;/p&gt;

&lt;p&gt;If you need basic filtering with human escalation paths or want full control over word lists, WebPurify may be a good fit. If you're looking for end-to-end automation at scale, Hive may be more efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebPurify Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Moderation pricing scales with the level of access, customization, and volume of domains or requests your app requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Plugins:&lt;/strong&gt; $5/month — Basic filtering with plugin support&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Standard:&lt;/strong&gt; $15/month — Full API access with filtering tool&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enterprise:&lt;/strong&gt; $50/month — Multi-language support, analytics, and advanced features&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Custom:&lt;/strong&gt; Contact sales for pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All moderation features are available as standalone services, with no bundling required.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hive vs. Sightengine
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hmxjqa09px5j2t7sdmg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hmxjqa09px5j2t7sdmg.jpeg" alt="Hive vs. Sightengine" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sightengine.com/" rel="noopener noreferrer"&gt;Sightengine&lt;/a&gt; provides AI-based moderation APIs for text, image, and video content. It offers a wide range of customizable models, including nudity detection, violence, and offensive language filtering.&lt;/p&gt;

&lt;p&gt;The platform is known for its flexibility—developers can tune confidence thresholds and selectively enable specific classifiers based on app needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sightengine Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hive and Sightengine both offer multi-modal moderation, but Sightengine gives teams more granular control. While Hive focuses on delivering high-volume, pre-trained classification at scale, Sightengine is more geared toward custom configuration and rule tuning.&lt;/p&gt;

&lt;p&gt;Sightengine may be a better fit for apps that need to moderate specific types of content with tight control over thresholds and outputs. Hive may be a stronger choice for teams prioritizing scale, breadth of classifiers, or out-of-the-box setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sightengine Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sightengine offers packages that scale with operations per month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Starter:&lt;/strong&gt; $29/month — 10,000 operations included&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Growth:&lt;/strong&gt; $99/month — 40,000 operations included&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pro:&lt;/strong&gt; $399/month — 200,000 operations included&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enterprise:&lt;/strong&gt; Contact sales for pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Hive vs. Community Sift
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zwx2nkfc8y1l799gnoc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zwx2nkfc8y1l799gnoc.jpeg" alt="Hive vs. Community Sift" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://developer.microsoft.com/en-us/games/products/community-sift/" rel="noopener noreferrer"&gt;Community Sift&lt;/a&gt;, developed by Two Hat (a Microsoft subsidiary), is an AI-powered content moderation platform designed to foster healthy online communities. It offers real-time classification and filtering of user-generated content, including text, images, videos, and usernames.&lt;/p&gt;

&lt;p&gt;Community Sift is particularly known for its ability to handle nuanced language, such as slang, leetspeak, emojis, and misspellings, through advanced machine learning and natural language processing techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Sift Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both Hive and Community Sift offer AI-based moderation across multiple content types, but they take different approaches. Hive emphasizes automation at scale through pre-trained models for text, image, and video classification. Community Sift, on the other hand, prioritizes policy flexibility and contextual understanding, especially in dynamic environments like online games or chat-heavy platforms.&lt;/p&gt;

&lt;p&gt;Community Sift allows teams to define their own moderation thresholds and filtering rules, with support for handling nuanced language like leetspeak, emojis, and intentional obfuscation. It also includes human-in-the-loop escalation paths and configurable workflows to adapt moderation outcomes to community norms.&lt;/p&gt;

&lt;p&gt;While Hive excels in rapid, high-volume content analysis, Community Sift provides more customizable infrastructure for trust and safety teams that require detailed control and manual review options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Sift Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Microsoft offers Community Sift in multiple pricing tiers designed to fit the needs and scale of different organizations. Potential users must contact Microsoft directly to get specific pricing.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Hive vs. CleanSpeak
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8doldlrajj7qpulypi2b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8doldlrajj7qpulypi2b.jpeg" alt="Hive vs. CleanSpeak" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cleanspeak.com/" rel="noopener noreferrer"&gt;CleanSpeak&lt;/a&gt; is a customizable moderation platform built to filter and manage user-generated content, including text, images, and video. It combines dynamic filtering with machine learning and supports real-time content analysis, moderation queues, and detailed policy controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CleanSpeak Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Hive focuses on AI-powered classification with pre-trained models, CleanSpeak offers a more hands-on moderation engine. Teams can define custom word and phrase lists, set up multilingual filtering, and configure review workflows through an integrated dashboard. In addition to text, CleanSpeak supports filtering for images and video, with moderation capabilities for audio content (though audio cannot currently be filtered in real time).&lt;/p&gt;

&lt;p&gt;If you're looking for a platform that provides flexible, rule-based moderation across multiple content types, along with human review tools and detailed reporting, CleanSpeak offers more configurability than Hive. Hive may be more efficient for teams looking for out-of-the-box automation at high volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CleanSpeak Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CleanSpeak does not publish public pricing. Teams must contact sales for a quote based on their use case and scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Hive vs. Checkstep
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gx08xl4ucz0axrovy8n.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gx08xl4ucz0axrovy8n.jpeg" alt="Hive vs. Checkstep" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.checkstep.com/" rel="noopener noreferrer"&gt;Checkstep&lt;/a&gt; is a trust and safety platform that offers AI moderation, human review tools, and compliance workflows for digital platforms. It supports text, image, and video content, and includes features like policy enforcement, audit trails, and content appeals. Checkstep is geared toward platforms that need both moderation and governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkstep Verus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both Hive and Checkstep support multi-modal content moderation, but their focus areas differ. Hive specializes in scalable AI classification for high-volume media analysis. Checkstep combines that with moderation operations—manual review queues, policy tagging, user reporting systems, and internal compliance controls.&lt;/p&gt;

&lt;p&gt;Checkstep is well-suited for enterprise teams that need to demonstrate accountability, track decision-making, or meet regulatory obligations. Hive may be more appropriate for teams that want fast, automated decisions without a full moderation stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkstep Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Checkstep uses custom pricing based on set-up, volume tiers, and operator seats. Variables include:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Moderation volume&lt;/li&gt;
&lt;li&gt;  Types of media analyzed&lt;/li&gt;
&lt;li&gt;  Abuse types&lt;/li&gt;
&lt;li&gt;  Latency&lt;/li&gt;
&lt;li&gt;  Accuracy needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pricing is available through a sales consultation.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Hive vs. ActiveFence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8i5n4m84fiifxe8qffhu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8i5n4m84fiifxe8qffhu.jpeg" alt="Hive vs. ActiveFence" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.activefence.com/" rel="noopener noreferrer"&gt;ActiveFence&lt;/a&gt; is an enterprise-grade trust and safety platform that combines content moderation with proactive threat intelligence. It's designed to detect and manage high-risk content—including hate speech, extremism, CSAM, and disinformation—across text, image, video, and audio.&lt;/p&gt;

&lt;p&gt;In addition to content classification, ActiveFence provides tooling for broader safety operations, including intelligence gathering, compliance tracking, and AI red teaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ActiveFence Versus Hive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hive uses pre-trained AI models to automate content classification, which is ideal for in-app moderation. ActiveFence, by contrast, takes a broader, more proactive approach—tracking harmful networks, monitoring off-platform threats, and supporting investigative workflows.&lt;/p&gt;

&lt;p&gt;If your platform faces coordinated abuse, legal risk, or brand safety concerns beyond simple content violations, ActiveFence provides tools for detection, response, and reporting. Hive is better suited for apps that need to automatically flag and score content uploaded by users, without the need for threat monitoring or policy audits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ActiveFence Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ActiveFence does not publish public pricing. Teams must contact sales for a quote based on their use case and scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives Comparison Chart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Text Moderation&lt;/th&gt;
&lt;th&gt;Image Moderation&lt;/th&gt;
&lt;th&gt;Video Moderation&lt;/th&gt;
&lt;th&gt;Human Review Available&lt;/th&gt;
&lt;th&gt;Custom Models&lt;/th&gt;
&lt;th&gt;Dashboard Included&lt;/th&gt;
&lt;th&gt;Pricing Transparency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hive&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅  (AutoML)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sendbird&lt;/td&gt;
&lt;td&gt;✅ (Chat only)&lt;/td&gt;
&lt;td&gt;✅ (Chat, Higher Tiers)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebPurify&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sightengine&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bodyguard&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CleanSpeak&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkstep&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ActiveFence&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Is Hive Right For You, Or Did You Find An Alternative?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Hive offers broad coverage across text, image, and video moderation with AI models that are ready to use out of the box. It's a solid choice for teams that need fast, automated classification at scale, especially for apps with large volumes of visual or user-uploaded content.&lt;/p&gt;

&lt;p&gt;But it's not the only option.&lt;/p&gt;

&lt;p&gt;If your app is built around real-time chat, feeds, or video interactions, a platform like Stream may offer better alignment—bundling moderation with messaging, voice, and video tools. Platforms like WebPurify, CleanSpeak, or Checkstep could be a better fit if you need deeper configurability or human review options.&lt;/p&gt;

&lt;p&gt;Ultimately, the &lt;a href="https://getstream.io/blog/best-moderation/" rel="noopener noreferrer"&gt;best moderation platform&lt;/a&gt; depends on your content types, workflow requirements, and product roadmap. Many of the alternatives in this guide, including Stream, offer &lt;a href="https://getstream.io/try-for-free/" rel="noopener noreferrer"&gt;free accounts&lt;/a&gt;, so you can evaluate them in context before making a long-term decision.&lt;/p&gt;

</description>
      <category>hivemoderation</category>
      <category>moderationtools</category>
      <category>aimoderation</category>
      <category>contentmoderation</category>
    </item>
    <item>
      <title>The 12 Best Notification APIs for Apps</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Mon, 12 Jan 2026 22:40:31 +0000</pubDate>
      <link>https://dev.to/getstreamhq/the-12-best-notification-apis-for-apps-2ej6</link>
      <guid>https://dev.to/getstreamhq/the-12-best-notification-apis-for-apps-2ej6</guid>
      <description>&lt;p&gt;Push notifications, in-app bells, email digests, SMS alerts, chat mentions...&lt;/p&gt;

&lt;p&gt;Modern apps live and die by their ability to notify users at the right moment with the right message.&lt;/p&gt;

&lt;p&gt;However, building a reliable, scalable notification system from scratch is a massive undertaking. Between real-time delivery, cross-channel orchestration, personalization, compliance, and the sheer volume of events most apps generate, many teams quickly realize they need a dedicated notification infrastructure.&lt;/p&gt;

&lt;p&gt;That's where &lt;a href="https://getstream.io/activity-feeds/notification-feeds/" rel="noopener noreferrer"&gt;notification APIs&lt;/a&gt; come in.&lt;/p&gt;

&lt;p&gt;In this guide, we've evaluated dozens of tools and ranked the 12 best notification APIs available today. We'll break down what each one actually does, who it's best for, and key limitations so you can pick the perfect fit for your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Notification APIs?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgu9uswmm8cg6at8j3xs.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgu9uswmm8cg6at8j3xs.jpeg" alt="Notification feed" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notification APIs are programmable interfaces that let your app send alerts to users across multiple channels: &lt;a href="https://getstream.io/glossary/push-notifications/" rel="noopener noreferrer"&gt;push notifications&lt;/a&gt;, &lt;a href="https://getstream.io/blog/what-is-in-app-messaging/" rel="noopener noreferrer"&gt;in-app messages&lt;/a&gt;, emails, SMS, or even chat mentions. Instead of building and maintaining your own delivery infrastructure, you integrate a third-party service that handles the heavy lifting, like queuing, routing, retries, device token management, and compliance.&lt;/p&gt;

&lt;p&gt;Notification APIs fall into two buckets. Simple "send-only" APIs (like Firebase Cloud Messaging or Amazon SNS) focus on raw delivery of individual messages. Full-featured notification platforms (Stream, Knock, Courier, Braze, etc.) go much further by adding &lt;a href="https://getstream.io/glossary/notification-feeds/" rel="noopener noreferrer"&gt;notification feeds&lt;/a&gt;, workflow orchestration, user preferences, translation management, and analytics.&lt;/p&gt;

&lt;p&gt;The best ones handle real-time delivery, multi-channel orchestration, intelligent aggregation, personalization, and beautiful inbox UIs, all while scaling to millions of users without breaking the bank.&lt;/p&gt;

&lt;p&gt;Let's explore who does it best.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  12 Best Notification APIs
&lt;/h2&gt;

&lt;p&gt;From battle-tested infrastructure to drop-in notification centers, here are the top 12 APIs product teams love and developers want to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stream Notification Feeds
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflvw40k8navn1od30tgx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflvw40k8navn1od30tgx.jpeg" alt="Stream Notification API landing page" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/activity-feeds/notification-feeds/" rel="noopener noreferrer"&gt;Stream Notification Feeds&lt;/a&gt; is the fully managed notification infrastructure built into Stream's &lt;a href="https://getstream.io/activity-feeds/" rel="noopener noreferrer"&gt;Activity Feeds API&lt;/a&gt; (the same system powering companies like Peloton, NBC Sports, and Crunchbase).&lt;/p&gt;

&lt;p&gt;Unlike traditional notification tools that simply deliver alerts, Stream is fundamentally a Feed-as-a-Service, meaning its data model supports true fan-out—the ability to write one activity and distribute it to the feeds of millions of followers in real time. This is the same write-heavy challenge faced by social apps like X, and Stream abstracts the complexity by handling the storage, distribution, and retrieval of feed data while still powering push, in-app, email, SMS, and chat notifications through a unified workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teams that need rich, real-time notification centers with read/unread states, mentions, reactions, and nested threads out of the box &lt;a href="https://getstream.io/blog/build-vs-buy-feeds/" rel="noopener noreferrer"&gt;in days instead of months&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that already use (or plan to use) activity feeds and want notifications tightly coupled to the same data model. Think social, collaboration, marketplaces, communities, live-streaming, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers who need sub-300 ms global latency, built-in aggregation, mentions, read/unread states, and native-quality inbox components (React, React Native, Flutter, iOS, Android) out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies sending millions to hundreds of millions of notifications per month with predictable, activity-based pricing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you don't need an &lt;a href="https://getstream.io/blog/activity-feeds-101/" rel="noopener noreferrer"&gt;activity feed&lt;/a&gt; at all (e.g., purely transactional alerts for a fintech app), a more lightweight send-only tool might feel simpler.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email and SMS are supported via Bring-Your-Own-Provider (SendGrid, Twilio, etc.) rather than fully managed templates out of the box, though pre-built integrations make this painless.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Knock
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5ti98dt6dxoh4lv7dsf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5ti98dt6dxoh4lv7dsf.jpeg" alt="Knock notification tool landing page" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://knock.app/" rel="noopener noreferrer"&gt;Knock&lt;/a&gt; is a notification platform built for product and engineering teams that want multi-channel workflows without building everything themselves. It offers a workflow engine, preference management, template handling, batching/aggregation, and a hosted notification inbox that you can drop directly into your app. Knock is fully API-first, but it also includes a clean dashboard for non-technical teammates to manage content and logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SaaS and B2B apps that need user-level preferences, batching, and granular workflow orchestration across push, email, in-app, and SMS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teams that want a balance between API flexibility and no-code tooling (templates, workflows, delay steps, conditional logic).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that want to ship an in-app notification center quickly without building UI components from scratch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Knock's inbox component is more opinionated than a fully custom feed; it isn't designed to replicate &lt;a href="https://getstream.io/blog/social-media-feed/" rel="noopener noreferrer"&gt;social-style feeds&lt;/a&gt; or complex activity models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing is event-based and can scale quickly for apps with high-volume, high-fanout events (e.g., social, marketplaces, gaming).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The platform focuses heavily on SaaS-style notifications; teams building consumer social networks or real-time collaboration often need deeper feed features than Knock provides.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Courier
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqe56go00b8gc0ipj630.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqe56go00b8gc0ipj630.jpeg" alt="Courier notification tool landing page" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.courier.com/" rel="noopener noreferrer"&gt;Courier&lt;/a&gt; is a multi-channel notification platform that unifies email, push, SMS, chat apps, and in-app messages under a single API. It provides templates, routing rules, user preferences, and a powerful visual editor for creating notification workflows. Courier's UI components let you embed an in-app inbox, though its core strength lies in orchestrating cross-channel delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teams that want a centralized way to manage all notification channels without juggling multiple providers (SendGrid, Twilio, Firebase, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product teams that benefit from a visual workflow builder, audience targeting, and content templates managed outside of engineering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that need multi-channel fallback logic (e.g., try push → fallback to email → fallback to SMS).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Courier is channel-agnostic, which means it doesn't provide the deep activity-feed features needed for rich, social-style notification centers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The in-app inbox component is functional but not optimized for high-volume feeds or advanced aggregation models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing scales with both messages and users, which can get costly for apps with large user bases or heavy notification traffic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  One Signal
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgtkf7jffjts8hwqhrgd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgtkf7jffjts8hwqhrgd.jpeg" alt="OneSignal notification tool landing page" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://onesignal.com/" rel="noopener noreferrer"&gt;OneSignal&lt;/a&gt; is a widely used notification delivery platform offering push notifications, in-app messages, email, and SMS. It started as a mobile push provider and has since expanded into a full customer messaging suite. OneSignal includes segmentation, A/B testing, analytics, a drag-and-drop messaging builder, and basic in-app notification components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mobile teams that primarily need high-volume push delivery with minimal setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps looking for a free tier to get started quickly or test notification strategies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product teams that want built-in audience targeting and marketing-style automation without relying heavily on engineering.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OneSignal is geared toward marketing and engagement workflows, not developer-driven notification feeds or custom activity models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In-app notifications are more like popups and banners; OneSignal doesn't offer a true in-app notification feed or inbox component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scaling beyond push into multi-channel orchestration requires upgrading to higher-tier plans, and message-based pricing can become expensive for large or highly active apps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Braze
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr1vmv2dag0j2ui1h0pd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr1vmv2dag0j2ui1h0pd.jpeg" alt="Braze notification tool landing page" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.braze.com/" rel="noopener noreferrer"&gt;Braze&lt;/a&gt; is an enterprise customer engagement platform built for marketing teams driving lifecycle campaigns across push, in-app messages, email, SMS, and more. It offers advanced segmentation, personalization, journey orchestration, A/B testing, real-time analytics, and a robust user profile system. While it isn't a developer-first notification API, Braze's APIs do support event ingestion, user attribute updates, and programmatic campaign triggers that enable customer messaging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Growth and marketing teams running sophisticated lifecycle campaigns, &lt;a href="https://getstream.io/blog/user-onboarding/" rel="noopener noreferrer"&gt;onboarding flows&lt;/a&gt;, or retention programs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enterprise-scale apps that need rich audience segmentation and real-time user data streaming from CDPs or internal data warehouses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies with marketing, product, and engineering workflows that benefit from a powerful visual orchestration engine.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Braze is not designed to power an in-app notification feed or developer-driven event model; it's primarily a marketing automation tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Braze is dashboard-first, not API-first. Most orchestration, targeting, and message logic live in Braze's UI rather than in code, which can limit engineering flexibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Braze's pricing and implementation overhead can be significant, especially for early-stage startups or smaller teams that only need transactional notifications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Firebase Cloud Messaging (FCM)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eb1m63kotlbhxvtho8b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eb1m63kotlbhxvtho8b.jpeg" alt="Firebase Cloud Messaging landing page" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://firebase.google.com/products/cloud-messaging" rel="noopener noreferrer"&gt;Firebase Cloud Messaging (FCM)&lt;/a&gt; is Google's free, infrastructure-level messaging service for sending push notifications to Android, iOS, and web clients. It handles device token management, message routing, and basic delivery logic. FCM is part of the Firebase ecosystem, making it easy for mobile teams already using Firebase Analytics, Crashlytics, or Authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Apps that need fast, reliable mobile push delivery without paying for a third-party provider.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engineering teams comfortable managing their own notification pipelines, templates, and orchestration logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Early-stage products that want a no-cost way to send push notifications at scale.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;FCM is send-only. It doesn't include templates, workflows, retries, user preferences, or any cross-channel orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There's no in-app notification feed or inbox; everything beyond raw delivery must be built manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging delivery issues can be challenging, especially on iOS where APNs (not FCM) ultimately determine push behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As your notification needs grow (e.g., multi-channel, batching, translation, aggregation), you'll need to layer on a full notification platform or build significant custom infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Amazon SNS (Simple Notification Service)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6vcy42jmyh7sxs6b2if.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6vcy42jmyh7sxs6b2if.jpeg" alt="Amazon SNS (Simple Notification Service) landing page" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://aws.amazon.com/sns/" rel="noopener noreferrer"&gt;Amazon SNS&lt;/a&gt; is AWS's pub/sub messaging service for sending push notifications, SMS, email, and system-to-system messages. It provides a lightweight API for triggering notifications and broadcasting events to multiple subscribers. SNS is often used as the backbone of event-driven architectures within AWS, especially when paired with Lambda, SQS, or EventBridge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engineering teams already invested in AWS that want a simple, infrastructure-level way to publish notifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend systems that need to &lt;a href="https://getstream.io/glossary/fan-out/" rel="noopener noreferrer"&gt;fan out&lt;/a&gt; events to multiple services or trigger automated workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that need low-cost, high-volume transactional notifications, especially SMS.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SNS is not a full notification platform. It lacks templates, preferences, workflows, analytics, and user-level orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There's no in-app notification feed, &lt;a href="https://getstream.io/activity-feeds/ui-kit/" rel="noopener noreferrer"&gt;UI components&lt;/a&gt;, or client-side SDKs for building a rich inbox experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push delivery relies on FCM and APNs, so mobile app teams must still manage token logic and device registration themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementing user-specific notification logic requires custom code and additional AWS services (Lambda, DynamoDB, SQS), which increases complexity over time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pusher Beams
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8lvge1whcvzlyshglqf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8lvge1whcvzlyshglqf.jpeg" alt="Pusher Beams landing page" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pusher.com/beams/" rel="noopener noreferrer"&gt;Pusher Beams&lt;/a&gt; is a hosted push notification service focused on reliable, device-targeted delivery for mobile and web apps. It offers straightforward APIs for sending push messages, managing device interests (subscriptions), and handling user authentication for personalized notifications. Beams is part of Pusher's real-time ecosystem, alongside Channels and Chatkit (now deprecated).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mobile teams that want an easier, more developer-friendly alternative to managing FCM and APNs directly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that need targeted, transactional push notifications with minimal setup or dashboard overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engineering teams that prefer a simple API without adopting a full-blown marketing or orchestration platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pusher Beams focuses strictly on push delivery. It doesn't support email, SMS, in-app feeds, or any multi-channel orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There's no built-in notification inbox or feed, so developers must build all in-app UI experiences themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The product isn't optimized for high-fanout, activity-style notifications (e.g., social feeds, collaboration tools).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compared to more comprehensive platforms, Beams offers fewer workflow, preference, and analytics features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  MagicBell
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbsf6j55dx5bj2e6c3pby.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbsf6j55dx5bj2e6c3pby.jpeg" alt="MagicBell landing page" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.magicbell.com/" rel="noopener noreferrer"&gt;MagicBell&lt;/a&gt; is a dedicated notification inbox platform that gives you a prebuilt, customizable in-app notification center. It aggregates notifications from any channel (push, email, SMS, system events) and displays them in a unified feed using drop-in components for web and mobile. MagicBell also provides APIs for sending notifications, managing read states, grouping, and user preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teams that want to ship a polished in-app notification center in hours instead of building a feed from scratch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SaaS and B2B products that need a persistent inbox where users can review updates, mentions, and system events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies that want an inbox-first approach without committing to a full multi-channel marketing platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MagicBell focuses heavily on the in-app inbox; it's not a full orchestration engine like Knock or Courier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-channel delivery (push, email, SMS) requires configuring third-party providers, as MagicBell doesn't handle full template management or routing logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's not optimized for social-style activity feeds, complex aggregation logic, or high-volume fanout events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing scales with both notifications and users, which may be expensive for apps with high-frequency event streams.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vero
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jrm2umy0eiwvt6qe7da.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jrm2umy0eiwvt6qe7da.jpeg" alt="Vero notification tool landing page" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.getvero.com/" rel="noopener noreferrer"&gt;Vero&lt;/a&gt; is an API-first customer messaging platform centered around email, in-app messages, and behavioral event tracking. It gives teams a centralized workspace for managing message templates, segmentation, journeys, and event-triggered automation. While not a dedicated notification feed provider, Vero is popular among SaaS companies that want data-driven lifecycle messaging without the bloat of larger enterprise marketing suites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SaaS and product-led growth teams that rely on behavioral triggers and want strong control over email and in-app messaging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers who prefer an event-based, API-driven workflow rather than a heavy visual automation platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies that want more flexibility and transparency than tools like Braze or Customer.io typically provide.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vero doesn't offer a built-in notification feed or inbox, so any in-app notification center must be built and maintained manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No push or SMS support out of the box, making it a weaker fit for mobile-first apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While API-friendly, it's not designed for high-volume fanout or activity-stream-style events common in social or collaboration apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best suited to email-centric teams. Apps needing rich, cross-channel orchestration will likely outgrow it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Novu
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foi0qkk2v5ts17u1imh6u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foi0qkk2v5ts17u1imh6u.jpeg" alt="Novu landing page" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://novu.co/" rel="noopener noreferrer"&gt;Novu&lt;/a&gt; is an open-source notification infrastructure that gives you APIs, SDKs, and prebuilt UI components to power multi-channel notifications and an in-app notification inbox. It includes a workflow engine, user preferences, templating, and real-time updates out of the box. Teams can self-host Novu or use the managed cloud version for faster setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engineering teams that want full control over their notification infrastructure with the transparency and flexibility of open source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that need a hosted or self-hosted in-app notification feed, complete with read states, aggregation, and real-time updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers who want to customize workflows, templates, or data pipelines beyond what closed SaaS platforms typically allow.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;While Novu supports multi-channel delivery, its ecosystem is still maturing compared to long-standing API-first platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self-hosting introduces operational overhead. Scaling, monitoring, upgrades, and security all fall on your engineering team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The in-app feed is solid but not built for extremely high-fanout, activity-stream-style use cases seen in social or real-time collaboration apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Advanced features (routing logic, workflow branching, analytics) are improving, but still less robust than enterprise platforms like Knock or Braze.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SuprSend
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F192ads4oll47g6w9qfn4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F192ads4oll47g6w9qfn4.jpeg" alt="SuprSend landing page" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.suprsend.com/" rel="noopener noreferrer"&gt;SuprSend&lt;/a&gt; is a developer-focused notification platform that provides a unified API for sending multi-channel notifications, like email, push, SMS, WhatsApp, in-app, and more. It includes workflow orchestration, a hosted preference center, templates, batched delivery, and a customizable in-app notification inbox. SuprSend aims to give engineering teams the end-to-end tooling needed to manage notification pipelines without building them internally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teams that want an API-first alternative to heavyweight marketing platforms, with strong developer ergonomics and multi-channel support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apps that need a hosted in-app notification center but also want orchestration features like batching, throttling, user preferences, and routing logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies that want to consolidate multiple messaging providers under one unified notification layer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The platform is newer than some of the incumbents, so ecosystem depth, integrations, and UI components continue to evolve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The in-app inbox is solid for SaaS-style apps but less suited to high-volume, activity-feed-driven consumer apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing scales with notifications and users; teams sending extremely high event volumes may need to model costs carefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While powerful, SuprSend is still a SaaS platform. Teams needing full data ownership or self-hosting may prefer open-source options like Novu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;In-App Notification Feed&lt;/th&gt;
&lt;th&gt;Push Notifications&lt;/th&gt;
&lt;th&gt;Email / SMS&lt;/th&gt;
&lt;th&gt;Workflow Orchestration&lt;/th&gt;
&lt;th&gt;UI Components (Inbox / Feed)&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stream Notification Feeds&lt;/td&gt;
&lt;td&gt;Yes (full feed) ✅&lt;/td&gt;
&lt;td&gt;Via integrations ✅&lt;/td&gt;
&lt;td&gt;Via integrations ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (rich, native components) ✅&lt;/td&gt;
&lt;td&gt;Real-time feeds, social, collaboration, high-fanout apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knock&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Multi-channel workflows for SaaS and B2B apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Courier&lt;/td&gt;
&lt;td&gt;Partial (in-app widget) 〰️&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Basic in-app component 〰️&lt;/td&gt;
&lt;td&gt;Unified multi-channel messaging with fallback logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OneSignal&lt;/td&gt;
&lt;td&gt;No (popups only) ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Partial (automation) 〰️&lt;/td&gt;
&lt;td&gt;Limited 〰️&lt;/td&gt;
&lt;td&gt;High-volume mobile push and marketing messaging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Braze&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (marketing-focused) ✅&lt;/td&gt;
&lt;td&gt;Basic in-app messaging 〰️&lt;/td&gt;
&lt;td&gt;Enterprise lifecycle marketing &amp;amp; segmentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase Cloud Messaging (FCM)&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Free mobile/web push delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon SNS&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (SMS/email) ✅&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;AWS-native pub/sub and basic notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pusher Beams&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Simple, reliable push for mobile apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MagicBell&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Via integrations ✅&lt;/td&gt;
&lt;td&gt;Via integrations ✅&lt;/td&gt;
&lt;td&gt;Partial 〰️&lt;/td&gt;
&lt;td&gt;Yes (customizable inbox) ✅&lt;/td&gt;
&lt;td&gt;Plug-and-play in-app notification centers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vero&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Email + in-app lifecycle messaging for SaaS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Novu&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Yes (via providers) ✅&lt;/td&gt;
&lt;td&gt;Yes (via providers) ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (components) ✅&lt;/td&gt;
&lt;td&gt;Open-source, flexible notification infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SuprSend&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes ✅&lt;/td&gt;
&lt;td&gt;Yes (inbox) ✅&lt;/td&gt;
&lt;td&gt;Developer-focused multi-channel orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to Evaluate Notification APIs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Real-Time Updates &amp;amp; Fanout Performance
&lt;/h3&gt;

&lt;p&gt;Your notification system needs to deliver updates instantly, especially for social, collaboration, marketplace, and live experiences. Look for APIs that support low-latency fanout and can handle spikes in event volume without delays or dropped messages. If you expect high-frequency events, real-time architecture becomes non-negotiable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personalization &amp;amp; Aggregation
&lt;/h3&gt;

&lt;p&gt;Notifications only work when they feel relevant. Strong APIs support personalized payloads, intelligent routing, and aggregation logic that bundles related events instead of spamming users. This is especially important for apps where users generate many micro-events in a short window.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delivery Guarantees (Push, In-App, Email)
&lt;/h3&gt;

&lt;p&gt;Not every notification channel is equally reliable, so your provider should offer retries, fallbacks, and delivery reporting. If you're orchestrating across multiple channels, you'll want control over priority, sequencing, and what happens when a message fails. The more channels you support, the more important these guarantees become.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Components (Drop-In Inbox vs. Build-Your-Own)
&lt;/h3&gt;

&lt;p&gt;Some APIs offer prebuilt inboxes or feed components, while others only handle raw delivery. If you want to ship an in-app notification center quickly, UI components dramatically reduce engineering effort and maintenance. If you prefer a fully custom design, make sure the API supports the data model and read-state logic you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer Experience (SDKs, Docs, DX)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://getstream.io/activity-feeds/docs/" rel="noopener noreferrer"&gt;Good documentation&lt;/a&gt;, predictable SDKs, and clear debugging tools save you hours during implementation and ongoing maintenance. Look for APIs that provide typed SDKs, real examples, and transparent logs or dashboards. Strong DX often determines whether your team moves fast or gets stuck on edge cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Structure at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://getstream.io/activity-feeds/pricing/" rel="noopener noreferrer"&gt;Notification pricing&lt;/a&gt; varies widely. Some charge per message, others per user, others per event. High-fanout apps can see costs spike quickly if the model isn't designed for volume. Estimate your future event throughput early so you don't adopt a tool you'll later outgrow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability (Millions of Activities, Multi-Tenant)
&lt;/h3&gt;

&lt;p&gt;If your app grows, your notification system must keep up without rewrites. Look for providers that can handle large fanout, global distribution, and multi-tenant architectures. Systems that rely heavily on polling or cron jobs will struggle as your user base scales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Retention &amp;amp; Compliance
&lt;/h3&gt;

&lt;p&gt;Many industries require strict handling of user notifications, including retention windows, deletion policies, and auditability. Ensure your provider supports &lt;a href="https://getstream.io/glossary/gdpr/" rel="noopener noreferrer"&gt;GDPR&lt;/a&gt;, SOC 2, HIPAA, or any compliance frameworks relevant to your product. The more sensitive your content, the more important your vendor's data practices become.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notification API vs. Platform&amp;nbsp;&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Many teams use "notification API" and "notification platform" interchangeably, but they solve different problems. Notification APIs give you the raw building blocks, which is perfect if you want full control over delivery logic, data modeling, and UI. Notification platforms add workflow orchestration, templates, preferences, and often a hosted inbox, helping you ship faster but with more opinionated constraints.&lt;/p&gt;

&lt;p&gt;Here's how they compare:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Notification APIs&lt;/th&gt;
&lt;th&gt;Notification Platforms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core Purpose&lt;/td&gt;
&lt;td&gt;Deliver raw notifications with full developer control.&lt;/td&gt;
&lt;td&gt;Provide end-to-end workflows, templates, and multi-channel orchestration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customization&lt;/td&gt;
&lt;td&gt;Maximum flexibility. Build your own logic, UI, and routing.&lt;/td&gt;
&lt;td&gt;More opinionated; customization depends on platform capabilities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Components&lt;/td&gt;
&lt;td&gt;Often none; you create your own feed or inbox.&lt;/td&gt;
&lt;td&gt;Many offer prebuilt inbox/feed components you can drop into your app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Channel Support&lt;/td&gt;
&lt;td&gt;Usually limited to push or a single channel; other channels require integrations.&lt;/td&gt;
&lt;td&gt;Built-in email, SMS, push, and in-app messaging with unified workflows.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow Logic&lt;/td&gt;
&lt;td&gt;You write and maintain orchestration in code.&lt;/td&gt;
&lt;td&gt;Visual workflow builders handle routing, delays, batching, and priorities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Involvement&lt;/td&gt;
&lt;td&gt;High—engineers own the entire notification pipeline.&lt;/td&gt;
&lt;td&gt;Lower—product and marketing teams can manage campaigns independently.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best For&lt;/td&gt;
&lt;td&gt;Apps needing custom activity feeds, real-time fanout, or engineering-driven notifications.&lt;/td&gt;
&lt;td&gt;Apps needing fast setup, cross-channel workflows, templates, and user preferences.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which Is the Right API for You?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;The right notification API depends on your app's architecture, your team's workflow, and how much of the notification experience you want to own.&lt;/p&gt;

&lt;p&gt;If you need a &lt;a href="https://getstream.io/blog/stream-feeds-power/" rel="noopener noreferrer"&gt;rich, real-time in-app notification feed&lt;/a&gt; with read states, aggregation, and high fanout, an API-first infrastructure tool like Stream gives you far more control and performance than a marketing-oriented platform.&lt;/p&gt;

&lt;p&gt;If you're focused on cross-channel messaging, tools like Knock, Courier, SuprSend, or MagicBell help you ship faster with built-in templates, routing logic, and preference management.&lt;/p&gt;

&lt;p&gt;For simpler use cases, delivery-first APIs like FCM, Amazon SNS, and Pusher Beams offer a lightweight, low-cost way to send raw &lt;a href="https://getstream.io/blog/in-app-push-notifications/" rel="noopener noreferrer"&gt;push notifications&lt;/a&gt; without any orchestration overhead.&lt;/p&gt;

&lt;p&gt;Teams that prioritize lifecycle marketing or audience segmentation may lean toward Braze or Vero, especially when non-technical stakeholders manage campaigns.&lt;/p&gt;

&lt;p&gt;The key is to match the tool to the experience you want your users to have: a persistent notification feed, reliable cross-channel alerts, or highly targeted marketing journeys.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deconstructing TikTok’s Live Shopping UX</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Mon, 12 Jan 2026 21:42:41 +0000</pubDate>
      <link>https://dev.to/getstreamhq/deconstructing-tiktoks-live-shopping-ux-1a31</link>
      <guid>https://dev.to/getstreamhq/deconstructing-tiktoks-live-shopping-ux-1a31</guid>
      <description>&lt;p&gt;Creating a viable platform based on user-generated content (UGC) is an inherently difficult task in a competitive market, but adding live eCommerce to the feature list can feel particularly daunting.&lt;/p&gt;

&lt;p&gt;Luckily, you can learn a lot about designing great UX from your competition — especially TikTok Live Shopping.&lt;/p&gt;

&lt;p&gt;With its origins in China, a country that has consistently been at the forefront of eCommerce in general and &lt;a href="https://getstream.io/video/live-shopping/" rel="noopener noreferrer"&gt;live commerce&lt;/a&gt; in particular for years, the TikTok app's UX is carefully designed to drive sales while keeping users engaged with the livestream.&lt;/p&gt;

&lt;p&gt;In this guide, we'll go over how a TikTok Live Shopping session flows, why its livestream shopping UX works so well, what product managers can learn from it, and some challenges to consider as you try to implement this feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features of a TikTok Live Shopping Session
&lt;/h2&gt;

&lt;p&gt;Before we dive into the UX details, let's take a quick look at what a TikTok Live Shopping session is typically like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovery
&lt;/h3&gt;

&lt;p&gt;TikTok provides a few avenues for discovery.&lt;/p&gt;

&lt;p&gt;In most cases, a user will stumble across a shopping livestream from their main &lt;a href="https://getstream.io/blog/tiktok-feed-lessons/" rel="noopener noreferrer"&gt;For You Page feed&lt;/a&gt; or the Live feed, just like any other piece of &lt;a href="https://getstream.io/blog/user-generated-content-examples/" rel="noopener noreferrer"&gt;user generated content&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkjhe2vv09o9ytp2tw2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkjhe2vv09o9ytp2tw2.jpeg" alt="A TikTok search for a live shopping stream" width="800" height="1652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Users can also specifically search for live shopping broadcasts if they have a particular channel, product, or category in mind already.&lt;/p&gt;

&lt;p&gt;Since these streams appear naturally in most cases, there are many visual indicators that tell a user they're watching a shopping stream instead of a standard live session.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzey0hlj5w4e5iq4ecbot.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzey0hlj5w4e5iq4ecbot.jpeg" alt="A TikTok Live Shopping UI screenshot" width="800" height="1665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apart from the host who may be showing off a featured item, there's a product card at the bottom, as well as elements on the top and bottom that display the channel name with a follow button, viewer count, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engagement
&lt;/h3&gt;

&lt;p&gt;Just like other livestreaming formats, there's a direct connection between creator and audience. This atmosphere creates natural, real-time engagement via the live chat room and viewer-initiated actions, like virtual gifts to the host that trigger in-stream animations.&lt;/p&gt;

&lt;p&gt;Users can also explore discounts, product carousels, and whole product pages without being taken off the livestream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Purchase
&lt;/h3&gt;

&lt;p&gt;Customers stay in the stream as they complete purchases, as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gfitj85b7nwdjhj646r.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gfitj85b7nwdjhj646r.jpeg" alt="A screenshot of a TikTok Live Shopping product card for a retro handheld device" width="800" height="1669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tapping the product card opens a built-in listing page with the ability to add to cart or buy now. A second tap on either button brings up the checkout overlay.&lt;/p&gt;

&lt;p&gt;During checkout, first-time buyers have to enter their card details, while returning customers benefit from features like quick-fill and saved card details.&lt;/p&gt;

&lt;p&gt;Once a payment completes, the app displays a confirmation that the order was successful with relevant details and buttons to view the order or return to the stream. If the user doesn't tap any buttons, they are brought back to the stream automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TikTok's Design Works: UX Principles in Action
&lt;/h2&gt;

&lt;p&gt;Now that we have an idea of the flow of a Live Shopping session, let's look at why this format is such a success.&lt;/p&gt;

&lt;h3&gt;
  
  
  Social Proof Drives Confidence
&lt;/h3&gt;

&lt;p&gt;eCommerce in general needs social proof in the form of reviews and demos; otherwise, customers are trusting strangers on the internet with their money. TikTok Live Shopping provides this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Shop and individual product reviews&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verified badges&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Viewer count&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Floating hearts, likes, "Someone Just Bought" notifications, and virtual gift displays&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Potential shoppers are much more likely to make a purchase if they know and like the host. If they're unfamiliar with them, they can still see that others trust them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Time Feedback Reduces Uncertainty
&lt;/h3&gt;

&lt;p&gt;Since the hosts are either running their own shop and/or receiving commissions for their sales, they're motivated to keep the audience watching their broadcast. Part of this involves giving demonstrations and answering viewer questions in the moment to inspire confidence in their products.&lt;/p&gt;

&lt;p&gt;For example, if a customer is unsure about how a clothing item would look on their body, they can ask the creator to try it on. This removes the guesswork about many aspects, like size and quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9hvzk7quu7glfls3om9h.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9hvzk7quu7glfls3om9h.jpeg" alt="A screenshot of the live shopping UI showing the " width="800" height="1664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TikTok even provides an "Ask to show" button that users can press to request the host showcase a specific product.&lt;/p&gt;

&lt;p&gt;Viewers can also get real-time feedback from other participants by asking them questions in the chat. If the consensus is that the item is high quality, it eases purchasing anxiety.&lt;/p&gt;

&lt;h3&gt;
  
  
  Urgency Converts Browsers Into Buyers
&lt;/h3&gt;

&lt;p&gt;Limited stock indicators, discount timers, and stream-only pricing create a sense of urgency. Viewers often feel like they have to act fast before they lose access to a good deal or a desired item entirely.&lt;/p&gt;

&lt;p&gt;The fear of missing out is such a powerful force that users seek tips on Reddit for the best ways to buy trendy items before they sell out, like the plush toy Labubu.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;
  
  
  Frictionless Checkout Keeps Users in the Moment
&lt;/h3&gt;

&lt;p&gt;From selecting the desired item to checkout, navigating a purchase is smooth and continuous. Product cards load near-instantly, and there are no redirects to external payment gateways.&lt;/p&gt;

&lt;p&gt;Even when browsing product pages, viewers hear the stream being played out in the background. The constant chatter often continues the momentum and may inspire add-on purchases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Product Managers
&lt;/h2&gt;

&lt;p&gt;PMs building &lt;a href="https://getstream.io/blog/live-commerce/" rel="noopener noreferrer"&gt;live commerce experiences&lt;/a&gt; can learn a lot from TikTok's UX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design for Trust Through Transparency
&lt;/h3&gt;

&lt;p&gt;Live shopping sessions feel transparent on TikTok, which builds user trust. The social proof discussed previously is displayed directly in the stream UI. This reduces the need for deep navigation and the likelihood that a buyer will have second thoughts before adding to cart.&lt;/p&gt;

&lt;p&gt;Your app doesn't need to copy TikTok exactly, but you should build for this level of visibility.&lt;/p&gt;

&lt;p&gt;Beyond what their streams include, you could add in quality metrics like return stats or repurchase rates. Specialized platforms have even more options, such as a cosmetics live shopping app's UI noting what hair types or skin tones an item suits best.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clarity Beats Complexity
&lt;/h3&gt;

&lt;p&gt;It's best to keep on-screen information digestible. The TikTok livestream shopping UX has clear, single-purpose UI elements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmq6im7b5quojss6gzjc8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmq6im7b5quojss6gzjc8.jpeg" alt="A screenshot of TikTok's livestream product list overlay" width="800" height="1660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Though the colorful icons and timers can be a bit overwhelming, they still serve the purpose of being information-dense without being overly complex. This clarity reduces the time between interest and understanding for the consumer, making it less likely that they'll wander off-stream before completing an order.&lt;/p&gt;

&lt;p&gt;Your UI should include details like matching labeling and adequate spacing with a clean visual hierarchy to reduce interface clutter and cognitive load. This will keep your users anchored to the product display.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instant Feedback Keeps Momentum
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/user-engagement/" rel="noopener noreferrer"&gt;User engagement&lt;/a&gt; thrives on immediate response. Even little things can make the UX feel lively, like explosive emoji animations popping up when a viewer sends the host a gift.&lt;/p&gt;

&lt;p&gt;To create stronger feedback loops, your app should feel reactive to nearly every user action in the livestream and in the shop, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI elements:&lt;/strong&gt; While still respecting clarity, everything from chat emojis to successful transaction animations should hold attention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App performance:&lt;/strong&gt; Entering streams, changing screens, and the entire ordering process must feel instantaneous to the buyer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Support services:&lt;/strong&gt; Self-service portals or chatbots can handle returns, defect reports, and similar issues, so human agents can resolve more serious complaints faster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these design choices will keep buyers in the app and lead to better &lt;a href="https://getstream.io/blog/app-kpis/" rel="noopener noreferrer"&gt;product outcomes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design for Continuous Engagement
&lt;/h3&gt;

&lt;p&gt;Customers who buy products through TikTok Live Shopping end up back in the stream, driving continuous engagement.&lt;/p&gt;

&lt;p&gt;Reentering the livestream after a product purchase makes viewers more likely to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Buy another product&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shout out their purchase to get recognized by the host&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspire others to do the same in chat&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of ways your product can build a loop of positivity and hype that sustains itself. For instance, you can display the usernames of recent or top buyers to the host to encourage in-stream acknowledgements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build a Strong Core Product Loop
&lt;/h3&gt;

&lt;p&gt;Your app can have all the polish of TikTok, but it has no chance of competing against it without building an equally strong core experience for both creators and viewers.&lt;/p&gt;

&lt;p&gt;Hosts are the sales engine in &lt;a href="https://getstream.io/glossary/livestream-shopping/" rel="noopener noreferrer"&gt;live shopping&lt;/a&gt;. Beyond entertaining viewers to keep them in the stream, they act as product experts who push potential buyers through the pipeline by answering questions and showcasing items.&lt;/p&gt;

&lt;p&gt;You must incentivize them with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Monetary compensation, like commissions or a share of ad revenue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In-app support via analytics dashboards and algorithm boosts to support popular channels&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Viewers, too, should be given a reason to purchase on your platform. This can take the form of app-wide discounts, cheaper or free shipping for large purchases, or lower pricing for recurring orders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges Behind the Experience
&lt;/h2&gt;

&lt;p&gt;Though the live shopping format has been largely successful for TikTok, there are certain challenges that come with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability at Massive Viewer Counts
&lt;/h3&gt;

&lt;p&gt;Live shopping sessions can attract many concurrent viewers, which puts intense demands on the social media platform and the commerce system.&lt;/p&gt;

&lt;p&gt;The stream must deliver high-quality video and audio while also keeping features like &lt;a href="https://getstream.io/chat/" rel="noopener noreferrer"&gt;real-time chat&lt;/a&gt; and updated product information responsive. This becomes more challenging during flash sales, where traffic and purchases suddenly spike.&lt;/p&gt;

&lt;p&gt;Maintaining performance under these conditions is no small task for both user satisfaction and revenue protection. Even minor amounts of latency can lead to lower conversion rates when noticeable, which is why teams must build with scalability in mind from the start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping Every Component in Sync
&lt;/h3&gt;

&lt;p&gt;Consistently reflecting changes in the UI is a large part of what shapes the "live" feeling in live shopping. When the UI becomes slow or completely unresponsive, users lose confidence in your platform and will likely churn.&lt;/p&gt;

&lt;p&gt;High amounts of visual indicators on a screen at once during a session increase the risk of them falling out of sync with each other. The small inconsistencies this causes can lead to consumers having second thoughts or feeling ripped off, such as discrepancies between a discount timer and the actual prices on a product page.&lt;/p&gt;

&lt;p&gt;Additionally, inaccurately displaying stock changes in the stream or product card can lead to customers placing an order on a sold-out product. This leads to refund complications and higher demands on customer service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moderating Live Interaction
&lt;/h3&gt;

&lt;p&gt;With how fast comment streams move, there must be moderation systems in place that can filter out misleading or &lt;a href="https://getstream.io/blog/harmful-content/" rel="noopener noreferrer"&gt;harmful UGC&lt;/a&gt; instantly.&lt;/p&gt;

&lt;p&gt;The quality of ‌moderation depends heavily on &lt;a href="https://getstream.io/blog/automated-content-moderation/" rel="noopener noreferrer"&gt;automated detection systems&lt;/a&gt; backed by real-time enforcement and human review for edge cases. Reliability is critical in this situation, as delays can quickly expose users and content creators to risk.&lt;/p&gt;

&lt;p&gt;The perceived safety of the experience directly affects user trust, &lt;a href="https://getstream.io/blog/app-retention-guide/" rel="noopener noreferrer"&gt;app retention&lt;/a&gt;, and willingness to purchase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preserving Trust and Security Throughout the Live Shop Event
&lt;/h3&gt;

&lt;p&gt;Issues like secure payment systems, buyer protection, and seller verification are crucial in keeping your live-shopping marketplace from fizzling out.&lt;/p&gt;

&lt;p&gt;Given the sheer number of users who can create shops and participate in these streams, it's essential to verify the credibility and legitimacy of their business practices. Similarly, buyer behavior must also be moderated to prevent issues like scalping or return scams.&lt;/p&gt;

&lt;p&gt;In the case that consumers face fraud while purchasing products, there must be smooth refund workflows in place that prevent damage to your app's reputation.&lt;/p&gt;

&lt;p&gt;Prevention is more effective than remediation, which is why companies must vigilantly maintain compliance with standards like &lt;a href="https://getstream.io/glossary/pci-dss-compliance/" rel="noopener noreferrer"&gt;PCI DSS&lt;/a&gt; to keep payment and user data safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;TikTok Live Shopping demonstrates how livestream shopping UX can build both trust and momentum in high-intent commerce environments.&lt;/p&gt;

&lt;p&gt;By combining live interaction, social proof, and frictionless checkout, the platform minimizes hesitation and keeps users emotionally and cognitively invested in the commerce flow.&lt;/p&gt;

&lt;p&gt;For product managers, one of the most important lessons is that every delay, extra step, or moment of confusion weakens ‌engagement and &lt;a href="https://getstream.io/blog/increase-in-app-conversions/" rel="noopener noreferrer"&gt;conversion rates&lt;/a&gt;. Success in live commerce depends on tight coordination between design, real-time data systems, and infrastructure at scale.&lt;/p&gt;

&lt;p&gt;When these elements work in harmony, the result is an experience that feels fast, reliable, and persuasive, turning passive viewers into active buyers.&lt;/p&gt;

</description>
      <category>liveshopping</category>
      <category>livecommerce</category>
      <category>tiktokliveshopping</category>
      <category>ux</category>
    </item>
    <item>
      <title>From Cameras to Action: Real‑World Applications of Vision and Speech AI</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Mon, 12 Jan 2026 21:29:31 +0000</pubDate>
      <link>https://dev.to/getstreamhq/from-cameras-to-action-real-world-applications-of-vision-and-speech-ai-1m67</link>
      <guid>https://dev.to/getstreamhq/from-cameras-to-action-real-world-applications-of-vision-and-speech-ai-1m67</guid>
      <description>&lt;p&gt;You're working in a warehouse when you see an automated forklift barreling towards a coworker. You whip out your phone and type "STOP!" into the app controlling the vehicle. You add another exclamation point to make sure it knows it's an emergency.&lt;/p&gt;

&lt;p&gt;That's not good enough, and it's not how things have to be.&lt;/p&gt;

&lt;p&gt;AI can revolutionize real-world workplaces, but not the way it works right now. There can be no typing when your hands are full, and there can be no "&lt;em&gt;Thinking...&lt;/em&gt;" when milliseconds mean safety. To work alongside humans, any real-world AI needs to see, hear, and perceive the world as a human does. It needs to hear a shouted "STOP!" and do so, or see the forklift out of control and immediately shut it down without human intervention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://visionagents.ai/" rel="noopener noreferrer"&gt;Vision and speech AI&lt;/a&gt; gives machines the ability to see and hear in ways that actually connect to human behavior. These systems can interact with the world in the natural way we do, integrating directly into real-world workflows.&lt;/p&gt;

&lt;p&gt;How is this happening today? And how can developers start to think about and build AI out in the real world?&lt;/p&gt;

&lt;h2&gt;
  
  
  Vision AI Keeps Industrial Workers Safe
&lt;/h2&gt;

&lt;p&gt;Construction and industrial environments are some of the hardest places to deploy AI. You have people and machinery constantly moving, in poorly lit environments, where a single missed hazard can result in injury and death.&lt;/p&gt;

&lt;p&gt;Human behavior, machine behavior, and environmental state are all part of the perceptual mix, and decisions need to be made on-site, under strict latency requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kajimausa.com/" rel="noopener noreferrer"&gt;Kajima&lt;/a&gt;, one of Japan's largest construction firms, deployed &lt;a href="https://www.archetypeai.io/blog/kajima-archetype-physical-ai-in-construction" rel="noopener noreferrer"&gt;Archetype's physical AI&lt;/a&gt; across active job sites to monitor high-risk human-machine interactions in real time. Unlike single-model or single-sensor systems, Kajima's deployment fused video, depth, LiDAR, and environmental data into a unified spatial model of the site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1c5a7qcezio3axiwg3f.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1c5a7qcezio3axiwg3f.jpeg" alt="Kajima, one of Japan’s largest construction firms, deployed Archetype’s physical AI across active job sites to monitor high-risk human-machine interactions" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This enabled the system to track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Worker proximity&lt;/strong&gt; to heavy machinery (cranes, excavators, autonomous vehicles)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unauthorized entry&lt;/strong&gt; into hazardous or exclusion zones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unsafe behavioral patterns&lt;/strong&gt;, such as workers standing in blind spots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Equipment anomalies&lt;/strong&gt; (unexpected motion, machinery operating out of sequence)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because construction sites have unreliable connectivity and high privacy requirements, Kajima ran the perception models entirely on-site, on local GPUs. This eliminated cloud latency and ensured that when the vision AI recognized a dangerous event, such as a worker stepping into a moving excavator's turning radius, it could trigger an instant local alert, a signal to the machine operator, or an automatic stop condition if integrated with control systems.&lt;/p&gt;

&lt;p&gt;This highlights core architectural patterns developers need to adopt for industrial perception:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://getstream.io/blog/multimodal-ai-agents/" rel="noopener noreferrer"&gt;Multimodal fusion&lt;/a&gt; is mandatory.&lt;/strong&gt; Text alone doesn't work. You need video and audio at a minimum to start to understand these environments. Depth, LiDAR, and sensor telemetry then help to stabilize the model of the world and reduce failure modes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edge inference is the default.&lt;/strong&gt; If your model's output is tied to safety or machine control, you cannot afford cloud round-trips. Latency budgets are on the order of tens of milliseconds. On-prem GPU boxes with embedded AI are the only viable option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Safety requires continuous state estimation.&lt;/strong&gt; Developers should think in terms of temporal reasoning: tracking trajectories, modeling intent, and prediction. In these environments, users need not just detection, but intervention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Event-driven integrations turn perception into action.&lt;/strong&gt; This is mission-critical AI. It stops machines, sends alerts, logs incidents, and saves lives.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As with Kajima, vision and speech AI systems will become core infrastructure that changes how safety protocols are enforced, how incidents are prevented, and how human and machine workflows are coordinated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speech AI is Critical in Operations
&lt;/h2&gt;

&lt;p&gt;Speech is part of the operational control loop. In high-noise, high-tempo environments, a "shut it down!" shouted across the room can be faster than reaching for an emergency button and more reliable than hoping someone sees a hand waving.&lt;/p&gt;

&lt;p&gt;Audio then needs to be treated as a parallel channel rather than a separate subsystem. If you are thinking in text rather than speech, the extra step means seconds that the machine isn't shut down. Speech AI needs to fuse with vision AI and sensor data to generate reliable, real-time interpretations of events.&lt;/p&gt;

&lt;p&gt;Modern &lt;a href="https://getstream.io/glossary/real-time-transcription/" rel="noopener noreferrer"&gt;ASR systems&lt;/a&gt; (such as &lt;a href="https://github.com/openai/whisper" rel="noopener noreferrer"&gt;Whisper&lt;/a&gt;, &lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt;, or custom domain-tuned models) are &lt;a href="https://aiola.ai/use-case/food-cpg-industry/" rel="noopener noreferrer"&gt;now robust enough&lt;/a&gt; to operate in factories, warehouses, and construction sites where noise floors routinely exceed safe listening levels.&lt;/p&gt;

&lt;p&gt;These are only transcription services. They can classify operational intent, detect urgency, and be used to build out workflows. With speech AI, developers can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice-logged maintenance and inspection systems.&lt;/strong&gt; Technicians performing inspections or repairs can dictate findings while working, instead of pausing to write logs (e.g., "&lt;em&gt;Unusual vibration on Pump A, bearings likely failing.&lt;/em&gt;") The ASR output can feed directly into CMMS/maintenance databases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Safety-critical speech triggers.&lt;/strong&gt; &lt;a href="https://getstream.io/blog/realtime-speech-language-models/" rel="noopener noreferrer"&gt;Speech models&lt;/a&gt; can run continuously on edge devices, listening for predefined emergency phrases like "&lt;em&gt;Emergency!&lt;/em&gt;" or our "&lt;em&gt;Shut it down!&lt;/em&gt;" example above. These can be paired with visual AI (e.g., recognizing a person entering a danger zone) so the system can trigger stop signals for machinery and alarms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-free queries for real-time data.&lt;/strong&gt; Operators frequently need sensor values without dropping tools. Speech AI can run a loop with the plant's telemetry systems, returning data verbally or via heads-up displays.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deploying speech understanding in operations isn't about transcription accuracy alone. There are key principles developers have to consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Noise is the default condition.&lt;/strong&gt; Industrial environments have baseline noise levels of 85-100 dB, requiring models trained on augmented datasets with machinery sounds, alarms, and overlapping voices, not clean office recordings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;On-prem inference is required for safety-grade latency.&lt;/strong&gt; When a worker yells "stop," the speech AI needs to process that command and halt machinery in under 100 milliseconds, which means &lt;a href="https://getstream.io/blog/best-local-llm-tools/" rel="noopener noreferrer"&gt;running models locally&lt;/a&gt; on edge hardware rather than waiting for cloud round-trips.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speech must feed into an event model.&lt;/strong&gt; Raw transcription becomes actionable only when the speech AI understands context: who said it, where they are, what equipment they're near, and whether the command requires immediate machine intervention or just logging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The value emerges when speech and vision converge.&lt;/strong&gt; A worker pointing at a gauge while saying "this reading looks wrong" requires the vision AI to fuse visual object detection with speech understanding to identify which specific gauge, read its value, and determine if intervention is needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When speech and vision AI operate as a unified perception layer, they create systems that understand not just what workers are saying or what the cameras see, but the full context of human intent and machine state. This multimodal fusion is what transforms perception from a monitoring tool into an active participant in operational workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal AI Powers Assistive and Accessibility Tools
&lt;/h2&gt;

&lt;p&gt;Accessibility systems are among the purest expressions of real-time perception: they must continuously interpret a user's environment, respond within strict latency, and adapt their output to the user's cognitive and sensory constraints.&lt;/p&gt;

&lt;p&gt;Unlike industrial systems that optimize for throughput or safety margins, assistive vision and speech AI optimize for clarity, privacy, and contextual relevance. You need to describe not just what's in a scene, but what matters to the user. Assistive technologies need to combine on-device vision models, speech recognition, and language-model reasoning to deliver &lt;a href="https://getstream.io/blog/realtime-ai-agents-latency/" rel="noopener noreferrer"&gt;real-time understanding&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apps like Be My Eyes' "&lt;a href="https://www.bemyeyes.com/news/introducing-be-my-ai-formerly-virtual-volunteer-for-people-who-are-blind-or-have-low-vision-powered-by-openais-gpt-4/" rel="noopener noreferrer"&gt;Virtual Volunteer&lt;/a&gt;" demonstrate how multimodal models move beyond object detection and OCR. Users submit a photo or a continuous video stream, and the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Identifies salient objects (food items, signage, screens)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reads and summarizes text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infers context (e.g., "these ingredients could make a pasta dish")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Answers follow-up questions with conversational precision&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlwxpiv2hgab8u0wgwwf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlwxpiv2hgab8u0wgwwf.jpeg" alt="Be My Eyes’ “Virtual Volunteer” app" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wearables like &lt;a href="https://xrai.glass/" rel="noopener noreferrer"&gt;XRAI Glass&lt;/a&gt; take this further, pairing ASR with AR displays to caption speech in the user's field of view. These include low-latency, on-device ASR, continuous streaming transcription, diarization (identifying who's speaking), and projection to overlay text in physical space.&lt;/p&gt;

&lt;p&gt;These systems need to handle overlapping speech, reverberant rooms, and mixed accents, all in real time.&lt;/p&gt;

&lt;p&gt;Assistive vision and speech AI force developers to solve some of the most challenging perception problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A spoken caption that appears 700ms late is unusable, and a scene description that lags by a second destroys the interaction. Developers must design for sub-200-ms feedback loops.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-device inference is the default privacy posture. Many users cannot (or should not) upload raw video/audio, so models must be optimized to run on mobile GPUs, NPUs, or edge accelerators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Summarization &amp;gt; enumeration. Blind users do not want "&lt;em&gt;There is a table. There is a chair. There is a lamp.&lt;/em&gt;" They want contextual interpretation: "&lt;em&gt;Your coffee mug is on the far right side of the table, near the edge.&lt;/em&gt;" This requires multimodal perception + LLM reasoning, not raw detection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers must build for not just what the system detects, but how it communicates: concise TTS, AR text, haptic cues, and summaries.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The accessibility domain generalizes to other real-time perception problems. Design constraints developed here, such as &lt;a href="https://getstream.io/blog/low-latency-video-streaming/" rel="noopener noreferrer"&gt;low latency&lt;/a&gt;, privacy-preserving inference, contextual summarization, map directly to robotics, industrial safety, and autonomous systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temporal AI is Essential for Sports Analytics
&lt;/h2&gt;

&lt;p&gt;Sports environments push vision AI to its limits. Players move at high speed, balls travel even faster, camera angles shift constantly, and multiple events compete for attention. Unlike controlled industrial settings, &lt;a href="https://getstream.io/blog/ai-sports-analytics/" rel="noopener noreferrer"&gt;sports vision AI&lt;/a&gt; must track everything while maintaining player identity across multiple camera feeds and delivering insights fast enough for broadcasting, coaching, and officiating.&lt;/p&gt;

&lt;p&gt;The challenge isn't just detecting what happened, but understanding the context and significance of each moment. A spike in crowd noise could signal a goal, a near-miss, or a controversial call. A player's sudden deceleration might indicate fatigue, tactical positioning, or injury.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.hawkeyeinnovations.com/" rel="noopener noreferrer"&gt;Hawk-Eye&lt;/a&gt; (tennis, cricket) and &lt;a href="https://inside.fifa.com/innovation/standards/video-assistant-referee" rel="noopener noreferrer"&gt;VAR&lt;/a&gt; (soccer) use multi-camera triangulation to track ball position and player movements for officiating decisions. &lt;a href="https://pr.nba.com/nba-genius-sports-second-spectrum-expanded-partnership/" rel="noopener noreferrer"&gt;Second Spectrum&lt;/a&gt; (NBA) and &lt;a href="https://nextgenstats.nfl.com/" rel="noopener noreferrer"&gt;Next Gen Stats&lt;/a&gt; (NFL) provide real-time analytics by processing multiple video feeds to track players, ball trajectories, and game events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb50iwue7odu5ot807ujk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb50iwue7odu5ot807ujk.jpeg" alt="Tracking an onside kick using vision AI" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These systems combine computer vision with audio processing to create comprehensive game understanding.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Player and ball tracking across the entire field of play&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic offside detection and line-call verification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Team formation and spacing analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Injury risk detection through biomechanical analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated highlight detection using crowd noise and visual cues&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical requirements for sports perception create unique developer challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single-frame detection is insufficient.&lt;/strong&gt; Single-frame detection fails when tracking fast-moving players who cluster, occlude each other, or temporarily leave the frame.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sports systems often ingest 8-24+ feeds simultaneously.&lt;/strong&gt; Officiating decisions require perfect frame alignment across feeds to determine the exact moment of rule violations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multimodal fusion reduces false positives.&lt;/strong&gt; Vision identifies player actions, audio captures crowd reactions, and commentary provides semantic context that no single modality can deliver alone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latency requirements vary by use case.&lt;/strong&gt; Officiating can tolerate seconds for review, while injury detection must flag risks immediately.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sports perception systems are blueprints for any fast-moving, multi-agent scenario. The same principles that track basketball players through screens apply to warehouse robots, autonomous vehicles, and drone coordination, but with every decision visible to millions of viewers in real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How can I combine vision and audio inputs to interpret real-time events?
&lt;/h3&gt;

&lt;p&gt;You must treat audio as a parallel channel for multimodal fusion rather than relying solely on text. Speech AI captures intent and urgency (e.g., a shouted "Stop!"), while vision AI provides physical context (e.g., a worker in a danger zone). When fused, these inputs allow the system to understand the full context of human intent and machine state.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the best architecture for low-latency perception in edge environments?
&lt;/h3&gt;

&lt;p&gt;Edge inference is the required default for safety-critical operations. To meet latency budgets of under 100 milliseconds, you must use on-premise GPU hardware or embedded AI to process data locally. This architecture eliminates cloud round-trips, allowing the vision AI to trigger instant alerts or machine stops immediately upon detecting a hazard.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can accessibility features use perception AI safely and privately?
&lt;/h3&gt;

&lt;p&gt;Accessibility tools should utilize on-device inference as the default posture to ensure user privacy, avoiding the need to upload raw video or audio. These systems combine vision and speech AI to deliver contextual summaries—interpreting what matters to the user rather than just listing objects—and must operate with sub-200ms feedback loops to remain usable.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between industrial and sports vision systems?
&lt;/h3&gt;

&lt;p&gt;Industrial vision AI optimizes for safety and immediate intervention in poorly lit environments with heavy machinery. In contrast, sports vision AI must track high-speed, multi-agent scenarios across 8--24+ simultaneous camera feeds, maintaining player identity and alignment for broadcasting and officiating decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I evaluate real-world perception systems for accuracy and reliability?
&lt;/h3&gt;

&lt;p&gt;You should evaluate systems based on "continuous state estimation" (temporal reasoning) rather than single-frame detection, which often fails in dynamic environments. Reliability is achieved through multimodal fusion (combining vision, speech, and sensor data) to stabilize the world model, reduce false positives, and enable the system to predict trajectories and intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Perception Systems for the Real World
&lt;/h2&gt;

&lt;p&gt;Every deployment faces the same architectural decision tree.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Safety-critical systems like Kajima's construction monitoring require edge inference with sub-100ms latency, processing everything locally on GPUs to avoid network dependencies. Broadcasting and analytics systems can leverage hybrid architectures, using edge devices for initial processing and cloud resources for deeper analysis. Accessibility tools require on-device inference by default, both for privacy and responsiveness, while sports systems often distribute processing across multiple tiers to handle dozens of camera feeds simultaneously.&lt;/p&gt;

&lt;p&gt;The convergence of vision, speech, and temporal AI isn't just enabling new applications; it's creating a blueprint for how AI systems interact with the physical world. Developers &lt;a href="https://github.com/GetStream/Vision-Agents" rel="noopener noreferrer"&gt;building these systems&lt;/a&gt; are creating the sensory layer that lets AI understand, respond to, and ultimately reshape how we work, play, and live in real environments.&lt;/p&gt;

</description>
      <category>visionai</category>
      <category>speechai</category>
    </item>
    <item>
      <title>Livestream Shopping Statistics (2026): Growth, Adoption, and Regional Trends</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Thu, 08 Jan 2026 22:59:48 +0000</pubDate>
      <link>https://dev.to/getstreamhq/livestream-shopping-statistics-2026-growth-adoption-and-regional-trends-2900</link>
      <guid>https://dev.to/getstreamhq/livestream-shopping-statistics-2026-growth-adoption-and-regional-trends-2900</guid>
      <description>&lt;p&gt;Global livestream sales are projected to exceed &lt;a href="https://www.forbes.com/councils/forbestechcouncil/2025/02/03/how-live-shopping-is-changing-the-retail-landscape-across-the-globe/" rel="noopener noreferrer"&gt;$1 trillion by 2026&lt;/a&gt;. And it's a huge rise from its $682.5 billion benchmark from 2023.&lt;/p&gt;

&lt;p&gt;Today's retailers are &lt;a href="https://getstream.io/blog/create-live-stream-app/" rel="noopener noreferrer"&gt;building live video&lt;/a&gt; into everyday sales operations, so that buyers can use these sessions to see how products actually work, ask questions on the spot, and get quick answers before making a purchase.&lt;/p&gt;

&lt;p&gt;Platforms like TikTok Shop and YouTube Shopping now run full retail campaigns, often with better engagement than traditional eCommerce.&lt;/p&gt;

&lt;p&gt;This post lays out the latest numbers on adoption, conversion rates, and platform growth driving the live-commerce boom. Use these metrics to set realistic targets, pick what to build next, and defend your roadmap with data.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Livestream Shopping?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://getstream.io/video/live-shopping/" rel="noopener noreferrer"&gt;Livestream shopping&lt;/a&gt; is an eCommerce method where a brand, seller, or creator shows products, and viewers can ask questions, react, and buy without leaving the stream. The format first took off in China after Taobao Live launched in 2016, then spread to social and &lt;a href="https://getstream.io/blog/build-marketplace-app/" rel="noopener noreferrer"&gt;marketplace apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It blends the visual-based promotional style of televised shopping channels with the parasocial dynamics of social media. The format works so well because of a few reasons, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Key opinion leaders (KOLs) and influencers attract an audience based on industry expertise, credibility, personality, and reach.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a href="https://getstream.io/blog/ecommerce-chat/" rel="noopener noreferrer"&gt;real-time chat&lt;/a&gt; keeps viewers engaged and surfaces objections the host can answer on the spot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Live demos and Q&amp;amp;As reduce doubt, so fewer users leave to research outside sources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In-stream checkout removes steps and increases completion rates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Platform analytics show drop-offs, click paths, and add-to-cart triggers, so you can adjust discovery, product surfacing, and pacing in future updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Global Market Growth of Live Commerce
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/live-commerce/" rel="noopener noreferrer"&gt;Live commerce&lt;/a&gt; is no longer growing at the edges of eCommerce.&lt;/p&gt;

&lt;p&gt;In 2024, the global live-commerce market was valued at about $128 billion, and long-range forecasts put it on track to reach $2.47 trillion by 2033. At a nearly 40% annual growth rate, interactive video is becoming a normal part of how people discover and buy products. (&lt;a href="https://www.grandviewresearch.com/industry-analysis/live-commerce-market-report" rel="noopener noreferrer"&gt;Grand View Research, 2025&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Another forecast that uses a wider view of livestream eCommerce values the market at about $940 billion in 2024 and projects more than $6 trillion by 2035. (&lt;a href="https://www.transparencymarketresearch.com/livestream-e-commerce-market.html" rel="noopener noreferrer"&gt;Transparency Market Research, 2025&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Even with different baselines, both studies point to steady, long-term growth rather than a short-term trend. On the business side, companies that lean into live streaming early report top-line revenue growth of up to 25%. (&lt;a href="https://www.cnbc.com/2023/06/09/livestream-shopping-booms-as-small-businesses-hit-social-media-.html" rel="noopener noreferrer"&gt;CNBC, 2025&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Regional Trends Driving Live Commerce Growth
&lt;/h3&gt;

&lt;p&gt;Some regions have already proven that live commerce can operate at a massive scale, while others are still early in adoption. Let's look at regional data next to see where momentum is strongest and why outcomes differ so sharply across markets.&lt;/p&gt;

&lt;h4&gt;
  
  
  China
&lt;/h4&gt;

&lt;p&gt;China is the clearest proof of how large live commerce can get when the features line up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Livestream shopping there expanded from about $57 billion in 2019 to roughly $682 billion in 2023. Current projections put it on track to cross $1.1 trillion by 2026. (&lt;a href="https://www.statista.com/statistics/1127635/china-market-size-of-live-commerce/" rel="noopener noreferrer"&gt;Statista, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By 2025 alone, live streaming sales are expected to reach $843.9 billion, making up 19.2% of all retail eCommerce sales in the country. (&lt;a href="https://www.emarketer.com/content/live-commerce-2023" rel="noopener noreferrer"&gt;Emarketer, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That growth is spread across multiple platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Douyin (China's version of &lt;a href="https://getstream.io/blog/tiktok-feed-lessons/" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt;) recorded around $375 billion in gross merchandise value (GMV) in 2023, supported by 750 million monthly users and about 400 million daily users. Surveyed users spend close to two hours a day in the app, which gives brands repeated chances to convert attention into purchases. (&lt;a href="https://drpress.org/ojs/index.php/HBEM/article/view/26358" rel="noopener noreferrer"&gt;DrPress, 2024&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Taobao Live operates at a similar scale and generated $550 billion in GMV, reaching about 900 million monthly users. The average user spends around an hour on the platform. (&lt;a href="https://drpress.org/ojs/index.php/HBEM/article/view/26358" rel="noopener noreferrer"&gt;DrPress, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kuaishou handled about $161 billion in GMV, with more than 600 million monthly users who spend over 100 minutes a day in the app on average. (&lt;a href="https://drpress.org/ojs/index.php/HBEM/article/view/26358" rel="noopener noreferrer"&gt;DrPress, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pinduoduo reported roughly $590 billion in GMV. It pulls large audiences into live sessions through social shopping and group-buying mechanics. (&lt;a href="https://drpress.org/ojs/index.php/HBEM/article/view/26358" rel="noopener noreferrer"&gt;DrPress, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Douyin streams average over 2.09 million viewers per day. Individual viewer sessions are short, but even with an average conversion rate of around 1.3%, the volume drives more sales at scale. (&lt;a href="https://www.ewadirect.com/proceedings/aemps/article/view/11471#:~:text=related%20merchandise%20will%20amount%20to,seconds%20on%20the%20live%20stream" rel="noopener noreferrer"&gt;EWA, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  North America
&lt;/h4&gt;

&lt;p&gt;Live commerce in North America is growing, but it is still early compared to Asia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Livestream shopping sales in the United States reached about $50 billion. By 2026, this figure will rise by roughly 36% and account for more than 5% of total digital commerce sales across the region. (&lt;a href="https://www.statista.com/statistics/1276120/livestream-e-commerce-sales-united-states/" rel="noopener noreferrer"&gt;Statista, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consumer adoption explains both the upside and the limits. Only 12% of US shoppers have bought through a livestream so far. Another 12% say they plan to try it, which points to a scope for further expansion. (&lt;a href="https://www.emarketer.com/content/what-brands-need-know-about-livestream-ecommerce" rel="noopener noreferrer"&gt;Emarketer, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Europe
&lt;/h4&gt;

&lt;p&gt;Europe shows broader participation but a more defined user profile.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Around 35% of European consumers have made a purchase in this format. This suggests a higher awareness than in North America. (&lt;a href="https://www.statista.com/statistics/1341653/live-commerce-adoption-by-country/" rel="noopener noreferrer"&gt;Statista, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frequent users tend to be younger, with most falling between 18 and 34 years old. Men make up the slight majority of this group at 53%. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seller activity is rising quickly, as well. On Whatnot in Europe, the number of active sellers grew by 600% year over year, streaming more than 20,000 hours each week. This points to a rapid growth in supply as platforms invest more in live commerce. (&lt;a href="https://blog.teamwhatnot.com/unitedstates/livesellingreport" rel="noopener noreferrer"&gt;Whatnot, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Asia-Pacific and Emerging Markets
&lt;/h4&gt;

&lt;p&gt;Outside China, adoption is the fastest across Asia and parts of the Middle East.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In India, 75% of shoppers have already used livestream shopping. Thailand follows closely at 73%, and the UAE at 72%. These figures place Asia and MENA well ahead of Western markets in day-to-day usage. (&lt;a href="https://mmaglobal.com/files/casestudies/the-future-shopper-report-2023.pdf" rel="noopener noreferrer"&gt;Wunderman Thompson Report, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Japan has the lowest utilization at 15%. The gap shows differences in mobile habits, payment methods, and shoppers' comfort with buying within social apps. Other slow countries globally include the UK (35%), Australia (31%), and Germany (26%). (&lt;a href="https://mmaglobal.com/files/casestudies/the-future-shopper-report-2023.pdf" rel="noopener noreferrer"&gt;Wunderman Thompson Report, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Southeast Asia is becoming a competitive hotspot. Shopee, Lazada, and TikTok are all pushing live commerce as a core experience. By 2027, 48% of consumers in this region will watch livestreams once a week at a minimum. (&lt;a href="https://kr-asia.com/tiktok-shops-gmv-soared-in-2023-putting-shopee-and-lazada-on-edge" rel="noopener noreferrer"&gt;KrAsia, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;India is projected to be the fastest-growing live commerce market in the region, with revenue expected to reach about $140 billion by 2033. (&lt;a href="https://www.grandviewresearch.com/horizon/outlook/live-commerce-market-size/global" rel="noopener noreferrer"&gt;Grand View Horizon, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Latin America
&lt;/h4&gt;

&lt;p&gt;Latin America's market is still developing, but it already shows strong interest among users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;64% of frequent live-commerce users in the region already attend shopping streams regularly, and 63% say they want to buy more in this way. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Most users are between 25 and 44 years old, men make up 58% of shoppers, and 86% live in urban areas. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Social platforms play a major role here. 71% of regular users shop through Instagram, while 51% use Facebook. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Platform Momentum and the Creator Economy
&lt;/h2&gt;

&lt;p&gt;Live commerce growth is closely linked to how platforms support content creators and brands as they scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://getstream.io/blog/tiktok-live-shopping/" rel="noopener noreferrer"&gt;TikTok Shop&lt;/a&gt; shows how quickly this model can scale in Western markets. After its wider rollout in the US, the platform drove $100 million in Black Friday sales in 2024, triple the volume from the year before. On that day alone, American users watched more than 30,000 shopping-focused livestreams. (&lt;a href="https://www.businessinsider.com/tiktok-push-to-bring-social-shopping-ecommerce-us-paying-off-2024-12" rel="noopener noreferrer"&gt;Business Insider, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In China, 70% of eCommerce livestreams on Douyin are now led by merchants rather than independent influencers. In terms of sales volume, merchant-led streams account for 40% of GMV, while influencer and mixed formats split the rest. (&lt;a href="https://daoinsights.com/news/merchant-led-livestreams-take-over-douyin-e-commerce/" rel="noopener noreferrer"&gt;Dao Insights, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Top influencers take commissions as high as 40% to 50% of live sales revenue. That level of payout raises expectations on performance, but can also limit how often brands work with big names. (&lt;a href="https://www.sciencedirect.com/science/article/abs/pii/S0305048324001609" rel="noopener noreferrer"&gt;Science Direct, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Across markets, live video now dominates influencer marketing. In 2025, it accounted for 52.4% of all mentions. (&lt;a href="https://influencermarketinghub.com/influencer-marketing-benchmark-report/" rel="noopener noreferrer"&gt;Influencer Marketing Report, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There was a 55% increase in branded search rates for users in a group shown both Amazon Live ads and other formats vs those who were only shown the other formats. (&lt;a href="https://advertising.amazon.com/solutions/products/amazon-live" rel="noopener noreferrer"&gt;Amazon Live, 2025&lt;/a&gt;)&amp;nbsp;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consumer Behavior and Demographics
&lt;/h2&gt;

&lt;p&gt;Who shows up on live streaming apps (and how often) may explain why adoption feels uneven across markets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Younger users lead the way in the US in one survey. Gen Z is the largest group engaging with shopping videos on social platforms, with 83% watching them. Millennials make up the biggest share of people who actually buy during live shopping sessions at 58%. (&lt;a href="https://vtex.com/en-us/press/mastering-live-shopping/" rel="noopener noreferrer"&gt;VTEX Research, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But frequency is still uneven. Only 12% of consumers shop through live formats monthly, and 11% do so more than once a week. At the same time, 55% say they would shop through video and live commerce more often if they were more regularly available. (&lt;a href="https://vtex.com/en-us/press/mastering-live-shopping/" rel="noopener noreferrer"&gt;VTEX Research, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coming to awareness, 38% of consumers are not even sure whether the brands they buy from offer this type of shopping, indicating more of a discovery gap than a demand gap. (&lt;a href="https://vtex.com/en-us/press/mastering-live-shopping/" rel="noopener noreferrer"&gt;VTEX Research, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Looking at frequent users globally, the average age falls between 33 and 36, with people aged 25 to 34 forming the largest group. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Among frequent live-commerce users, income levels vary by region. In both the United States and Europe, the majority of users have annual incomes between $25,000 and $50,000. But in the United States, 32% of frequent users earn more than $100,000 a year, while only 5% of their European counterparts do. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gender patterns slightly favored men in most markets, although China was the exception, with 58% of frequent shoppers being women. (&lt;a href="https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/ready-for-prime-time-the-state-of-live-commerce" rel="noopener noreferrer"&gt;McKinsey, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Motivates Viewers to Buy
&lt;/h2&gt;

&lt;p&gt;People choose to buy from livestreams mainly because it shortens the time between product introduction and purchase. Here are a few other factors that push consumers to opt for live commerce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;40% of surveyed viewers say convenience is the main draw. They can watch, ask questions, and purchase in one place without switching tabs. Demos matter almost as much: 36% say seeing items used live helps them decide. (&lt;a href="https://investor.agora.io/news-releases/news-release-details/survey-consumers-want-more-live-interactive-shopping-events" rel="noopener noreferrer"&gt;Agora, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24% say engagement influences their decision, whether that comes from chatting with the host (15%) or reacting alongside other shoppers (9%). (&lt;a href="https://investor.agora.io/news-releases/news-release-details/survey-consumers-want-more-live-interactive-shopping-events" rel="noopener noreferrer"&gt;Agora, 2024&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Giveaways and challenges matter even more for some audiences. 36% rank participation rewards as their top reason for tuning in. (&lt;a href="https://coresight.com/research/10-key-trends-shaping-livestreaming-e-commerce-in-2023/" rel="noopener noreferrer"&gt;HubSpot Bambuser, 2023&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://getstream.io/blog/social-media-app-features/" rel="noopener noreferrer"&gt;Social features&lt;/a&gt;, such as chat and polls, were shown to strengthen confidence in both the host and the product in a statistically significant way. (&lt;a href="https://www.mdpi.com/0718-1876/20/2/85#:~:text=The%20results%20of%20the%20hypothesis,importance%20of%20interactivity%20in%20consumer" rel="noopener noreferrer"&gt;MDPI, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One study showed that comment and reaction activity was the strongest signal for determining live commerce marketing performance. (&lt;a href="https://www.nature.com/articles/s41598-025-00546-w#:~:text=scientific%20basis%20for%20subsequent%20management,performance%2C%20and%20strengthen%20brand%20promotion" rel="noopener noreferrer"&gt;Nature.com, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another study found that trust in the streamer, shaped by factors like expertise and warmth, was the strongest predictor for customer engagement behaviors. (&lt;a href="https://www.researchgate.net/publication/389851993_The_trust-driven_path_to_consumer_engagement_behaviors_Exploring_the_role_of_streamer_and_platform_characteristics_in_live-streaming_E-commerce#:~:text=Equation%20Modeling%20,employing%20streamers%20with%20strong%20interpersonal" rel="noopener noreferrer"&gt;ResearchGate, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Industries Seeing the Highest Returns from Livestream Shopping
&lt;/h2&gt;

&lt;p&gt;As one would expect, live commerce pays off most in verticals that benefit from its interaction-heavy, visual-based format. Here are some categories that see better returns than most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Fashion and apparel sit at the top. In 2024, this category accounted for more than 28% of the global livestream eCommerce market. Fit checks, try-ons, and styling demos help viewers make quicker yet informed decisions. (&lt;a href="https://market.us/report/livestream-e-commerce-market/" rel="noopener noreferrer"&gt;Market.us, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Beauty and personal care, automotive, and electronics were the three other categories that topped market share in the same year. (&lt;a href="https://market.us/report/livestream-e-commerce-market/" rel="noopener noreferrer"&gt;Market.us, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another study showed that the global health and wellness market is both the most profitable and the fastest-growing segment. Real-time product demos and credibility from professional hosts make it more appealing to the respective audience. (&lt;a href="https://www.grandviewresearch.com/horizon/outlook/live-commerce-market-size/global" rel="noopener noreferrer"&gt;Grand View Horizon, 2025&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;As seen by the data, live commerce is gaining popularity globally and will only continue to grow in adoption and revenue for the foreseeable future.&lt;/p&gt;

&lt;p&gt;If your team is considering implementing it, consider these stats and build accordingly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You'll likely see higher utilization from younger audiences, men, and users in Asia (except Japan).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://getstream.io/blog/app-monetization/" rel="noopener noreferrer"&gt;Revenue models&lt;/a&gt; will need to consider the split between your platform and its sellers, while still being attractive enough to creators that pull in viewers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On top of the core streaming and payment functionalities, you'll need to support the social features that can lead to greater sales figures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider factoring in product categories when designing your ranking algorithms to surface those that are more likely to be lucrative.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use these insights to prioritize what you build, how you monetize, and where live commerce fits into your long-term product strategy.&lt;/p&gt;

</description>
      <category>livestreamshopping</category>
      <category>statistics</category>
      <category>livecommerce</category>
    </item>
    <item>
      <title>ZEGOCLOUD Competitors – Comparing the Top 9 Alternatives</title>
      <dc:creator>Sarah Lindauer</dc:creator>
      <pubDate>Thu, 08 Jan 2026 22:56:41 +0000</pubDate>
      <link>https://dev.to/getstreamhq/zegocloud-competitors-comparing-the-top-9-alternatives-2ihd</link>
      <guid>https://dev.to/getstreamhq/zegocloud-competitors-comparing-the-top-9-alternatives-2ihd</guid>
      <description>&lt;p&gt;Real-time video has shifted from a "nice-to-have" feature to a core building block for modern apps, powering &lt;a href="https://getstream.io/video/livestreaming/" rel="noopener noreferrer"&gt;livestreams&lt;/a&gt;, virtual events, telehealth, gaming, creator tools, and on-platform communication. &lt;a href="http://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; is one of the newer but fastest-growing platforms in this space, offering a broad suite of APIs for interactive video, voice, live streaming, low-latency messaging, and AI-driven enhancements.&lt;/p&gt;

&lt;p&gt;But the real-time video ecosystem is crowded, and the right choice depends on much more than video quality. Developer experience, scale, latency guarantees, pricing transparency, global edge networks, open-source control, and built-in moderation can dramatically shape your product's safety, performance, and cost.&lt;/p&gt;

&lt;p&gt;In this guide, we compare ZEGOCLOUD to leading alternatives to help you understand how each platform approaches real-time engagement and identify the best fit for your use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  ZEGOCLOUD Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijd8byqiacuk1ezroqhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijd8byqiacuk1ezroqhy.png" alt="ZEGOCLOUD website landing page" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD is a real-time engagement platform offering &lt;a href="https://getstream.io/video/sdk/" rel="noopener noreferrer"&gt;APIs and SDKs for live video&lt;/a&gt;, voice, streaming, and in-app communication. Its focus is on helping developers add interactive features such as group calls, live commerce, virtual events, low-latency chat, AI effects, and real-time co-creation without needing to build custom media infrastructure.&lt;/p&gt;

&lt;p&gt;The platform combines low-latency video and audio with extras like cloud recording, noise suppression, smart routing, and AI-powered interactions. While ZEGOCLOUD is relatively newer compared to long-established RTC providers, its breadth of features, competitive pricing, and fast-growing ecosystem make it an increasingly popular choice for developers looking to ship real-time functionality quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of ZEGOCLOUD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broad feature coverage in a single SDK:&lt;/strong&gt; ZEGOCLOUD consolidates real-time video, voice, chat, streaming, and AI-driven enhancements into a single stack, giving teams a unified way to build interactive experiences without relying on multiple vendors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible, cross-platform support:&lt;/strong&gt; Robust SDKs for Web, iOS, Android, Unity, Unreal, Flutter, React Native, and Electron make ZEGOCLOUD accessible to teams building experiences across devices, engines, and frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-latency interaction for large audiences:&lt;/strong&gt; Built-in optimizations for live streaming, video rooms, and interactive events support large-scale use cases like &lt;a href="https://getstream.io/blog/live-commerce/" rel="noopener noreferrer"&gt;live commerce&lt;/a&gt;, virtual stages, and synchronized multi-host sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Competitive pricing and global reach:&lt;/strong&gt; ZEGOCLOUD tends to be priced lower than long-established RTC providers, with PoPs and acceleration nodes across multiple regions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-powered enhancements:&lt;/strong&gt; Features like noise suppression, background segmentation, beauty filters, and spatial audio let developers add polished, production-quality experiences without needing separate AI providers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast time to market:&lt;/strong&gt; Clear documentation, prebuilt UI components, and sample apps allow teams to prototype and launch interactive video features quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Drawbacks of ZEGOCLOUD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less proven at massive global scale:&lt;/strong&gt; While growing quickly, ZEGOCLOUD is newer than long-established RTC providers, which have been &lt;a href="https://getstream.io/blog/video-sdk-testing/" rel="noopener noreferrer"&gt;battle-tested in large enterprise deployments&lt;/a&gt; and extremely high-volume traffic scenarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited enterprise ecosystem integrations:&lt;/strong&gt; Compared with vendors like Twilio or Stream, ZEGOCLOUD offers fewer out-of-the-box integrations for compliance, analytics, CRM, or enterprise workflows. This means some teams may need to build more glue code themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smaller community and tooling ecosystem:&lt;/strong&gt; The platform doesn't yet have the same depth of community resources, third-party tutorials, UI kits, or plugin ecosystems found with competitors like Daily, LiveKit, or Stream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less transparent pricing at higher volumes:&lt;/strong&gt; Entry-level pricing is competitive, but large-scale or specialized use cases often require contacting sales, making it harder for teams to forecast costs without a direct quote.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fewer specialized capabilities for regulated industries:&lt;/strong&gt; Solutions built specifically for &lt;a href="https://getstream.io/blog/hipaa-compliant-video-api/" rel="noopener noreferrer"&gt;telehealth&lt;/a&gt;, education compliance, or financial services may require additional customization when implemented with ZEGOCLOUD.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Main Features
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwn37upii1zpeo13n9za.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwn37upii1zpeo13n9za.png" alt="ZEGOCLOUD features landing page" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD brings together real-time communication, live streaming, and AI-powered enhancements into a single SDK.&lt;/p&gt;

&lt;p&gt;Its key capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time video &amp;amp; voice:&lt;/strong&gt; Low-latency 1:1 and group audio/video calls with adaptive bitrate streaming, smart routing, and cross-platform SDKs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive live streaming:&lt;/strong&gt; Support for multi-host streaming, live commerce overlays, co-hosting, guest interactions, and large audience participation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ultra-low-latency messaging:&lt;/strong&gt; &lt;a href="https://getstream.io/blog/in-app-chat/" rel="noopener noreferrer"&gt;In-app chat&lt;/a&gt; and signaling features built for real-time collaboration, live events, and synchronized engagement experiences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-enhanced audio &amp;amp; video:&lt;/strong&gt; Built-in effects such as noise suppression, background segmentation, beauty filters, and audio optimization to improve production quality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-platform developer SDKs:&lt;/strong&gt; Comprehensive SDKs for Web, iOS, Android, Flutter, React Native, Unity, Unreal, Electron, and more—enabling consistent experiences across devices and game engines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud recording &amp;amp; playback:&lt;/strong&gt; Automatic recording of calls and streams with server-side storage, export, and playback options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalable infrastructure:&lt;/strong&gt; Global edge presence and distributed streaming architecture to support high concurrency and geolocation-aware delivery.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Use Cases
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg4972ly2uekqrxod91x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg4972ly2uekqrxod91x.png" alt="ZEGOCLOUD healthcare landing page" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Developers use ZEGOCLOUD to power real-time experiences in several key verticals. Core use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conversational AI:&lt;/strong&gt; ZEGOCLOUD's low-latency audio pipeline and cross-platform SDKs help teams build natural, human-like &lt;a href="https://getstream.io/blog/best-voice-ai-platforms/" rel="noopener noreferrer"&gt;conversational flows for AI agents&lt;/a&gt;, virtual assistants, and multimodal experiences.&amp;nbsp;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social &amp;amp; community apps:&lt;/strong&gt; Enable live rooms, video chats, audio hangouts, virtual events, and co-streaming features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Education &amp;amp; online learning:&lt;/strong&gt; Support live classes, tutoring, virtual classrooms, and collaborative whiteboarding with features like breakout rooms, screen sharing, and AI-enhanced audio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Telehealth &amp;amp; remote care:&lt;/strong&gt; Provide secure, high-quality video sessions for consultations, triage, and follow-up visits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E-commerce &amp;amp; live shopping:&lt;/strong&gt; Enable live product demos, &lt;a href="https://getstream.io/video/live-shopping/" rel="noopener noreferrer"&gt;interactive shopping events&lt;/a&gt;, and real-time buyer engagement with low-latency streaming and co-hosting features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fitness &amp;amp; coaching:&lt;/strong&gt; Power live workout sessions, 1:1 coaching, group classes, and hybrid in-person/remote experiences.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD Pricing
&lt;/h3&gt;

&lt;p&gt;ZEGOCLOUD offers à-la-carte pricing based on the specific real-time features you use. Key rates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice Call:&lt;/strong&gt; $0.99 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Call:&lt;/strong&gt; $3.99 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Streaming Video:&lt;/strong&gt; $1.49 per 1,000 minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;In-App Chat:&lt;/strong&gt; $99 for 10,000 MAU per month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI Effects:&lt;/strong&gt; $584 for two platforms per month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Super Board (collaboration tools):&lt;/strong&gt; $1.99 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud Recording:&lt;/strong&gt; $0.59 per 1,000 recording minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics Dashboard:&lt;/strong&gt; $299 per month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content Moderation:&lt;/strong&gt; Contact sales for pricing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A free trial is available across most products, and pricing can scale based on volume and additional enterprise needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Consider: ZEGOCLOUD Versus a Competitor
&lt;/h2&gt;

&lt;p&gt;Choosing between ZEGOCLOUD and another real-time video provider often comes down to how much control, scale, and ecosystem depth your product needs. Some platforms focus on global reach and enterprise reliability, while others emphasize developer experience, open-source flexibility, or specialized audio/video quality.&lt;/p&gt;

&lt;p&gt;Here are key questions to guide your evaluation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you need one vendor for multiple engagement features?&lt;/strong&gt;&lt;br&gt;
If you want video, voice, chat, interactive streaming, and AI effects under one platform, ZEGOCLOUD offers strong breadth. But if your product relies heavily on a single capability—like &lt;a href="https://getstream.io/blog/low-latency-video-streaming/" rel="noopener noreferrer"&gt;ultra-low-latency video&lt;/a&gt; or best-in-class audio—a specialized provider may deliver more depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How important is global scale and QoS?&lt;/strong&gt;&lt;br&gt;
ZEGOCLOUD performs well across regions, but long-established providers have larger, more mature global networks. For mission-critical enterprise applications, those providers may offer stronger SLAs and redundancy guarantees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you need open-source or self-hosted control?&lt;/strong&gt;&lt;br&gt;
If full ownership of media infrastructure matters, open-source options like LiveKit offer a very different control surface than ZEGOCLOUD's managed cloud stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is your team optimizing for speed of implementation or long-term flexibility?&lt;/strong&gt;&lt;br&gt;
ZEGOCLOUD's SDKs, UI kits, and quick-start flows can help you ship rapidly. Platforms like Daily, Stream, or VideoSDK also emphasize developer experience, while enterprise solutions like Twilio or Vonage require more configuration but offer stronger compliance pathways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's your budget, and how predictable should it be?&lt;/strong&gt;&lt;br&gt;
ZEGOCLOUD's pricing is competitive, but volume-based usage can make long-term forecasting tricky. Providers like Mux sometimes offer more predictable, streaming-focused models, while developer-first APIs (Daily, Stream) offer transparent pricing that's easier to estimate during prototyping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top 9 Alternatives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Stream
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc56ts4jyid73xzgmggln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc56ts4jyid73xzgmggln.png" alt="ZEGOCLOUD vs. Stream" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/" rel="noopener noreferrer"&gt;Stream&lt;/a&gt; provides real-time video, audio, and chat APIs with a strong emphasis on developer experience, in-app interactivity, and reliability at scale. Instead of trying to cover every possible engagement feature, Stream focuses on building high-quality, low-latency communication with &lt;a href="https://getstream.io/video/sdk/" rel="noopener noreferrer"&gt;clean SDKs&lt;/a&gt;, &lt;a href="https://getstream.io/chat/ui-kit/" rel="noopener noreferrer"&gt;polished UI kits&lt;/a&gt;, built-in moderation, and consistent cross-platform behavior. Product teams choose Stream when they want to embed video and chat directly into their app with minimal complexity (and maintain predictable performance as they scale).&lt;/p&gt;

&lt;h4&gt;
  
  
  Stream Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;While both platforms offer real-time video and audio, they diverge meaningfully in focus and execution. ZEGOCLOUD is built for breadth: it bundles video, voice, chat, live streaming, AI effects, and collaboration tools into a single stack. This makes it appealing for teams that want a wide range of engagement features from one vendor, especially in social, creator, or gaming apps that rely on multiple real-time components.&lt;/p&gt;

&lt;p&gt;Stream, by contrast, prioritizes depth, reliability, and developer experience. Its video and audio APIs integrate seamlessly with Stream's chat and feeds, and the platform provides polished UI kits, strong documentation, and &lt;a href="https://getstream.io/moderation/" rel="noopener noreferrer"&gt;integrated AI moderation&lt;/a&gt;. The result is a more cohesive, predictable developer workflow, which is ideal for teams that value stability and product polish over having every possible feature included by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broad set of engagement features&lt;/strong&gt;, including video, voice, chat, streaming, AI effects, and collaboration tools under one vendor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast time to market&lt;/strong&gt; with prebuilt UI, starter kits, and lower entry costs for early-stage teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versatile for social, creator, and interactive apps&lt;/strong&gt; that rely on multiple real-time features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stream Advantages:&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer-first APIs and UI kits&lt;/strong&gt; that dramatically reduce build time and complexity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reliable, low-latency infrastructure&lt;/strong&gt; designed for real-time communication at scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrated safety and moderation&lt;/strong&gt; across video, chat, and community features—ideal for apps where user trust and experience matter.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Stream Pricing
&lt;/h4&gt;

&lt;p&gt;Stream offers &lt;a href="https://getstream.io/video/pricing/" rel="noopener noreferrer"&gt;usage-based pricing&lt;/a&gt; for its Video product, with clear published rates and $100 in free monthly credits for development and testing.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Key rates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Audio:&lt;/strong&gt; $0.30 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video HD:&lt;/strong&gt; $1.50 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Livestreaming Audio:&lt;/strong&gt; $0.12 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Livestreaming HD:&lt;/strong&gt; $1.00 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enterprise plans are also available for teams that need volume discounts, higher SLAs, or custom usage patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Agora
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjobo6fxaoq8m6sv6e4oa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjobo6fxaoq8m6sv6e4oa.png" alt="ZEGOCLOUD vs. Agora" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Known for its ultra-low latency, dense worldwide edge network, and ability to handle massive concurrency, &lt;a href="https://getstream.io/blog/agora-alternatives-competitors/" rel="noopener noreferrer"&gt;Agora&lt;/a&gt; has long been the default choice for large-scale applications such as live commerce, interactive broadcasts, social audio, mobile gaming, and international video calling. Its infrastructure is built for stability at global scale, and it offers a deep ecosystem of extensions, SDKs, and enterprise-grade tooling developed over more than a decade.&lt;/p&gt;

&lt;h4&gt;
  
  
  Agora Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;Agora is designed for mission-critical global performance. Its SD-RTN architecture allows the platform to optimize packet routing at the infrastructure level, something only a handful of RTC vendors can do.&lt;/p&gt;

&lt;p&gt;For companies operating in geographically distributed markets (Southeast Asia + North America + LATAM, for example), or for apps that must stay stable in low-bandwidth environments, Agora's network-level intelligence is the primary differentiator. It's engineered to perform predictably when scale, geography, and network variability all interact at once.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, meanwhile, performs strongly in many regions but doesn't operate its own dedicated global routing fabric. Instead, its appeal lies in its developer-facing stack: modern SDKs, strong cross-platform support, and a broad set of features that help teams build interactive apps quickly.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD is a fit for teams that want accessible real-time functionality (video calls, streaming, chat, and AI effects) without navigating the complexity or cost structure of a long-established high-end RTC provider like Agora.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;All-in-one feature set&lt;/strong&gt; including video, voice, chat, AI effects, and live streaming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast integration&lt;/strong&gt; with simpler SDKs and prebuilt UI components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Competitive pricing&lt;/strong&gt; for teams shipping quickly or launching multi-feature apps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agora Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Highly mature global network&lt;/strong&gt; with industry-leading low latency and geographic coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong performance&lt;/strong&gt; for large-scale, international, or mission-critical applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep ecosystem of extensions&lt;/strong&gt; and enterprise tooling built over more than a decade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Agora Pricing
&lt;/h4&gt;

&lt;p&gt;Agora uses a consumption-based pricing model with rates varying by media type and region.&lt;/p&gt;

&lt;p&gt;Key published pricing includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; $3.99 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audio:&lt;/strong&gt; $0.99 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broadcast Streaming:&lt;/strong&gt; $0.59 per 1,000 participant minutes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enterprise discounts and custom plans are available for high-volume or specialized use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Twilio Video
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr7lgph6g8ajt7jbz3p5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr7lgph6g8ajt7jbz3p5.png" alt="ZEGOCLOUD vs. Twilio" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/twilio-video-alternatives/" rel="noopener noreferrer"&gt;Twilio Video&lt;/a&gt; is a WebRTC-based platform designed to help developers build high-quality, customizable video experiences using Twilio's global infrastructure. Twilio now emphasizes media quality (HD video, adaptive bitrate), global reliability, flexible room types, and simple SDKs rather than its broader communications ecosystem.&lt;/p&gt;

&lt;h4&gt;
  
  
  Twilio Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;Twilio is built around quality, control, and consistent global delivery. The platform provides high-definition video, simulcast, bandwidth optimization, track-level APIs, and robust infrastructure backed by Twilio's worldwide network.&lt;/p&gt;

&lt;p&gt;Developers can choose from peer-to-peer rooms, group rooms, and small-group configurations depending on performance needs. Twilio's SDKs give teams more control over media behavior than most managed RTC platforms, making it attractive for products where video experience quality is a core part of the product.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, meanwhile, focuses on end-to-end real-time engagement features rather than deep media customization alone. While it also delivers solid media quality, ZEGOCLOUD's differentiator is the range of features, cross-platform tooling, and how quickly teams can assemble complete in-app experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unified real-time engagement:&lt;/strong&gt; video, voice, chat, AI effects, whiteboarding, and live streaming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast time-to-market&lt;/strong&gt; with prebuilt UI kits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ideal for social, creator, and consumer apps with many interactive components.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Twilio Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-quality video&lt;/strong&gt; with adaptive bitrate, simulcast, and track-level control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible room types&lt;/strong&gt; (P2P, Group, Small Group) for performance tuning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong global infrastructure&lt;/strong&gt; and predictable media delivery.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Twilio Pricing
&lt;/h4&gt;

&lt;p&gt;Twilio uses metered, usage-based pricing with separate charges for media, recording, and bandwidth. Key example rates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Calling:&lt;/strong&gt; $0.004 per participant minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Transcription:&lt;/strong&gt; $0.027 per room per minute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Higher-volume and enterprise plans offer custom discounts and enhanced SLAs.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Daily.co
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmsuz5gl0yrr0quthxno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmsuz5gl0yrr0quthxno.png" alt="ZEGOCLOUD vs. Daily" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/daily-comparison/" rel="noopener noreferrer"&gt;Daily.co&lt;/a&gt; (Daily) is a modern real-time video platform built around pure WebRTC, deep browser support, and a developer experience optimized for rapid iteration. Daily's API philosophy is minimalist and flexible: it gives engineers building video products extremely granular control over layouts, tracks, permissions, and client behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  Daily.co Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;Both Daily and ZEGOCLOUD enable real-time video, but they cater to different types of builders and product environments.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD emphasizes breadth and convenience. It provides communication features and co-creation tools in one platform, giving teams a wide set of building blocks without needing multiple vendors.&lt;/p&gt;

&lt;p&gt;Daily, by contrast, is built for precision and developer control. Its APIs give teams the ability to construct highly custom layouts, control individual media tracks, shape complex multi-participant experiences, and work natively within the constraints and &lt;a href="https://getstream.io/blog/communication-protocols/" rel="noopener noreferrer"&gt;powers of WebRTC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Daily's documentation and tooling are exceptionally strong, and its product is engineered for "inherit the browser, don't fight it" — which appeals to teams building specialized collaboration or workflow-heavy products like virtual classrooms, whiteboard tools, design collaboration apps, and remote work platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;All-in-one real-time platform&lt;/strong&gt; offering video, voice, chat, AI effects, and collaboration tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster initial integration&lt;/strong&gt; with prebuilt UI kits and broad device/framework support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ideal for teams shipping feature-rich social or creator apps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Daily.co Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Granular API and track-level control&lt;/strong&gt; for building complex, custom video experiences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best-in-class WebRTC support&lt;/strong&gt; with modern tooling and developer-first documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ideal for collaboration, productivity, or workflow-driven products requiring precise control.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Daily.co Pricing
&lt;/h4&gt;

&lt;p&gt;Daily uses transparent, usage-based pricing with generous free allowances for development and prototyping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video &amp;amp; Audio:&lt;/strong&gt; $0.0015 per participant minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud Recordings:&lt;/strong&gt; $0.013 per recorded minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Streaming (RTMP):&lt;/strong&gt; $0.015 per minute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enterprise plans offer custom SLAs, volume discounts, and advanced features.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Vonage Video API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aqsgkcxe2exiznvsppz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aqsgkcxe2exiznvsppz.png" alt="ZEGOCLOUD vs. Vonage" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/vonage-comparison/" rel="noopener noreferrer"&gt;Vonage Video API&lt;/a&gt; is one of the longest-standing real-time video platforms. It's especially well-known for powering HIPAA-compliant telehealth, virtual classrooms, customer support workflows, and secure enterprise communications. Vonage's strength comes from a decade of infrastructure refinement, stable cross-platform SDKs, and deep support for compliance, interoperability, and long-running production environments.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vonage Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;While ZEGOCLOUD emphasizes speed, feature breadth, and modern developer ergonomics, Vonage is built for enterprise-grade reliability and compliance. Its SDKs are stable across browsers, mobile devices, and embedded platforms.&lt;/p&gt;

&lt;p&gt;Additionally, Vonage stands out for regulated verticals, with strong HIPAA support, SOC 2 compliance, long-term uptime guarantees, and the ability to integrate video deeply into customer support, healthcare portals, or educational systems.&lt;/p&gt;

&lt;p&gt;Vonage may require more configuration than ZEGOCLOUD, but it offers predictability, regulatory alignment, and operational maturity that enterprises rely on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broad real-time engagement suite&lt;/strong&gt; including video, chat, live streaming, and AI effects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster integration&lt;/strong&gt; and iteration for social, creator, and consumer-side apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More accessible pricing&lt;/strong&gt; for startups and rapidly evolving products.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vonage Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise and compliance-ready&lt;/strong&gt; (HIPAA, SOC 2, strong audit support).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long track record of reliability&lt;/strong&gt; across healthcare, education, and customer support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mature SDKs and backend tooling&lt;/strong&gt; built for stability and interoperability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Vonage Pricing
&lt;/h4&gt;

&lt;p&gt;Vonage offers a metered usage pricing model, with published baseline rates such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; $0.0041 per minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HLS Streaming:&lt;/strong&gt; $0.00155 per viewer minute&amp;nbsp;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enterprise packages include custom SLAs, dedicated support, and compliance-focused features.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. VideoSDK
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15yadbiq0q60ja89ttec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15yadbiq0q60ja89ttec.png" alt="ZEGOCLOUD vs. VideoSDK" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.videosdk.live/" rel="noopener noreferrer"&gt;VideoSDK&lt;/a&gt; is a modern real-time engagement platform that offers APIs and SDKs for video calling, live streaming, interactive events, and collaborative experiences. It gives teams granular control over layouts, UI behavior, live interactivity, and event-driven workflows. As such, VideoSDK has quickly gained traction among startups and SaaS products that need a customizable alternative to heavier RTC providers.&lt;/p&gt;

&lt;h4&gt;
  
  
  VideoSDK Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;VideoSDK is engineered for builders who want freedom, not just features. Its event-driven SDKs expose granular control over media tracks, participant states, permissions, live reactions, interactive widgets, and room logic. That flexibility attracts teams who want to craft video experiences that don't look or behave like out-of-the-box calling apps.&lt;/p&gt;

&lt;p&gt;For example, this might include multi-host livestreams with interactive overlays, dynamic layouts that adapt to user roles, or custom integrations with product workflows.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, by contrast, focuses on ease, consistency, and predictable UX. Its SDKs provide standardized patterns and ready-made UI components that help teams ship communication features quickly while maintaining stable performance across devices and frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provides consistent, ready-to-use interaction patterns&lt;/strong&gt; that reduce UI and state-management overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-platform SDKs&lt;/strong&gt; with predictable behavior across mobile, web, and game engines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong fit for teams building consumer-facing apps where speed and UX consistency matter.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;VideoSDK Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Highly composable SDKs&lt;/strong&gt; for teams that want to design custom video workflows and interaction models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Event-driven architecture&lt;/strong&gt; ideal for interactive apps, virtual events, and multi-host experiences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Great for developers who want control over layout, role-based permissions, and participant state logic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  VideoSDK Pricing
&lt;/h4&gt;

&lt;p&gt;VideoSDK uses transparent usage-based pricing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Calls:&lt;/strong&gt; $0.003 per participant minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audio Calls:&lt;/strong&gt; $0.0006 per participant minute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Livestreaming:&lt;/strong&gt; $0.0015 per viewer minute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enterprise plans include volume discounts, premium support, and customizable SLAs.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. LiveKit
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx97eysdys60xibvv0fu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx97eysdys60xibvv0fu.png" alt="ZEGOCLOUD vs. LiveKit" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getstream.io/blog/livekit-alternatives/" rel="noopener noreferrer"&gt;LiveKit&lt;/a&gt; is an open-source real-time communications stack that gives teams full ownership of their infrastructure. It appeals to engineering-forward organizations that want to run their own media servers, optimize &lt;a href="https://getstream.io/blog/what-is-a-selective-forwarding-unit-in-webrtc/" rel="noopener noreferrer"&gt;SFU performance&lt;/a&gt;, control routing, customize codecs, or deploy RTC workloads on-prem, in private clouds, or across hybrid environments. LiveKit is effectively an RTC engine you can tune at the network and resource level, something few providers offer.&lt;/p&gt;

&lt;h4&gt;
  
  
  LiveKit Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;LiveKit and ZEGOCLOUD approach real-time video from opposite ends of the spectrum.&lt;/p&gt;

&lt;p&gt;LiveKit is for teams that want control. It lets you control your own SFUs, choose infrastructure, reduce unit economics by optimizing compute, and build RTC as a first-class part of your architecture. It excels in scenarios where customization, latency path tuning, or cost efficiency at scale matter more than out-of-the-box features.&lt;/p&gt;

&lt;p&gt;Teams building high-load or specialized video experiences (multiplayer games, virtual spaces, or infrastructure-heavy apps) often prefer LiveKit because they want control over the entire media pipeline.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, by contrast, is for teams that want managed infrastructure and don't want to maintain media servers or worry about deployment topology, bandwidth shaping, or SFU scaling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fully managed RTC service&lt;/strong&gt; with no infrastructure to deploy or maintain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster time to production&lt;/strong&gt; without deep RTC expertise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong fit for teams focused on application features, not media server engineering.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;LiveKit Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full control&lt;/strong&gt; over infrastructure, scaling topology, and cost optimization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open-source flexibility&lt;/strong&gt; with self-hosting, multi-cloud, and on-prem options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep customization&lt;/strong&gt; for advanced RTC scenarios like multiplayer, metaverse, and real-time collaboration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  LiveKit Pricing
&lt;/h4&gt;

&lt;p&gt;LiveKit offers both self-hosted (free) and cloud-hosted options. For teams using LiveKit Cloud, pricing is organized into four tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt; — $0/month: Agent deployment, observability, global edge network, inference credits, one free telephony number, session metrics, and community support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ship&lt;/strong&gt; — Starting at $50/month: Everything in Build, plus team collaboration, instant rollback to previous deployments, and email support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scale&lt;/strong&gt; — Starting at $500/month: Everything in Ship, plus role-based access, metrics export APIs, region pinning, and security reports/HIPAA features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise&lt;/strong&gt; — Custom pricing: Everything in Scale, plus volume pricing, shared Slack channel, SSO, and enterprise-grade support SLAs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Dolby.io
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzng448yp3egaxvmp54ze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzng448yp3egaxvmp54ze.png" alt="ZEGOCLOUD vs. Dolby.io" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://optiview.dolby.com/" rel="noopener noreferrer"&gt;Dolby.io&lt;/a&gt; is a real-time media platform rooted in Dolby's decades of expertise in audio science, signal processing, and broadcast-grade media quality. Unlike most RTC providers that start with networking or communication primitives, Dolby.io starts with media fidelity, offering advanced noise reduction, spatial audio, bandwidth-adaptive enhancements, audio leveling, and AI-powered cleanup tools.&lt;/p&gt;

&lt;h4&gt;
  
  
  Dolby.io Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;Dolby.io is designed for applications where media quality itself is the product. If you're building a music collaboration tool, a fitness class with instructor voice clarity, a conferencing app that requires "studio-like" sound, or a social audio experience where voices must be crisp in noisy environments, Dolby.io's audio pipeline is unmatched.&lt;/p&gt;

&lt;p&gt;The platform's unique selling points are its audio innovations: Dolby Voice, spatial rendering, denoising, automatic gain control, audio leveling, and content enhancement APIs. Dolby.io also shines for content transformation workflows (podcast cleanup, transcription, post-production quality lifts) that go beyond live interactions.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, in contrast, prioritizes interactive features and real-time experiences rather than high-end audio post-processing. While it offers noise suppression and background effects, ZEGOCLOUD focuses more on real-time engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broad interactive capabilities&lt;/strong&gt; including video, live streaming, and co-creation tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong cross-platform SDKs&lt;/strong&gt; for mobile, web, Unity, and Unreal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better suited for social, gaming, or creator apps where interactivity comes first.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dolby.io Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best-in-class audio quality&lt;/strong&gt; powered by Dolby Voice, spatial audio, and AI enhancement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Media processing APIs&lt;/strong&gt; for post-production, cleanup, and transformation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ideal for apps where sound fidelity is central: fitness, music, conferencing, education, social audio.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Dolby.io Pricing
&lt;/h4&gt;

&lt;p&gt;Dolby.io no longer publishes detailed per-minute or per-unit pricing for its real-time or media processing APIs. Pricing varies based on usage volume, features (real-time interactivity vs. media enhancement), and enterprise requirements. Most teams will need to contact Dolby.io sales for an exact quote.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZEGOCLOUD vs. Mux
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9uwx5cckdcmfrm7xqp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9uwx5cckdcmfrm7xqp6.png" alt="ZEGOCLOUD vs. Mux" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mux.com/" rel="noopener noreferrer"&gt;Mux&lt;/a&gt; is a developer-focused video infrastructure platform built for on-demand streaming, live broadcast workflows, encoding, storage, delivery, and analytics. Rather than providing real-time video calling or interactive RTC capabilities, Mux specializes in helping teams upload, transcode, stream, and analyze video at scale with exceptional playback quality across devices and bandwidth conditions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mux Versus ZEGOCLOUD
&lt;/h4&gt;

&lt;p&gt;Mux and ZEGOCLOUD solve fundamentally different problems, even though both are used for "video."&lt;/p&gt;

&lt;p&gt;Mux is built for asynchronous and semi-live video, not real-time interaction. Its strength lies in its video pipeline: &lt;a href="https://getstream.io/glossary/adaptive-bitrate-streaming/" rel="noopener noreferrer"&gt;adaptive bitrate streaming&lt;/a&gt;, global CDN delivery, high-efficiency encoding, thumbnail generation, playback analytics, viewer QoE metrics, and rock-solid reliability for large video libraries.&lt;/p&gt;

&lt;p&gt;If your product requires uploading video-on-demand content, providing high-quality playback across devices, or running broadcast-style live streams that reach thousands or millions of viewers, Mux is one of the strongest solutions on the market.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD, in contrast, is built for real-time interaction. Think live video calls, multi-host events, interactive streaming, voice chat, and low-latency experiences where participants communicate with each other in the moment. While it supports live streaming, its strengths are in two-way or many-way communication, in-app engagement, and interactive features (co-hosting, AI effects, audience participation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZEGOCLOUD Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Purpose-built&lt;/strong&gt; for real-time video, audio, chat, and interactive live streaming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supports multi-user, low-latency experiences&lt;/strong&gt; and in-app engagement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong for social, creator, and communication-heavy applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mux Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best-in-class video pipeline&lt;/strong&gt; for uploading, encoding, and streaming on-demand or broadcast-style content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rich video analytics&lt;/strong&gt;, playback optimization, and viewer experience tooling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ideal for products with large VOD libraries or large-scale streaming needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Mux Pricing
&lt;/h4&gt;

&lt;p&gt;Mux offers three pricing options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free&lt;/strong&gt; — $0/month: 100,000 monthly delivery minutes, up to 10 stored videos, on-demand only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pay as You Go:&lt;/strong&gt; 100,000 delivery minutes before usage credits apply, no storage limits, supports on-demand and live video, plus a $20 monthly usage credit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pre-Pay Plans:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Launch: $20/month for $100 in credits&lt;/li&gt;
&lt;li&gt;  Scale: $500/month for $1,000 in credits&lt;/li&gt;
&lt;li&gt;  Both include 100,000 free delivery minutes per month.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Enterprise pricing is available for high-volume needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives Comparison Chart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Core Strength&lt;/th&gt;
&lt;th&gt;Deployment Model&lt;/th&gt;
&lt;th&gt;Pricing Transparency&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ZEGOCLOUD&lt;/td&gt;
&lt;td&gt;Unified real-time engagement (video, voice, chat, streaming, AI effects)&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Moderate (published rates for most products)&lt;/td&gt;
&lt;td&gt;Multi-feature social, creator, or interactive apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream&lt;/td&gt;
&lt;td&gt;Developer experience, polished UI kits, built-in moderation&lt;/td&gt;
&lt;td&gt;Managed cloud APIs&lt;/td&gt;
&lt;td&gt;High (clear usage-based pricing)&lt;/td&gt;
&lt;td&gt;In-app communication with reliable real-time video and chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agora&lt;/td&gt;
&lt;td&gt;Global SD-RTN network with exceptional reliability at scale&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High-concurrency, multi-region real-time apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio Video&lt;/td&gt;
&lt;td&gt;Flexible WebRTC architecture with track-level control and HD video&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Healthcare, fintech, and enterprise communication workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily.co&lt;/td&gt;
&lt;td&gt;WebRTC-native control, granular composability&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Collaborative tools, custom video UIs, productivity platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vonage Video API&lt;/td&gt;
&lt;td&gt;Compliance, long-term stability, regulated industries&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Telehealth, education, customer support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VideoSDK&lt;/td&gt;
&lt;td&gt;Highly composable SDKs and event-driven interactivity&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Custom real-time experiences and interactive live shows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveKit&lt;/td&gt;
&lt;td&gt;Open-source ownership + infrastructure-level control&lt;/td&gt;
&lt;td&gt;Self-hosted or managed cloud&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Teams needing infra control, hybrid/on-prem RTC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dolby.io&lt;/td&gt;
&lt;td&gt;Media fidelity, audio enhancement, post-processing&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Apps where audio quality is the product (fitness, music, conferencing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mux&lt;/td&gt;
&lt;td&gt;Video pipeline for VOD + broadcast streaming&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Platforms focused on on-demand content and large-scale streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Is ZEGOCLOUD Right For You?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD is a strong fit for teams that want to build interactive, consumer-facing real-time experiences without managing RTC infrastructure themselves.&lt;/p&gt;

&lt;p&gt;However, it's not the only approach to real-time video. If your priorities lean toward global reliability at massive scale, enterprise compliance, open-source ownership, or advanced audio fidelity, other providers may offer a better match. Platforms like Stream, Agora, and LiveKit each deliver deeper specialization in areas where ZEGOCLOUD is intentionally more general-purpose.&lt;/p&gt;

&lt;p&gt;Most of the competitors in this guide &lt;a href="https://getstream.io/try-for-free/" rel="noopener noreferrer"&gt;offer free tiers&lt;/a&gt; or trial credits, making it easy to evaluate the experience firsthand. The right platform ultimately depends on whether you need versatility for interactive features or precision for a specific kind of real-time workload.&lt;/p&gt;

</description>
      <category>zegocloud</category>
      <category>videoapi</category>
      <category>mobileappapi</category>
      <category>videotool</category>
    </item>
  </channel>
</rss>
