Syften Documentation

Quick Start

Syften is configured as a set of filters. A filter is a search rule: the words, phrases, domains, authors, sites, and exclusions that decide whether an incoming post or comment is interesting. Add one filter per thing you want to watch, such as your product name, a competitor, a domain, or a buying-intent phrase. Syften checks new items from supported communities against those filters and sends matches to your configured destinations.

Start with simple filters and preview the matches. If a filter is too broad, make it more specific: restrict it to one community with site:, watch only posts or comments with type:, follow a specific account with author:, require a language with lang:, or use $accept: as an AI post-filter. After the matching rules are right, configure delivery. Tags let different filters send matches to different Slack channels, email addresses, RSS feeds, API clients, or webhooks.

Reference

syftenthe word "syften", "Syften" or "SYFTEN" (case insensitive)
google appleposts mentioning both of these keywords, in any order
"my podcast"the phrase "my podcast"
example.commentions of this domain, its subdomains, and common obfuscated forms like example[.]com
site:reddit.com/r/saas/posts on the /r/saas subreddit. Multiple site: operators can be used, and will be logically ORed
plug*"plugin", "plugins", "plug"...
"good plug*"same as above, but for phrases. The star can only be placed at the beginning or end of the entire phrase
beer NOT rootthe word "beer", but not if "root" is also mentioned
title:domain title:nameposts with a title that includes both the words "domain" and "name"
title:"domain name*"posts with a title that includes the phrases "domain name", "domain names" etc
type:postposts, i.e. the items that create new threads
type:commentcomments, i.e. replies to posts
`fmt.Printf("hi!")`this exact string, without ignoring special characters. These are backticks, not apostrophes
author:user1 author:user2posts by user1 or user2. Best used together with site:
replyto:someuserreplies to this user. Use in conjunction with site:. This doesn't work for all communities
$tag:sometagfor use with multiple email addresses and Slack channels (legacy tag:sometag is also supported)
lang:enposts in English. See detailed explanation below
// blah blah blaha comment

Literal text matching

By default, Syften uses fuzzy matching. For example, the filter "cat and" will match text like I bought a cat, and so... and I have a cat and a dog, but not I had a copycat and he.... That is because special characters are ignored and word boundary logic is applied.

The same applies to punctuation inside keywords. The filter a,b-c will match, among other things, the text A... b!c. This is what you would expect from a Google search.

However, Syften is not Google and does not need to instantly search through terabytes of data. We're only filtering once, through live data, delivering the matches and discarding the rest. This allows us some more CPU-heavy operations, like matching special characters. If you want to match special characters, as a text editor search would, surround your filter with backticks, like so: `a,b-c`.

The archive does not support the literal text matching operator.

Domain name matching

Domains are treated specially. A positive domain keyword like example.com or "example.com" will match things like example.com, www.example.com, and example[.]com, but not plain prose like example com or unrelated longer domains like someother-example.com.

Bare domains are usually the simplest choice, but the extra handling applies to positive quoted domains too. That extra handling does not apply to negated domains. A negated filter like NOT example.com behaves like an ordinary fuzzy negation, so it can also exclude things like example com or someother-example.com.

The site: operator

The site: operator performs a case-insensitive substring match on the URL of the matched item. Of course, the site must be one of the communities Syften supports.

It is usually best to end the site with a trailing slash. Otherwise the results might be surprising. For example, site:reddit.com/r/cat will also match URLs such as reddit.com/r/catapult. In this example, the proper syntax would be: site:reddit.com/r/cat/.

Multiple site: operators can be placed on one line, and they will be logically ORed together. For example, you can match several subreddits with:

site:reddit.com/r/saas/ site:reddit.com/r/startups/ site:reddit.com/r/EntrepreneurRideAlong/

Language detection

For language detection, we use the whatlanggo library. We reject posts only if the detector marks the result as reliable (confidence greater than 0.8). If you specify lang:en, but the library stays below that confidence, we will still deliver it to you. This is because language detection is often inaccurate for short posts, and we don't want you to miss anything important.

Supported languages are: ar, bn, cs, da, de, el, en, es, fa, fi, fr, he, hi, hu, id, it, ja, ka, km, kn, ko, ml, my, nb, nl, nn, or, pa, pl, pt, ro, ru, si, sv, ta, te, th, tr, uk, vi, zh.

Examples

Get mentions about Mailchimp but avoid utm-tagged links

mailchimp NOT `?utm_source=mailchimp`

Topics related to security on Hacker News

site:news.ycombinator.com type:post title:secur*

It's OK to listen to common dictionary keywords as long as you narrow down the search to specialised communities

site:reddit.com/r/msp site:mspvendor.slack.com windows

Questions about Wordpress themes, but not links to other themes

"wordpress theme*" `?` NOT `https://`

Monitor a domain directly. Bare domains match the domain itself, subdomains, and common obfuscated forms, without matching ordinary prose that only happens to contain the same words

example.com

How I monitor my own tool (Syften is a dictionary word in Swedish)

syften NOT lang:sv

Tags

$tag:customers is Syften metadata used for delivery routing. Tags are not searchable terms by themselves.

Use tags when you want to organize filters or route different matches to different email addresses and Slack channels. Multiple tags are allowed on the same filter, and tags are normalized to lowercase.

You can use tags to:

  • send different results to different Slack channels
  • send different results to different email addresses
  • create separate RSS feeds for different groups of filters
  • distinguish results in the API

Example: Reddit agency

// client a
filter1 $tag:clienta
filter2 $tag:clienta

// client b
filter3 $tag:clientb
filter4 $tag:clientb

Example: Route by teams

You can create a separate Slack channel and send all posts made by teammates there, so that the rest of the team can quickly see them and upvote when appropriate.

// our company
ourcompany.com $tag:brand

// competitors
competitor1.com $tag:competitor
competitor2.com $tag:competitor

// upvotes
author:myself author:teammate1 author:teammate2 $tag:upvotes

AI Filtering

After a filter matches an item, Syften can run an additional AI accept/reject check before notifications are sent.

AI filtering is available on the Standard and PRO plans.

AI filtering only applies to Slack and email notifications. The archive, API, and www views still show every match, but API responses include the AI verdict fields so you can consume them programmatically.

Use $accept:"..." inside a filter to define a per-filter accept rule. Keep the prompt simple and robotic, using the tried-and-tested format: "true if ...; false otherwise".

Use $brand:"..." as an optional brand hint for sentiment accuracy. For potentially confusing text like "I love X but hate Y", $brand:"X" makes it clear which brand sentiment should focus on.

Per filter, only one $accept:"..." and only one $brand:"..." is allowed. Using more than one of either is an error.

If a filter has no $accept:"...", no AI analysis is performed.

Example:

syften $accept:"true when the post mentions Syften (syften.com) the product, even briefly; false otherwise." $brand:"Syften"

Caveat

Using "true only when the post is about Syften (syften.com) the product; false otherwise." will reject posts that mention Syften, but are not primarily about it.

Be robotically explicit and use this pattern instead: "true when the post mentions Syften (syften.com) the product, even briefly; false otherwise."

Variables

If you need to manage multiple filters, you can make your life easier with variables.

Variable names must start with an uppercase letter; the remaining characters may be letters, digits, or underscores.

For example:

SOMEVAR=site:reddit.com/r/startups/ site:news.ycombinator.com
SOMEOTHERVAR=author:user1 author:user2

filter1 ${SOMEVAR}
filter2 ${SOMEVAR}
filter3 ${SOMEVAR}
filter4 ${SOMEOTHERVAR}

Is equivalent to:

filter1 site:reddit.com/r/startups/ site:news.ycombinator.com
filter2 site:reddit.com/r/startups/ site:news.ycombinator.com
filter3 site:reddit.com/r/startups/ site:news.ycombinator.com
filter4 author:user1 author:user2

Site-Specific Syntax

Some communities have extra features and limitations. Technical details follow.

Reddit

We scan the entire Reddit with all of its subreddits. For a product overview, see the Reddit monitoring page.

Use Cases

Monitor all of Reddit for a term

site:reddit.com acme

Monitor one subreddit

site:reddit.com/r/startups/ acme

Monitor a few subreddits

site:reddit.com/r/saas/ site:reddit.com/r/EntrepreneurRideAlong/ title:mrr type:post

Monitor posts only and skip comments

site:reddit.com/r/saas/ type:post

Find questions in post or thread titles

site:reddit.com/r/shopify/ title:plugin title:`?`

Track a Reddit user across comments, posts, and promoted posts

site:reddit.com author:someuser123

Implementation Details

  • Alerts are fetched live
  • Syften sees the content from the perspective of a logged-out user
  • A comment's title is reconstructed from the slug in the URL and may be slightly different from the post's title
  • Item edits are not tracked
  • Reddit ads are just promoted posts, meaning that you can track ad campaigns
  • The replyto: operator is not supported

Resources

The Stack Exchange family of sites

We scan the entire Stack Exchange family of sites. See the official Stack Exchange site directory for the current list.

Use Cases

Get notified when someone mentions docker on Server Fault

site:serverfault.com docker

Get notified when someone replies to you

site:stackexchange.com replyto:yourusername

Implementation Details

  • Alerts are available with an up to 15-minute delay
  • Only questions (type:post) have a title
  • The replyto: operator is supported
  • Syften sees the content from the perspective of a logged-out user

GitHub

Syften monitors GitHub issue comments, pull request review comments, and commit comments, but not repository code.

Use Cases

Limit alerts to comments in one repository's issues

site:github.com/owner/repo/issues/ exception

Limit alerts to pull request review comments

site:github.com/owner/repo/pull/ regression

Implementation Details

  • Syften scans GitHub every hour
  • Syften monitors only these events: IssueCommentEvent, PullRequestReviewCommentEvent and CommitCommentEvent
  • The replyto: operator is not supported

Indie Hackers

Indie Hackers is a website and community focusing on helping entrepreneurs become profitable while remaining independent.

Use Cases

Get notified when your friend posts something

site:indiehackers.com author:csallen

Get notified about people working on Slack bots

site:indiehackers.com "slack bot"

Get notified when someone does a Product Hunt launch

site:indiehackers.com type:post title:"product hunt"

Get notified when someone replies to you

site:indiehackers.com replyto:yourusername

Implementation Details

  • Alerts are fetched live
  • Comments have reconstructed titles and are only matched with title:
  • Item edits are not tracked
  • The replyto: operator is supported

Blogs

We have an RSS backend pulling in some blog articles. See the full list of scanned news sites and blogs on the blog monitoring page.

Contact us if your favourite site is missing.

Implementation Details

  • Syften uses RSS to fetch new items. Some sites don't share full articles through this channel, only previews
  • Alerts are available with an up to 15-minute delay

Hacker News

news.ycombinator.com is a community-driven news site that allows users to submit links and create discussions. It focuses on startups and technology.

Use Cases

Get notified when a new official "Who is hiring?" thread gets created

site:ycombinator.com title:"Ask HN: Who is hiring?" author:whoishiring

Get notified when a new remote Go job is posted

site:ycombinator.com title:"Ask HN: Who is hiring?" remote go
site:ycombinator.com title:"Ask HN: Who is hiring?" remote golang

Get notified when someone from your team posts something

site:ycombinator.com author:user1 author:user2

Get notified about new Show HN threads

site:ycombinator.com title:"show hn: " type:post

Get notified when someone replies to you

site:ycombinator.com replyto:someuser

Implementation Details

  • Syften scans Hacker News using the official Hacker News API
  • Syften sees the content from the perspective of a logged-out user, missing out on censored content
  • Alerts are fetched live
  • comments carry the story title, and are only matched with title:
  • Item edits are not tracked
  • The replyto: operator is supported

Resources

Dev.to

Use Cases

Get notified when your favourite author posts something

site:dev.to author:favourite_author

Implementation Details

  • Alerts are fetched live
  • The replyto: operator is not supported

Forums

We scrape an assorted selection of forums running on different backends. See the full list of scanned forums on the forum monitoring page.

Contact us if your favourite forum is missing.

Use Cases

Get notified about new Discourse paid jobs

site:meta.discourse.org title:`[paid-job]`

Get notified when your favourite developer posts something

site:discourse.brew.sh author:favourite_author

Implementation Details

  • Syften sees posts from the perspective of a logged-out user
  • The replyto: operator is not supported

Resources

Newsletters and mailing lists

Syften monitors some tech-related newsletters. A list of all scanned mailing lists follows.

Contact us if your favourite mailing list is missing.

Implementation Details

  • Alerts are fetched live
  • The replyto: operator is not supported

Podcasts

With the advent of powerful AI, we can now scan podcasts for mentions of your product.

If you'd like to receive episode summaries with excerpts as well, try Aurilix.

Use Cases

Limit a filter to podcast transcripts and descriptions

type:podcast syften

Implementation Details

  • Due to the nature of AI-generated audio-to-text conversion, alerts about keywords in the podcast body can be inaccurate. This is especially true for non-dictionary startup names and domain names. Podcast descriptions are still accurate
  • Alerts are available within 15 minutes of an episode being released, but this can vary with load
  • Around 35,000 episodes are scanned each day
  • Podcasts have the special type:podcast
  • The replyto: operator is not supported

YouTube Pro

Monitoring YouTube is completely separate from the other communities. We use YouTube-style search syntax, shown below.

syftenmentions of Syften
+keywordYouTube search is designed to grab your attention, not to provide accurate results. Use the plus operator to make sure a keyword is really included
-keywordExclude a keyword
a OR bEither of these two words. The precedence of this operator is counterintuitive for technical people, so use parentheses () liberally when using OR
intitle:Ask the search engine to prefer title matches. Syften still validates the word against the video title, description, and keywords
description:Ask the search engine to prefer description matches. Syften still validates the word against the video title, description, and keywords
"the * seo"Will match "the power of SEO"
#seoHashtag search
$tag:yourtagthis is a special Syften-specific operator used to tag your filters (legacy tag: is also supported)

Implementation Details

  • Results are checked at least once per day
  • The precedence of the OR operator is counterintuitive for technical people, so use parentheses () liberally when using OR
  • The completeness of our results is at the mercy of the YouTube attention-grabbing algorithm. If it deems a video not worthy of appearing in search results, we will miss it. We do not analyze the contents of the videos.
  • The replyto: operator is not supported

Slack Communities

We monitor a wide variety of publicly available Slack communities.

The title of a Slack message is arbitrarily constructed, and contains some useful information for filtering. Here is an example:

message from john.travolta (U01A1RHH5B7) in techlondon.slack.com/#tech

See the full list of monitored Slack communities on the Slack monitoring page. Contact us if your favourite community is missing.

Use Cases

You can search for very broad terms if you limit your search to Slack communities only

site:slack.com funnel

Limit search to just this one Slack community

site:techlondon.slack.com freelance

Channel tracking

title:`#marketing` "cold call"

We put the channel name in what is normally the title for other backends.

Track users

site:techlondon.slack.com title:U57JWU42T
site:techlondon.slack.com author:reginald

Unfortunately we can't easily tell what the "Username" (e.g. reginald) of a Slack user is and the "Display Name" (e.g. Reginald Terris) is optional and can easily be changed.

So to make identifying users reliable we put the User ID (e.g. U57JWU42T) in the title field. Additionally, to make it convenient to view, we put the "Username" in the author field.

Track replies to your messages

site:techlondon.slack.com title:U57JWU42T

To track replies to your threads, track your own Slack user. Keep in mind that the User ID will be different in every Slack community, and the Username may be different as well.

Learn from the best

site:slack.com marketingexamples.com
site:slack.com saasmarketer.io

See how the best do their marketing and learn from them. To avoid tracking their username across the different communities, you can just follow URLs to their websites.

Implementation Details

  • Alerts are fetched live
  • Since Slack messages have no title, we're constructing a faux one that looks like this:
    message from someuser (U012ABCDEFG) in somecommunity.slack.com/#somechannel
  • Item edits are tracked
  • Thread replies are tracked
  • The replyto: operator is not supported
  • It's inconvenient to track a user across multiple Slack communities, as their username may be different
  • The channel ID is included in the URL, and can be filtered with site: site:somecommunity.slack.com/archives/C12345678/

Twitter/X Pro

Monitoring Twitter/X is completely separate from the other communities. We use the standard Twitter syntax, shown below.

watching nowcontaining both "watching" and "now". This is the default operator
happy hourcontaining the exact phrase "happy hour"
love OR hatecontaining either "love" or "hate" (or both)
beer -rootcontaining "beer" but not "root"
#haikucontaining the hashtag "haiku"
from:NASAsent from Twitter account "NASA"
nasa -@NASAmentioning "nasa", but not the Twitter account "NASA"
puppy -is:retweetcontaining "puppy", filtering out retweets
puppy -is:replycontaining "puppy", filtering out replies
puppy -is:quotecontaining "puppy", filtering out Quote Tweets
is:verifiedlimit to verified accounts
has:hashtags
has:links
has:mentions
has:media
has:images
self-explanatory
lang:enthis parameter restricts Tweets to the given language
$tag:yourtagthis is a special Syften-specific operator used to tag your filters (legacy tag: is also supported)

Use Cases

Here is how I would search for relevant tweets in English about Syften that didn't come from me and didn't mention my Twitter/X handle ("syften" is a dictionary word in Swedish)

(@syften_com OR syften) -lang:sv -from:@syften_com

Implementation Details

  • Alerts are available with an up to 15-minute delay
  • Syften does not support these operators: min_replies, min_faves, min_retweets
  • Syften does not support cashtags (e.g. $BTC)
  • The replyto: operator is not supported
  • The Twitter API and the Twitter web search define different OR binding precedence - the way the API behaves is counterintuitive. For this reason, if you use OR please use parentheses () liberally to explicitly show what you mean. Otherwise, you might receive unexpected results. a b OR c should become a (b OR c)

Resources

Bluesky

Bluesky is a Twitter alternative.

Implementation Details

  • Alerts are fetched live
  • Item edits are not tracked
  • The replyto: operator is not supported

Mastodon

Mastodon is a Twitter alternative.

Implementation Details

  • Alerts are fetched live
  • Item edits are not tracked
  • The replyto: operator is not supported

Product Hunt

producthunt.com is a product discovery and discussion website.

Use Cases

Get notified when someone comments on a product

site:producthunt.com title:yourproduct

Implementation Details

  • Syften scans Product Hunt every five minutes
  • The replyto: operator is not supported

Resources

Steemit

Syften scans Steemit using the official Steem API.

Implementation details

  • Syften sees the content from the perspective of a logged-out user
  • Alerts are available within 5 minutes
  • Item edits are not tracked
  • The replyto: operator is not supported

Lobste.rs

Syften scans Lobste.rs using its JSON and RSS endpoints.

Use Cases

Get notified when your favourite author posts something

site:lobste.rs author:favourite_author

Implementation Details

  • Alerts are fetched live
  • Syften sees the content from the perspective of a logged-out user
  • The replyto: operator is not supported

Resources

API and Webhooks

Syften exposes a small JSON API for account settings, filters, and recent matches. Webhooks use the same match data structure and send new matches to your own endpoint as they arrive.

API token

You can copy or regenerate your API token in Setup → API and Zapier. Pass it in the Authorization header as a bearer token. There are sample curl scripts in the syften-examples repository.

Fetch your latest matches

curl https://syften.com/api/0.0/items/get \
  -X POST \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"limit": 20}'

Endpoints

All API endpoints use POST. Requests with a body should use Content-Type: application/json. Successful responses return the requested JSON data directly.

POST /api/0.0/items/getReturn recent matches. Optional JSON body: {"limit": 100}. The default limit is 100 and the maximum is 500
POST /api/0.0/filters/getReturn your current filters as a JSON array of strings
POST /api/0.0/filters/setReplace your current filters. JSON body: {"filters": ["syften", "example.com"]}
POST /api/0.0/settings/getReturn your account settings. The API token is redacted in this response
POST /api/0.0/info/getReturn account information, plan details, stats, and quota counters

Replace all filters

curl https://syften.com/api/0.0/filters/set \
  -X POST \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"filters": ["syften", "example.com NOT site:example.com"]}'

Items returned by items/get include the matched filter, the match timestamp, and the original item fields:

{
  "id": "match-id",
  "matched_on": "2026-05-04T12:34:56Z",
  "filter": "example.com",
  "item": {
    "backend": "reddit",
    "backend_sub": "r/startups",
    "type": "comment",
    "icon_url": "https://example.com/icon.png",
    "timestamp": "2026-05-04T12:34:56Z",
    "item_url": "https://example.com/thread",
    "author": "someuser",
    "text": "The matched text",
    "title": "Thread title",
    "title_type": 1,
    "lang": "en",
    "analysis": {
      "lang": "en",
      "sentiment": "neutral",
      "nsfw": false,
      "accept": true,
      "suggested_reply": "A short suggested reply, if available.",
      "score": 8,
      "excerpt": "The part of the item that matched the filter.",
      "rejection_reason": ""
    }
  }
}

Errors

Error responses use a JSON object with code and error. Common errors include a missing bearer token, an invalid token, an expired trial or subscription, an invalid endpoint, and malformed JSON.

{
  "code": 400,
  "error": "Authorization must be a Bearer type."
}

Webhooks

Webhooks are available on the Syften Pro plan. Configure your webhook URL in Setup → API and Zapier. There is a small webhook receiver example in the syften-examples repository.

When new matches are found, Syften sends a POST request to your URL with Content-Type: application/json. The request body is a JSON array of item objects, using the inner item shape from items/get. Each webhook item includes the matching filter in its filter field.

[
  {
    "backend": "reddit",
    "backend_sub": "r/startups",
    "type": "comment",
    "icon_url": "https://example.com/icon.png",
    "timestamp": "2026-05-04T12:34:56Z",
    "item_url": "https://example.com/thread",
    "author": "someuser",
    "text": "The matched text",
    "title": "Thread title",
    "title_type": 1,
    "filter": "example.com",
    "lang": "en",
    "analysis": {
      "lang": "en",
      "sentiment": "neutral",
      "nsfw": false,
      "accept": true,
      "suggested_reply": "A short suggested reply, if available.",
      "score": 8,
      "excerpt": "The part of the item that matched the filter.",
      "rejection_reason": ""
    }
  }
]

Return any 2xx status code to mark the webhook delivery as successful. Network errors and non-2xx responses are treated as failures.

Failed webhook deliveries are retried for up to 48 hours. Retries start with a minimum backoff of 5 minutes and can back off up to 12 hours between attempts. If the webhook URL is no longer valid, delivery is skipped instead of retried.

The API and webhook payload formats are intended for automation, but they are not version-locked. If you need a strict compatibility guarantee, contact us before relying on a field never changing.

Archive

Syften stores all of its processed items in an archive so you can search older items and test filters against them. The archive is meant to make filter development and iteration easier, especially when you want to sanity-check how a query behaves before relying on live results.

Not every source is included there. In particular, YouTube and Twitter/X results are not stored in the archive.

Technological limitations

The archive can search and retrieve information from very large datasets quickly because it relies on a data structure called an index. An index reorganizes the data to make queries fast, but that speed comes with a tradeoff: it does not preserve every detail of the original text, including punctuation such as dots, commas, and dashes. That is why search engines like Google often ignore punctuation as well.

When we return live results, we can afford to apply more computationally intensive processing. At that stage, we are able to take punctuation and other special characters into account much more precisely.

For example, Syften applies special handling for domains to ensure you get the results you actually mean. The filter example.com , when matching live results, would match:

  • example.com
  • www.example.com

But not:

  • some-example.com
  • example: com

The archive cannot see dots and similar punctuation precisely in the same way. So an archive search for website.so can still surface text like I built a website, so I launched it., even though that would not be treated as a real domain match in live results.