---
title: reports.save | Doing Work API
description: Save a report to run again later: a name, one report operation (reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, costs.job
url: https://doingwork.work/docs/reference/reports-save/
---

# reports.save

Save a report to run again later: a name, one report operation (reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, costs.jobs), its settings, and an optional moving date range (today, this_week, last_week, this_month, last_month, last_7_days, last_30_days, last_90_days, this_quarter, last_quarter, this_year, last_year) worked out on the shop's calendar each run. Send report_id to change a saved one. Owner or office only.

|  |  |
|---|---|
| Who | Agents can call this |
| REST | `POST /v1/reports/saved` |
| MCP tool | `reports_save` |
| Writes | yes, send an Idempotency-Key |
| Area | [Costs, expenses and reports](https://doingwork.work/docs/reference/#costs-expenses-and-reports) |

## When to use it

Save a report to run again later: a name, one report operation (reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, costs.jobs), its settings, and an optional moving date range (today, this_week, last_week, this_month, last_month, last_7_days, last_30_days, last_90_days, this_quarter, last_quarter, this_year, last_year) worked out on the shop's calendar each run. Send report_id to change a saved one.

## What to tell the owner

Say what you did in plain words and what happens next.

## Input

| Field | Type | Required |
|---|---|---|
| `shop_id` | string (uuid) | yes |
| `report_id` | string (uuid) | no |
| `name` | string | yes |
| `op_id` | string (one of reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, costs.jobs) | yes |
| `params` | object | no |
| `date_range` | ['string', 'null', ' ', '(', 'o', 'n', 'e', ' ', 'o', 'f', ' ', 't', 'o', 'd', 'a', 'y', ',', ' ', 't', 'h', 'i', 's', '_', 'w', 'e', 'e', 'k', ',', ' ', 'l', 'a', 's', 't', '_', 'w', 'e', 'e', 'k', ',', ' ', 't', 'h', 'i', 's', '_', 'm', 'o', 'n', 't', 'h', ',', ' ', 'l', 'a', 's', 't', '_', 'm', 'o', 'n', 't', 'h', ',', ' ', 'l', 'a', 's', 't', '_', '7', '_', 'd', 'a', 'y', 's', ',', ' ', 'l', 'a', 's', 't', '_', '3', '0', '_', 'd', 'a', 'y', 's', ',', ' ', 'l', 'a', 's', 't', '_', '9', '0', '_', 'd', 'a', 'y', 's', ',', ' ', 't', 'h', 'i', 's', '_', 'q', 'u', 'a', 'r', 't', 'e', 'r', ',', ' ', 'l', 'a', 's', 't', '_', 'q', 'u', 'a', 'r', 't', 'e', 'r', ',', ' ', 't', 'h', 'i', 's', '_', 'y', 'e', 'a', 'r', ',', ' ', 'l', 'a', 's', 't', '_', 'y', 'e', 'a', 'r', ',', ' ', 'N', 'o', 'n', 'e', ')'] | no |

## Example

```http
POST https://doingwork.work/v1/reports/saved
content-type: application/json
Idempotency-Key: 3f1c...

{
  "shop_id": "00000000-0000-4000-8000-000000000000",
  "name": "Ruiz Plumbing",
  "op_id": "reports.revenue"
}
```

## Output

JSON. The response shape isn't published yet; read the fields you need and ignore the rest. Errors are `{code, message, status}`.

## Errors

| Code | Status | What to do |
|---|---|---|
| `invalid_input`, `invalid_token`, `rate_limited` |  | Can happen on any call. See [errors](https://doingwork.work/docs/errors/). |
