Builders Program

Build with us for a whole month. Unlimited usage and add-ons, weekly calls and your own Slack channel.

Learn more
Polymorfa

Command Palette

Search for a command to run...

UI kits

Prebuilt UI, already wired to the API

Drop a full inbox, chat, template builder or call screen into your app. Each component talks to Polymorfa with a short-lived client token, so your API key stays on your server.

React components
21
Web Components
9
Server route behind all of them
1
Longest client token lifetime
15 min

Components

Every screen, ready-made.

Use the whole inbox or take the parts you need. Each one reads and sends through Polymorfa, with keyboard support and loading, empty and failure states built in.

One component, the whole inbox. Inbox renders the conversation list, the chat, the composer and a contact panel. Use it whole or take the parts.
Inbox and conversation list. Search, unread, draft and archive filters, pinned chats and keyboard navigation. Inbox adds the chat and a contact panel for your own CRM fields.
Chat window and drawer. Date separators, reply quotes, delivery receipts and Retry on a failed send. Show it inline or as a drawer beside your own screens.
Composer. Photos, videos, audio and documents by picker, paste or drop. Voice notes, emoji and quick replies on a slash.
Template builder. Standard, carousel, authentication and limited-time-offer templates with a live preview. Saving a draft and submitting to Meta stay separate.
Connect button and status. The button opens Polymorfa's hosted QuickLink page, so pairing never runs inside your app. The status badge offers Retry after a failure.
Calls. CallButton places a call and CallSurface handles ringing, video, devices and a pop-out window. Plain HTML uses <pmfa-call>.

Browser-safe

Safe to run in the browser.

Your server decides what each signed-in user may do. The browser only ever holds a client token for one number, and the API checks every request against it.

Your server mints the token. Your route signs the user in and returns a client token that expires within 15 minutes. The API key never leaves your server.
Controls a token does not allow stay hidden. Without send_message the composer is gone, not greyed out. Development builds name the missing permission once; production logs nothing.
Rules the API enforces. Limit recipients, origins and daily volume per number. In conversation mode a token can only reply to people who wrote within the window, 24 hours unless you change it.

In your code

One provider, one route, one component.

Mount the inbox, grant access on your server, use it without React, then match your design.

app/support/inbox.tsx
"use client";
import { Inbox, PolymorfaProvider } from "@polymorfa/react";

export function SupportInbox() {
  return (
    <PolymorfaProvider tokenEndpoint="/api/polymorfa/token">
      <Inbox />
    </PolymorfaProvider>
  );
}

Your design

Looks like your product.

Set colors, fonts, spacing and radius once. Every component follows them in light and dark themes.

Light and dark from one appearance. Set your primary color and a dark override. The system theme follows each visitor's setting.
Style any slot. Add your own class to any part, style Web Components with ::part(), or turn off the bundled styles and write your own. Your CSS always wins.
Your words, any direction. Replace any string with your own translation. Missing strings fall back to English, and right-to-left layouts follow the locale.

Every frontend

One kit for every frontend.

The same components and permissions in the framework your team already uses, from React to server-rendered HTMX.

Your framework, your language. React and Web Components in TypeScript, Blazor in C#, Leptos in Rust, Livewire in PHP, and Django or templ with HTMX.
The kit behind the Console. Chats in the Polymorfa Console is built from the same conversation list and chat window you install.

API surface

What the components call.

Components call one route on your server, which calls Polymorfa with your key. Sends and calls go straight to the API with the client token.

Your server route

  • POST/api/polymorfa/tokenMint a client token for the signed-in user
  • GET/api/polymorfa/history/conversationsConversations the grant allows
  • GET/api/polymorfa/history/conversations/{id}/messagesOne thread, 404 outside the grant
  • GET/api/polymorfa/eventsLive updates as server-sent events
  • POST/api/polymorfa/connectCreate a QuickLink for the connect button
  • POST/api/polymorfa/templatesList, save and submit templates

Polymorfa API

  • POST/platform/client-tokensMint a token for one number
  • PUT/platform/sessions/{session}/client-rulesSet what tokens for a number may do
  • POST/messaging/{number}/messages/sendSend from the composer
  • POST/messaging/quicklinksCreate the hosted pairing link
  • Eventmessage.receivedNew messages reach the inbox
  • Eventmessage.ackDelivered and read receipts

Start with a free number

Your first real number is free. Add more numbers on Pay-As-You-Go.