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

# Data Tools

> market_get_ohlcv fetches price data with a provenance envelope; search_skills and describe_skill power progressive discovery of the 50+ skill-backed data sources.

The data tools family covers market data retrieval and progressive skill discovery. It contains three direct tools: `market_get_ohlcv` for raw price bars, `search_skills` for finding skill-backed data sources, and `describe_skill` for reading a skill's full manifest before running it.

## `market_get_ohlcv`

Fetch OHLCV (open, high, low, close, volume) bars for a symbol. The response is wrapped in a **provenance envelope** that records the upstream provider, the fetch timestamp, and a content hash — so every data point is auditable and reproducible.

### Arguments

| Argument   | Type   | Required | Description                                            |
| ---------- | ------ | -------- | ------------------------------------------------------ |
| `symbol`   | string | Yes      | Ticker symbol, e.g. `NVDA`.                            |
| `range`    | string | Yes      | Date range, e.g. `1y`, `6m`, `ytd`.                    |
| `interval` | string | No       | Bar interval: `1d` (default), `1h`, `15m`, `5m`, `1m`. |

### Return value

| Field        | Type   | Description                                                                 |
| ------------ | ------ | --------------------------------------------------------------------------- |
| `symbol`     | string | The requested symbol.                                                       |
| `range`      | string | The requested range.                                                        |
| `interval`   | string | The bar interval.                                                           |
| `points`     | array  | Array of OHLCV bars (`t`, `o`, `h`, `l`, `c`, `v`).                         |
| `quote`      | object | The most recent quote (`price`, `change`, `change_pct`, `volume`, `as_of`). |
| `provenance` | object | Provider, fetched\_at, content\_hash, and source URL.                       |

### Example call

```json theme={null}
{
  "symbol": "NVDA",
  "range": "1y",
  "interval": "1d"
}
```

### Example response

```json theme={null}
{
  "symbol": "NVDA",
  "range": "1y",
  "interval": "1d",
  "points": [
    { "t": "2024-01-16", "o": 545.15, "h": 552.50, "l": 540.80, "c": 548.90, "v": 41230000 },
    { "t": "2024-01-17", "o": 549.20, "h": 561.10, "l": 547.30, "c": 560.65, "v": 38900000 }
  ],
  "quote": {
    "price": 138.65,
    "change": 2.31,
    "change_pct": 1.69,
    "volume": 245000000,
    "as_of": "2025-01-15T21:00:00Z"
  },
  "provenance": {
    "provider": "polygon",
    "fetched_at": "2025-01-15T14:32:10.223Z",
    "content_hash": "sha256:9f2a1b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a",
    "source_url": "https://api.polygon.io/v2/aggs/ticker/NVDA/range/1/day/2024-01-15/2025-01-15"
  }
}
```

<Callout type="info">
  The `content_hash` in the provenance envelope lets you verify that two backtests ran against identical data. If the hash matches, the data is byte-identical.
</Callout>

## `search_skills`

Progressive discovery — find skills matching a natural-language query. The agent should call this before calling any skill-backed tool directly. It returns a ranked list of matching skill IDs with one-line summaries.

### Arguments

| Argument      | Type   | Required | Description                                                                                       |
| ------------- | ------ | -------- | ------------------------------------------------------------------------------------------------- |
| `query`       | string | Yes      | Natural-language description of what you're looking for, e.g. `"congressional trading activity"`. |
| `asset_class` | string | No       | Filter by asset class: `equity`, `crypto`, `fx`, `macro`.                                         |
| `intent`      | string | No       | Filter by intent: `research`, `screen`, `fetch`, `compute`.                                       |

### Return value

An array of skill summaries, ranked by relevance:

| Field         | Type   | Description                                          |
| ------------- | ------ | ---------------------------------------------------- |
| `skill_id`    | string | The stable skill identifier, e.g. `congress_trades`. |
| `version`     | string | Latest version of the skill.                         |
| `summary`     | string | One-line description of what the skill does.         |
| `asset_class` | string | The asset class the skill operates on.               |
| `intent`      | string | The skill's intent category.                         |
| `relevance`   | float  | Relevance score from 0.0 to 1.0.                     |

### Example call

```json theme={null}
{
  "query": "congressional trading activity for NVDA",
  "asset_class": "equity",
  "intent": "fetch"
}
```

### Example response

```json theme={null}
[
  {
    "skill_id": "congress_trades",
    "version": "2.1.0",
    "summary": "Pull congressional trading disclosures filtered by symbol or member.",
    "asset_class": "equity",
    "intent": "fetch",
    "relevance": 0.96
  },
  {
    "skill_id": "insider_transactions",
    "version": "1.4.2",
    "summary": "Pull Form 4 insider transactions (buys, sells, option exercises).",
    "asset_class": "equity",
    "intent": "fetch",
    "relevance": 0.71
  }
]
```

## `describe_skill`

Fetch the full manifest for a skill. The agent calls this after `search_skills` to learn the exact input schema, output schema, cost, latency profile, and upstream provider before running the skill.

### Arguments

| Argument   | Type   | Required | Description                                       |
| ---------- | ------ | -------- | ------------------------------------------------- |
| `skill_id` | string | Yes      | The skill identifier returned by `search_skills`. |
| `version`  | string | No       | A specific version. Defaults to latest.           |

### Return value

| Field           | Type   | Description                                 |
| --------------- | ------ | ------------------------------------------- |
| `skill_id`      | string | The skill identifier.                       |
| `version`       | string | The resolved version.                       |
| `description`   | string | Full description of what the skill does.    |
| `input_schema`  | object | JSON Schema for the skill's input.          |
| `output_schema` | object | JSON Schema for the skill's output.         |
| `provider`      | string | Upstream data provider.                     |
| `cost`          | object | Cost profile (per-call credits, cacheable). |
| `latency`       | object | Latency profile (p50, p99 in ms).           |

### Example call

```json theme={null}
{
  "skill_id": "congress_trades",
  "version": "2.1.0"
}
```

### Example response

```json theme={null}
{
  "skill_id": "congress_trades",
  "version": "2.1.0",
  "description": "Pull congressional trading disclosures filed under the STOCK Act. Filter by ticker symbol or member name. Returns transaction date, type, amount range, and filing date.",
  "input_schema": {
    "type": "object",
    "properties": {
      "symbol": { "type": "string", "description": "Ticker symbol to filter by." },
      "member": { "type": "string", "description": "Member name to filter by." },
      "since": { "type": "string", "format": "date", "description": "Only return filings after this date." }
    }
  },
  "output_schema": {
    "type": "object",
    "properties": {
      "trades": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "member": { "type": "string" },
            "symbol": { "type": "string" },
            "transaction_date": { "type": "string", "format": "date" },
            "type": { "type": "string", "enum": ["buy", "sell"] },
            "amount_range": { "type": "string" },
            "filing_date": { "type": "string", "format": "date" }
          }
        }
      }
    }
  },
  "provider": "quiver_quant",
  "cost": { "per_call_credits": 1, "cacheable": true },
  "latency": { "p50_ms": 420, "p99_ms": 1800 }
}
```

## The discovery loop

<Steps>
  <Step title="Search">
    Call `search_skills` with a natural-language query. Get back a ranked list of matching skill IDs.
  </Step>

  <Step title="Describe">
    Call `describe_skill` on the top match to read its input schema. Build the input dict.
  </Step>

  <Step title="Run">
    Call `run_skill` with the `skill_id` and `input`. Poll `get_run` or stream `subscribe_run` for the result. See [Run management tools](/tools/runs).
  </Step>
</Steps>

<Tip>
  Cache `describe_skill` results within a session. Skill manifests are immutable per version, so re-fetching the same `skill_id` + `version` is wasted work.
</Tip>

## Related

* [Tools overview](/tools/overview) — the full tool catalog
* [Run management tools](/tools/runs) — `run_skill`, `get_run`, `subscribe_run`, `cancel_run`
* [Skills catalog](/skills/overview) — browse all 50+ skills by category
