spectrum-ts). Both give an AI agent two-way conversations on messaging apps. They are built differently: Spectrum is an open-source TypeScript SDK with an optional managed cloud, and Flow is a hosted HTTP API with SDKs on top.
TL;DR
Choose Photon if
- You want to self-host, or run on your own Mac. Spectrum is open source and runs without Photon’s cloud. Its local iMessage mode reads the Messages database on your own Mac and needs no project credentials (source, Oct 2026).
- You need WhatsApp, SMS, voice or Slack today. Flow’s WhatsApp is not live yet, and Flow has no SMS yet; Photon’s plans include RCS and SMS fallback (source, Oct 2026). Photon describes itself as an official Meta Business Technology Provider (source, Oct 2026), and the
spectrum-tsREADME lists a Slack provider (source, Oct 2026). - You need iMessage groups, polls or cold outreach. Photon says iMessage is where Spectrum is most mature, with groups, effects and per-line routing (source, Oct 2026). It can send polls (source, Oct 2026), and its Business plan supports cold outreach to up to 50 new contacts a day per line (source, Oct 2026). Flow’s iMessage line is replies only, and Flow conversations are one-to-one.
- You write TypeScript and want streaming built into the SDK.
text()takes an OpenAI, Anthropic or AI SDK stream. On iMessage (remote mode) it edits the message in place; on Telegram private chats it shows a native draft preview (source, Oct 2026). - You build on the Vercel Chat SDK. Photon publishes an iMessage adapter for it (source, Oct 2026).
- You need a compliance statement now. Photon’s homepage states it is SOC 2 Type II compliant (source, Oct 2026). Flow does not publish a compliance certification.
Choose Flow if
- Your agent is not written in TypeScript. Every operation is plain HTTP and JSON with an OpenAPI 3.1 spec, so Python, Go or any other language works today, without waiting for an SDK.
- You want a durable event log. Webhooks are retried for 3 days and arrive in order per conversation; after that the events stay in the log, and
GET /v1/events?after=...or the live stream replays them. See Events and webhooks. - Duplicate messages would hurt. Every
POSTtakes anIdempotency-Key, so a retried request never sends twice (Idempotency), and replies sent in a webhook answer use the event’s ID as their key. - You want channel rules enforced for you. Every send passes one send gate. Nothing is converted silently: content a channel cannot show fails with
422 unsupported_content, or goes as thefallbackyou chose, and the message reports what was shown. - You want errors an agent can act on. Every error has a closed
type, ahintfor this case and adoc_url(error types). - A coding agent should be able to start on its own.
POST /v1/sandbox/keysreturns a test key with no account, and the shared Telegram sandbox bot is ready to use (Keys and sign-in). The project owner can also add Flow’s hosted MCP server to their coding tools, so the agent can send a real test message and see what the webhook answered. - You don’t want to hold channel credentials. Flow hosts the senders: the sandbox bot, or your own Telegram bot connected once with its token.
Same task: receive a Telegram message and reply
Photon (spectrum-ts), from Photon’s Telegram setup page (source, Oct 2026). This example runs the app.messages loop in a long-lived process; with projectId and projectSecret (cloud mode) the provider registers the bot’s webhook on startup. Spectrum can also receive over HTTP instead (see below).
Photon (spectrum-ts)
crypto, so the same shape works in any language without an SDK. The bot is Flow’s sandbox bot, or your own bot connected with POST /v1/senders; Flow holds the token and receives Telegram’s webhook.
Flow (HTTP, no SDK)
whsec_... signing secret, shown once):
- Where the process runs. Both can run as a webhook. Spectrum has the
app.messagesloop for a long-lived process and a webhook mode, which Photon describes as “Receive messages via HTTP instead of a long-lived process”:app.webhook()handles aPOSTroute, with first-party adapters for Hono, Express and Elysia (source, Oct 2026). Flow’s handler is a stateless webhook in any language, and Flow also offers a stream (GET /v1/stream) for long-running workers and local development. - What happens when your server is down. Flow keeps retrying for 3 days and keeps every event in the log for replay. Photon’s stable webhooks make up to 6 attempts within a default backoff budget of about 30 seconds, which the Photon team can tune; there is no dead-letter queue, and for zero loss Photon recommends reconciling against its API (source, Oct 2026). Photon’s Beta API contract adds webhook destinations with a retry budget, manual retry and dead-lettering (source, Oct 2026).
- Who holds the bot token. With Flow, you send the token once to
POST /v1/sendersand never handle it again. With Spectrum on Telegram, your process holds it.
Details
Channels
- Flow today: Telegram is live, on the shared sandbox bot or your own bot (self-serve once you sign in). iMessage is live for replies: the person writes first, and lines are arranged with the Flow team. WhatsApp is coming: Flow is waiting for Meta’s approval. See Channel guides.
- Photon today: iMessage, WhatsApp Business, Telegram, terminal and SIP voice in its stable docs (source, Oct 2026), with RCS and SMS fallback on its Free, Pro and Business plans (source, Oct 2026). Its Beta send endpoint adds SMS and email (source, Oct 2026). Photon covers more channels than Flow does today.
Channel rules
- WhatsApp window. Flow’s gate refuses free-form content more than 24 hours after the person’s last message with
409 outside_window, and the agent sends a template instead. Photon’s low-level WhatsApp kit documents templates as the only way to send outside the window (source, Oct 2026). (Flow’s WhatsApp is coming.) - iMessage limits. Photon documents 50 new conversations started per line per day (source, Oct 2026). Flow’s iMessage line is replies only, so the gate refuses a message to someone who has not written to the line.
- Unsupported content. Spectrum no-ops some features silently (a reply on a platform without replies is not sent as a regular message) (source, Oct 2026), degrades others (markdown reaches platforms without native formatting as readable plain text) (source, Oct 2026), and surfaces provider-specific constraints as an
UnsupportedError(source, Oct 2026). Flow never converts silently: it refuses with a typed error, or sends yourfallbackand reports what was shown indelivered_as(Content types).
Status of Flow items marked coming
- WhatsApp: waiting for Meta’s approval.
- Python and Go SDKs: not written yet; use the HTTP API.
- docs.flow.engineer: not deployed yet. Until then, the API serves llms.txt, the agent quickstart and the OpenAPI spec.
Related
- Choosing a messaging API for your AI agent: Flow, Photon, the Telegram Bot API, Twilio and iMessage APIs side by side.
- Quickstart and Keys and sign-in.