# Data Feeds

Data feeds are the pipelines Sorin uses to ingest real-time information from markets, news sources, on-chain activity, and other signal sources. Each feed streams events continuously, and you can attach **reactions** to any feed — rules that tell Sorin what to do when specific events arrive.

Feeds and reactions are what turn Sorin from a passive assistant into an always-on agent. You configure the pipelines once; Sorin watches them forever.

<figure><img src="/files/4TLEGgDNBhcDGxZdW1qP" alt=""><figcaption></figcaption></figure>

### What a Data Feed Is

A data feed is a named, configured source of real-time events. Every feed has:

| Property        | What It Defines                                                                                                         |
| --------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Name**        | Human-readable label (e.g., "Binance ticker price", "Diplomacy & ceasefire updates").                                   |
| **Type**        | The category of data — Market, News, Social, On-chain, etc.                                                             |
| **Runtime**     | The underlying connector that fetches the data (e.g., `binance-ticker-price`, `Google News RSS`, `Polymarket Markets`). |
| **Description** | What the feed produces, so future-you remembers what it's for.                                                          |
| **Status**      | Whether the feed is live, in pilot, or paused.                                                                          |
| **Health**      | Whether the feed's runtime is currently ingesting successfully.                                                         |
| **Reactions**   | The automated rules attached to this feed.                                                                              |

You can run many feeds in parallel. Each feed is independent — pausing one does not affect the others.

### Feed Status

A feed is always in one of these states:

| Status     | Meaning                                                                                                 |
| ---------- | ------------------------------------------------------------------------------------------------------- |
| **Active** | Live and ingesting. Any configured reactions will fire on qualifying events.                            |
| **Pilot**  | Ingesting for evaluation only. Reactions can run, but the feed is marked as not yet production-trusted. |
| **Paused** | Halted. No ingestion and no reactions firing until resumed.                                             |

**Health** is separate from status. A feed can be Active but Unhealthy — meaning it's configured to run but the runtime is having trouble (API outage, credential issue, rate limiting). Health indicators appear next to every feed in the directory.

### Feed Types

Data feeds are grouped by the kind of information they carry:

| Type         | Typical Runtimes                        | Example Feeds                                         |
| ------------ | --------------------------------------- | ----------------------------------------------------- |
| **Market**   | Exchange APIs, tickers, order books     | Binance ticker price, Binance 24h, Polymarket Markets |
| **News**     | RSS aggregators, newswire               | Google News RSS feeds for geopolitics, policy, energy |
| **Social**   | WebSocket streams, mention APIs         | Real-time social mention streams for major tickers    |
| **On-chain** | Indexers, RPC endpoints, event watchers | Wallet activity, DEX flows, governance events         |

Type is used for filtering the directory and for reasoning about a feed's role in your overall automation setup.

### The Data Feeds Directory

The directory is the single place you manage every feed. From the **Customize → Data Feeds** view, you can:

* Search feeds by name or description
* Filter by type (Market, News, Social)
* Filter by kind (the specific runtime)
* Filter by status (Active, Pilot, Paused)
* Expand any feed to see its reactions
* Pause, configure, or delete a feed inline

The header shows live counts — how many feeds are active, how many are healthy, how many are in pilot or paused, and how many reactions have triggered in the current window.

### Reactions

A **reaction** is an automated rule attached to a data feed. When an event from the feed matches the reaction's filter, Sorin runs the reaction's "do" — typically reviewing the event against your mandate, determining impact on your positions, and executing any warranted trades or adjustments.

Reactions are how you move from "Sorin is watching" to "Sorin is doing." Without them, a feed just logs events.

#### Anatomy of a Reaction

Every reaction has four configurable sections:

**When**

The filter that determines whether an incoming event triggers the reaction.

* **Always** — every event from the feed triggers the reaction
* **Custom filter** — only events matching a specified condition trigger

Use **Always** when the feed itself is pre-filtered to just what you care about. Use a custom filter when one feed carries many event types and you only want to react to some.

**Do**

The natural-language instruction Sorin executes when the filter matches. This is where you tell Sorin what the reaction is *for*.

Good examples:

* "Review binance ticker price events against the mandate, determine impact on positions, and execute any warranted trades or adjustments."
* "Summarize the news item, check if any open positions are affected, and alert me if material."
* "Check whether the social mention volume crosses the threshold for the referenced ticker and, if so, open a pilot-sized position."

**Rate Limit**

The coarse guardrail that prevents a reaction from firing too often.

* **At most X times per {minute, hour, day}** — cap total executions in a rolling window

Rate limits are a safety net. Even if a feed is flooded with events, the rate limit caps how many times the reaction can actually run.

**Advanced**

Fine-grained throttling and scoping controls:

| Control                    | What It Does                                                                                                                                                  |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Workspace**              | The workspace the reaction runs in. Scopes the reaction's view of context and positions.                                                                      |
| **Trading Bot (optional)** | Ties this reaction to a specific Trading Bot. If set, any trades execute under that bot's policy and custody. If not set, the reaction runs globally.         |
| **Cooldown (seconds)**     | Minimum wait between consecutive reaction runs. Protects against event bursts.                                                                                |
| **Max per window**         | Caps the number of executions within the Window duration.                                                                                                     |
| **Window (seconds)**       | The rolling window over which Max per window applies.                                                                                                         |
| **Debounce (seconds)**     | If more events arrive within this window, Sorin waits for the stream to quiet down before firing once. Useful for collapsing bursts of near-duplicate events. |

{% hint style="info" %} **Start with conservative rate limits.** It's easier to loosen throttling after you've watched a reaction behave than to clean up after a runaway loop. Pilot mode plus a tight cooldown is a good starting posture. {% endhint %}

### Example: Reacting to a Market Event

<figure><img src="/files/vs6hVlVm64g4EqJhb2Q9" alt=""><figcaption></figcaption></figure>

**Feed:** Binance ticker price (Market, Active, Healthy)

**Reaction:**

* **When:** Always
* **Do:** "Review binance ticker price events against the mandate, determine impact on positions, and execute any warranted trades or adjustments."
* **Rate limit:** At most 10 times per hour
* **Workspace:** *(scoped to a specific workspace)*
* **Trading Bot:** No wallet — run globally
* **Cooldown:** 300 seconds
* **Max per window:** 10
* **Window:** 3600 seconds
* **Debounce:** 0 seconds

**What this does:**

Every Binance ticker price event triggers a reaction. Sorin reviews the event against the workspace's mandate and, if warranted, proposes or executes a trade. The rate limit caps the reaction at 10 runs per hour; the cooldown enforces at least 5 minutes between runs; and the window limits total runs to 10 in any rolling hour.

If the feed briefly floods with events (a fast move, many updates in a few seconds), the throttle absorbs the spike instead of firing ten times in a minute.

### Adding a Data Feed

From the Data Feeds directory, click **+** to add a new feed.

You'll configure:

1. **Name** — how you'll refer to it
2. **Type** — Market, News, Social, On-chain
3. **Runtime** — the specific connector to use (depends on what's available; additional runtimes can come from installed Skills)
4. **Description** — one-liner explaining what the feed produces
5. **Credentials or configuration** — API keys, symbols to track, RSS URLs, etc., depending on the runtime

New feeds default to **Pilot** status so you can watch them for a while before trusting them.

### Adding a Reaction

Expand any feed in the directory and click **+ Add reaction**. The reaction editor walks through When → Do → Rate limit → Advanced, with sensible defaults at each step.

A feed can have any number of reactions. It's often cleaner to have several narrowly-scoped reactions than one broad one — easier to tune, pause, or replace individually.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.saharaai.com/sorin/core-features/data-feeds.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
