Give your customers an expert by their side

Marlin embeds in one script tag. Users talk, the agent reads your UI, highlights what to click, and responds out loud — no chat widget required.

New to Marlin? Create a free account — or tap Ava in the bottom-right to try it on this page.

1 script tag

to embed on any site

WebRTC

speech in and out

Page-aware

highlights & guidance

index.html
<!-- Add before </body> -->
<script
  src="https://cdn.onmarlin.com/widget.js"
  data-project="pk_live_your_project_key"
  async
></script>

Understands your page, then acts on it

Marlin sends the agent a pruned accessibility tree with numbered element indices. The agent uses those indices to highlight, scroll, and guide — out loud.

  • Page context

    Reads the live accessibility tree — roles, labels, values, and states — so the agent always knows what's on screen.

  • Element highlighting

    Pulses a highlight on the exact element to click. Spoken guidance stays in sync with what users see.

  • On-demand snapshots

    Captures a JPEG when the DOM isn't enough — charts, canvas content, and visual layouts.

page-context.jsonlive
[12]Submit order
buttondisabled
[13]Email
textboxrequired
[14]Shipping policy
link
[15]Voice sessions chart
canvasvisual

Realtime voice

Speech in and out over WebRTC. Users talk naturally and hear answers immediately.

Private by design

Ephemeral API keys, no screen-share prompt, in-memory state only.

Framework-agnostic

Scope the widget to any element. Works on static sites, SPAs, and multi-page apps.

analytics — voice sessionssample data

Sees charts and canvas when the DOM falls short

Canvas and chart content isn't in the accessibility tree. Marlin captures a snapshot on demand, so the agent can describe trends and visual state — not just buttons and links.

Example response

“Voice sessions climbed through Q2 — June hit 91k. Want me to highlight the export button?”

Ask Ava about the chart on this page to see it in action.

Three steps to production

Copy the install snippet above, add a token endpoint on your server, and Marlin handles the rest.

01

Embed the script

Add the Marlin widget before </body> with your project key. The script handles the rest.

02

Mint ephemeral keys

Expose POST /api/session on your server. Never ship your OpenAI key to the browser.

03

Ship voice guidance

Users talk, Marlin reads the page, highlights elements, and responds out loud.

app/api/session/route.tsView live endpoint →
// POST /api/session → ephemeral Realtime API key
export async function POST() {
  const session = await openai.realtime.sessions.create({
    model: "gpt-realtime-2",
  });
  return Response.json(session.client_secret);
}

Voice guidance, not another chat widget

Traditional support bots answer in a sidebar. Marlin reads your page, highlights elements, and guides users out loud.

CapabilityMarlinIntercomDriftZendesk
Real-time voice (speech in / out)YesLimitedNoNo
Live page & DOM awarenessYesNoNoNo
On-screen element highlightingYesNoNoNo
One-script embed installYesPartialPartialPartial
No screen-share permissionYesNoNoNo
Text chatOut of scopeYesYesYes

Pricing

Start free, scale with usage

No credit card to install. Upgrade when traffic grows.

Starter

Try Marlin on a single site.

$0/mo

  • 500 voice minutes / month
  • 1 site
  • Page awareness & highlights
  • Community support
Get started
Popular

Growth

For teams running voice guidance in production.

$99/mo

  • 5,000 voice minutes / month
  • Visual snapshots
  • Usage analytics
  • Custom voice
  • Email support
Get started

Enterprise

For orgs with security, scale, and SLA requirements.

Custom

  • Unlimited minutes
  • SSO & audit logs
  • Custom SLAs
  • On-prem token service
  • Dedicated support
Contact sales

Ready to add voice to your site?

Copy the snippet, wire up your token endpoint, and ship. Ava can walk you through anything you get stuck on.