# Stream overview

> The core Firehose product — your rules match every crawled page and matches are delivered over a live SSE stream. When to use it, and how a match is made.

Stream is the heart of Firehose. You attach **rules** (queries) to a **tap**, and every freshly
crawled page that matches a rule is delivered to you the moment it's crawled — live over a
**Server-Sent Events** connection, or in the dashboard [feed](/dashboard/feed) if you'd rather not
write code.

## When to use it

Use Stream when you want to monitor the **whole web** for something, rather than a fixed list of
pages. For example:

- Every new page mentioning your brand or a competitor.
- News in a category and language, published in the last hour.
- New pages matching a URL or content pattern across many sites.

<Callout type="info">
  Stream monitors the whole web — it doesn't poll a page for you. To watch specific URLs you already
  know, use [URL Watch](/url-watch/overview). See
  [Stream vs URL Watch](/get-started/stream-vs-url-watch) for the full comparison.
</Callout>

## How a match is produced

```text
Rule:  title:tesla AND page_category:"/News" AND recent:24h
          │
          ▼
Every crawled page is evaluated against all active rules on the tap
          │
          ▼
Match ──▶ update event on GET /v1/stream
```

A page is delivered if it matches **any** rule on the tap. Each delivered match tells you which
rule(s) matched (`query_ids`) and carries the page's metadata plus the content `diff` — the change
that matched, with a little surrounding context, not the whole page.

## In this section

<CardGrid>
  <Card title="Rules & query syntax" href="/stream/rules">
    Manage the queries on a tap, and the full query language they're written in.
  </Card>
  <Card title="Streaming" href="/stream/streaming">
    Open the SSE connection, event types, parameters, and reconnection.
  </Card>
  <Card title="Match payload" href="/stream/match-payload">
    Every field on a delivered document.
  </Card>
</CardGrid>
