# Get a research wave report

> The knowledge.research_reports.get operation: GET /api/v1/tax/knowledge/research/reports/{id} in the REST API and the knowledge_research_reports_get tool in the MCP server.

Returns one research wave report (`data/tax/knowledge/reports/<id>.md`) as markdown: the facts a wave added
or changed per jurisdiction, open questions, disputes, unsupported rules and runs that couldn't finish
(spec §42.6 step 4). `id` is the file name without `.md`, as `knowledge.research.get` lists them. The text
is data. Platform staff only.

## At a glance

- **REST:** `GET /api/v1/tax/knowledge/research/reports/{id}`
- **MCP tool:** `knowledge_research_reports_get`
- **Operation ID:** `knowledge.research_reports.get`
- **Scope:** Platform
- **Permission:** `tax_knowledge:read`
- **Risk tier:** `read`
- **Dry run:** Not supported
- **Idempotency:** Not needed (read only)
- **Modes:** Test and live
- **Authentication:** API key with the `tax_knowledge:read` scope
- **Since:** M3

## Request

### Path parameters

| Field | Type   | Description |
| ----- | ------ | ----------- |
| `id`  | string |             |

### Query parameters

This operation takes no query parameters.

## Response

`200 OK` with a JSON object:

| Field      | Type                          | Description |
| ---------- | ----------------------------- | ----------- |
| `id`       | string                        |             |
| `object`   | `"knowledge_research_report"` |             |
| `file`     | string                        |             |
| `title`    | string                        |             |
| `commit`   | string                        |             |
| `markdown` | string                        |             |

## Examples

### The report of a Tier 1 wave

```http
GET /api/v1/tax/knowledge/research/reports/t1-w2-eu-members
Authorization: Bearer or_test_…
```

Response (`200`):

```json
{
  "id": "t1-w2-eu-members",
  "object": "knowledge_research_report",
  "file": "data/tax/knowledge/reports/t1-w2-eu-members.md",
  "title": "Wave report — t1-w2-eu-members",
  "commit": "1c14b2ec912aca347dd518b2044096f3b5d8eef1",
  "markdown": "# Wave report — t1-w2-eu-members\n\n- Result: 4 of 4 runs finished.\n"
}
```

## Errors

| Code                                                                                     | HTTP status | When                                                               | What to do                                                                                           |
| ---------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found) | 404         | No report has this ID in the research data the app was built with. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
| [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed)   | 400         | The ID isn't a report file name.                                   | Fix the fields listed in `details.issues` and send the request again.                                |
| [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied)   | 403         | You aren't platform staff.                                         | Ask an organization owner or admin for a role or scope that allows this action.                      |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`authentication_required`](https://ownrecord.io/docs/reference/errors.md#authentication_required), [`api_key_invalid`](https://ownrecord.io/docs/reference/errors.md#api_key_invalid), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
