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

# Response format

> Understand the response shape shared by every OpenRush tool.

This page is mainly for developers. If you use OpenRush through an AI agent, you usually do not need to read raw responses.

Every OpenRush tool returns the same top-level envelope. Agents can switch between SEO, SERP, audit, keyword, page, and dataset tools without learning a new response wrapper.

```json theme={null}
{
  "schema_version": "ofe/1.0",
  "domain": "seo",
  "data": {},
  "facts": [],
  "entities": [],
  "deltas": [],
  "coverage": {
    "returned": 0,
    "total_available": null,
    "truncated": false,
    "as_of": null,
    "scope_note": null
  },
  "resources": [],
  "next_actions": []
}
```

## Fields

| Field            | Type   | Meaning                                                                |
| ---------------- | ------ | ---------------------------------------------------------------------- |
| `schema_version` | string | Current envelope version. OpenRush returns `ofe/1.0`.                  |
| `domain`         | string | Data domain, such as `seo`, `serp`, `audit`, `backlinks`, or `core`.   |
| `data`           | object | Compact tool-specific payload.                                         |
| `facts`          | array  | Typed, namespaced claims with per-fact provenance.                     |
| `entities`       | array  | Deduplicated canonical entities referenced by facts.                   |
| `deltas`         | array  | Change facts against a previous observation. Empty for one-shot tools. |
| `coverage`       | object | Count, truncation, freshness, and scope notes.                         |
| `resources`      | array  | `openrush://` handles for full datasets too large to inline.           |
| `next_actions`   | array  | Agent-readable follow-up calls and when to use them.                   |

## Facts

Facts are standalone claims. Each fact has a namespaced `type`, a `subject`, and public provenance.

```json theme={null}
{
  "type": "seo.keyword_ranking",
  "subject": [
    { "id": "keyword:best crm|united states", "kind": "keyword" },
    { "id": "domain:hubspot.com", "kind": "domain" }
  ],
  "keyword": "best crm",
  "domain": "hubspot.com",
  "position": 3,
  "provenance": {
    "source_class": "search_index",
    "method": "indexed",
    "observed_at": "2026-06-18T20:06:59Z",
    "confidence": 0.7,
    "connection_id": null,
    "cache_hit": false
  }
}
```

## Provenance

Provenance tells an agent how fresh and trustworthy a fact is. It does not expose upstream supplier names, vendor task IDs, or wholesale costs.

| `source_class`       | Typical method | Typical confidence |
| -------------------- | -------------- | ------------------ |
| `live_serp`          | `observed`     | `0.95`             |
| `crawl`              | `observed`     | `0.90`             |
| `search_index`       | `indexed`      | `0.70`             |
| `backlink_index`     | `indexed`      | `0.70`             |
| `webmaster_console`  | `reported`     | `0.98`             |
| `analytics_property` | `reported`     | `0.98`             |
| `ads_platform`       | `reported`     | `0.98`             |
| `modeled`            | `modeled`      | `0.50`             |
| `synthesized`        | `blended`      | `0.60`             |

## Resources and datasets

When a tool has more rows than should be inlined, it returns an `openrush://` resource. Pass that URI to `/v1/tools/export_dataset`.

```bash theme={null}
curl -X POST "https://api.openrush.io/v1/tools/export_dataset" \
  -H "Authorization: Bearer $OPENRUSH_KEY" \
  -H "Content-Type: application/json" \
  -d '{"uri":"openrush://dataset/..."}'
```

If a valid dataset URI has expired, the endpoint returns a `200` envelope with `data.available=false`, an explanatory `note`, and a `next_actions` entry to regenerate the dataset.
