Public Telegram, X, Reddit, and Discord channels, groups, and community posts that ordinary web crawlers never index. Pay per call with x402 or MPP — no API keys, no signup.
curl {BASE_URL}/v1/telegram/search?q=coffee
Protocol
One platform per call — the platform is part of the path
(/v1/{platform}/...). Fan out client-side for cross-platform search.
e.g. GET /v1/telegram/search. Without payment you get HTTP 402 with the payment
requirements — price, network, receiving address.
Use either supported protocol. Your client pays the micropayment and retries automatically — no manual step.
Newest-first where the platform supports it, with permalinks back to the original post.
Pricing
Each call has a fixed USD price. Supported payment protocols are advertised in /openapi.json under
x-payment-info — that document is the source of truth, never hardcode a price.
# x402 — pay with a funded Base wallet
import { wrapFetchWithPayment } from "x402-fetch";
const fetchWithPay = wrapFetchWithPayment(fetch, walletClient);
const res = await fetchWithPay("{BASE_URL}/v1/telegram/search?q=coffee&limit=20");
const data = await res.json();
# MPP / Tempo — agents discover both protocols via /openapi.json
# and pay over Tempo using the "Payment" auth scheme.
const res = await fetch("{BASE_URL}/v1/telegram/search?q=coffee", {
headers: { "Accept-Payment": "mpp" }
});
Reference
Backed by Telegram's own built-in message search — no separate index to go stale.
Search messages globally or within specific chats.
| Param | Meaning |
|---|---|
q / query |
Required phrase search query. Provide exactly one. |
from / to |
Time bounds — ISO-8601 (2026-06-01T00:00:00Z) or relative (now-7d).
to defaults to now.
|
limit |
Max results, 1–100 (default 20). |
cursor |
Opaque continuation token from a previous response's next_cursor. |
filter[chat] |
Restrict to one channel (eq, shorthand) or several (filter[chat][in][]=...,
max 20), by username without @. |
filter[message_type] |
One native Telegram message filter, e.g. photo, url, voice. See
/openapi.json for the full enum.
|
# Recent messages mentioning "coffee"
GET /v1/telegram/search?q=coffee
# Same, last 7 days only
GET /v1/telegram/search?q=coffee&from=now-7d
# Restrict to one channel
GET /v1/telegram/search?q=coffee&filter[chat]=somechannel
# Multiple channels, links only
GET /v1/telegram/search?q=coffee
&filter[chat][in][]=channel_a
&filter[chat][in][]=channel_b
&filter[message_type]=url
Search posts across public Telegram channels using Telegram's built-in global post
search, not limited to a predefined set. Accepts only q/query, limit,
and cursor — no from/to or filters. Priced higher per call than
/search to cover the broader scan.
GET /v1/telegram/search/public-posts?q=coffee&limit=20
Accept: text/plain to either endpoint for a human-readable rendering instead of
JSON.Reference
How long has this brand existed, where does it actually appear, and is the audience real? Four endpoints answer that from public sources — X, the Wayback Machine, RDAP and GitHub — and every claim comes back with the sources it rests on.
Buy one question or the whole picture. Each rung is a separate endpoint at its own price — nothing is bundled, and a cheap rung is the same answer the full report would have given for that block.
| Endpoint | What it answers | Price |
|---|---|---|
/v1/footprint/age |
When the subject first appeared online, and whether the presence since then is continuous. Dated anchors, gap years, and a warning when the domain long predates the identity using it. | — |
/v1/footprint/mentions |
Which surfaces carry the subject at all, each with a link and a first-seen date, plus which surfaces cross-reference each other. | — |
/v1/footprint/audience |
Whether the visible reputation is organic or manufactured — author concentration and author account age, the two axes a bought audience cannot fake at once. | — |
/v1/footprint/report |
All three at once plus a headline verdict, with every claim carrying its sources. | — |
Which sources a call spends is decided by the rung, not by the caller: the price of a rung is the set of sources it buys, so there is no parameter that drops one.
| Param | Meaning |
|---|---|
q / query |
Required. The subject: a domain, a handle, or a brand or person name. Provide exactly one. |
filter[type] |
brand or person — changes which anchors and which provenance are
believable. |
filter[lang] |
BCP-47 tag. Shifts source weighting; Telegram carries Russian-language activity that X does not. |
# Full report on a domain
GET /v1/footprint/report?q=polymarket.com
# Just the age question, for a fiftieth of the price
GET /v1/footprint/age?q=polymarket.com
# A person, with Russian-language sources weighted in
GET /v1/footprint/report?q=pavel+durov
&filter[type]=person
&filter[lang]=ru
established, emerging, thin, absent
— or insufficient_data. That last one is the point: finding nothing is only reported as
absent when enough independent sources answered to make silence mean something. When they did
not, the report says so instead of guessing. Accept: text/plain works here too.
No payment required
The live list of supported platforms, endpoint paths, and exactly which controls and filters each accepts.
GET /openapi.jsonOpenAPI 3.1 spec with x402 + MPP payment metadata, for agent discovery. Revalidate with ETag.
Download the agent skill (Markdown) to drop into your agent.
GET /healthLiveness check.
400 (with a docs link to the current contract) at no cost. Upstream rate
limits return 429 with Retry-After.