> ## Documentation Index
> Fetch the complete documentation index at: https://docs.0xmonaco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Market Pulse

> Cached market news and sentiment feed

The Pulse feed is a backend-cached, cross-market news and sentiment snapshot. It is **public** — no authentication is required — and refreshes hourly server-side.

```typescript theme={null}
import { MonacoSDK } from "@0xmonaco/core";

// Public — works without a wallet or session
await sdk.pulse.getPulse();
```

## Get Pulse

<ResponseField name="getPulse" type="() => Promise<GetPulseResponse>">
  Fetch the current market pulse snapshot. No authentication required.

  **Returns:** `GetPulseResponse`:

  * `generatedAt`: string — ISO 8601 UTC time the snapshot was produced. The REST response derives its `ETag` header from this value (see [Behavior](#behavior)).
  * `watchlist`: string\[] — the asset universe the snapshot was synthesized against.
  * `items`: `PulseItem[]` — pre-sorted (watchlist order, `"MARKET"` last, newest first per asset).

  Each `PulseItem`:

  * `asset`: string — a watchlist ticker (e.g. `"BTC"`) or `"MARKET"` for a cross-asset story.
  * `sentiment`: string — `"Bullish"`, `"Neutral"`, or `"Bearish"`.
  * `summary`: string — a synthesized summary (max 240 characters).
  * `updatedAt`: string — timestamp of the most recent source; render as relative time client-side.
  * `sources`: `PulseSource[]` — provenance for the item.

  Each `PulseSource`:

  * `url`: string — source article or post URL.
  * `author`: string — source author or publication name.
  * `source`: string — `"twitter"` or `"news"`.
  * `createdAt`: string — source publication time (ISO 8601).
  * `relevance`: number — relevance score, `1` (low) to `5` (high).

  **Example:**

  ```typescript theme={null}
  const pulse = await sdk.pulse.getPulse();

  console.log(`Snapshot generated at ${pulse.generatedAt}`);
  for (const item of pulse.items) {
    console.log(`[${item.sentiment}] ${item.asset}: ${item.summary}`);
    for (const src of item.sources) {
      console.log(`  ${src.source} · ${src.author} (relevance ${src.relevance}) — ${src.url}`);
    }
  }
  ```
</ResponseField>

## Behavior

* **Hourly refresh.** The snapshot is regenerated server-side about once an hour; `generatedAt` tells you when.
* **Conditional requests (raw REST).** The `GET /api/v1/pulse` response carries an `ETag` header — the `generatedAt` value wrapped in quotes, e.g. `"2026-07-22T15:17:14Z"`. To skip an unchanged snapshot, send that header value back **verbatim** (quotes included) as `If-None-Match`, and the server replies `304 Not Modified`. This is a raw-REST/gateway optimization: `sdk.pulse.getPulse()` resolves to the response body only and does not expose or set headers, so conditional requests are not available through the SDK method.
* **Cold cache.** The endpoint returns `503` until the backend cache warms after a deploy — retry shortly.
* **No dedicated rate limit.** This public route has no per-endpoint limiter and does not return `429`. Since the snapshot changes at most hourly, poll no more than about once per refresh interval anyway.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.