
A pattern for live lead research on the Photon iMessage API, with TinyFish
Photon is API infrastructure for agent messaging. We make it possible for AI agents to hold real conversations inside iMessage, WhatsApp, Telegram, and the other channels people already use, instead of asking anyone to download another app. The core is open source on GitHub, and everything is documented in the Photon docs.
This post walks through one pattern you can build on the Photon iMessage API: live research on the person you’re about to text, surfaced inside the thread before anyone replies. We run this pattern for our own outreach, with TinyFish handling the web research. TinyFish wrote up our setup from their side in How Photon Built Live Lead Research Directly Into iMessage With TinyFish. This is the builder’s view: what the pattern needs, how to split the work, and what we’d tell anyone building it.

Why texting needs research first
iMessage converts because it reads as a real person. SMS blasts get ignored; an iMessage thread gets read and answered. In our own outreach we see 60%+ better response than traditional SMS.
That same personal quality is what makes a bad first message expensive. When an AI agent or a rep opens the thread, there’s no second chance to recover from a generic or wrong opener. And inbound leads, like a form fill or an ad click, are worth reaching in minutes, not hours. Whoever sends the first message usually has a name, maybe a company, and nothing else. Looking someone up by hand takes long enough that the moment is gone.
So the first requirement of this pattern: research that’s ready before anyone starts typing.
The hard part is the right person
Names aren’t unique, and many research tools collate profiles by name. Two people share one, you pull the wrong profile, and the opener lands with the wrong job title at the wrong company, to someone who now knows exactly what’s happening.
Research that confidently returns the wrong person is worse than no research at all, because whoever reads it will believe it and use it. That’s the second requirement, and it ends up shaping more of the design than speed does.
Split the work: messaging layer, web layer
The pattern has two layers, and they’re worth keeping separate.
Layer | Owns | In our build |
|---|---|---|
Messaging | Sending and receiving, thread state, agent replies, handoff to a human | Photon iMessage API |
Web research | Resolving who the person is, finding role, company, and social links, keeping sources attached | TinyFish TinySearch, TinyFetch, and TinyAgent |
Lead record | Where research lives so it travels with the conversation | Stored against the lead, not the device |
Messaging is what Photon does. Crawling, extraction, and coverage across LinkedIn, X, GitHub, and the open web is a different problem, and owning it ourselves would have meant building something we don’t sell. With TinyFish, TinySearch finds current sources, TinyFetch turns those pages into clean content, and TinyAgent handles the deeper lookup when someone wants the full picture. That let us ship a personalization layer on top of messaging that we otherwise wouldn’t have.
Research at two depths
Opening a thread and preparing for a call need different things, so the pattern surfaces research twice.
The five-second scan. When the thread opens, role, company, and social links are already there, plus a tap-to-send opener written in the lead’s own context. Enough to start without leaving the conversation.
The one-tap deep dive. A full brief with sources attached: current role and location, career history, education, public profiles, and notes that separate this person from others who share their name.
Splitting them keeps the thread fast to open while the full picture stays one tap away. And because the research is stored against the lead, switching phones or handing the conversation to a colleague brings the brief along with the thread.
Designing for being wrong
A person will trust what’s in front of them. So the brief can’t just say “Head of Growth at Acme.” It has to say where that came from, and when other people share the name, it has to say so and roughly who they are. That’s the difference between research someone can check and research they have to take on faith.
If you’re building this
Have research ready before the first message. Personal beats fast, but you need both. A generic opener wastes what makes iMessage work; a slow personal one misses the window.
Treat sources as the product. A name and a title with nothing behind them is a guess with good formatting. Attaching a source to every claim is what turns a brief people read into a brief people use.
Attach research to the lead, not the device. Conversations get handed off constantly. If the context doesn’t travel with the thread, it’s lost at the first handoff.
Where this goes next
The pattern works anywhere knowing who you’re contacting carries the conversation. We’re taking it into more verticals next, starting with real estate. We also want to bring it to WhatsApp, where TinyFish has strong coverage in Southeast Asia. The research problem stays the same; the channel and the region change what good coverage looks like.
Build it yourself
Start with the Photon docs and the Photon GitHub for the messaging layer, and the TinyFish docs for the web layer.
For the story of how we set it up, read TinyFish’s write-up.


