---
title: reports.today | Doing Work API
description: The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the cu
url: https://doingwork.work/docs/reference/reports-today/
---

# reports.today

The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the customer, overdue and draft invoices, done jobs not invoiced, time waiting for approval and approvals waiting on the owner. Each list shows the first 25 with the full count.

|  |  |
|---|---|
| Who | Agents can call this |
| REST | `GET /v1/reports/today` |
| MCP tool | `reports_today` |
| Writes | no |
| Area | [Costs, expenses and reports](https://doingwork.work/docs/reference/#costs-expenses-and-reports) |

## When to use it

The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the customer, overdue and draft invoices, done jobs not invoiced, time waiting for approval and approvals waiting on the owner. Each list shows the first 25 with the full count.

## What to tell the owner

Tell them what you found in plain words. Don't read back raw fields.

## Input

| Field | Type | Required |
|---|---|---|
| `shop_id` | string (uuid) | yes |
| `date` | string | no |

## Example

```http
GET https://doingwork.work/v1/reports/today?shop_id=00000000-0000-4000-8000-000000000000
```

## Output

| Field | Type | Always there |
|---|---|---|
| `date` | string | yes |
| `time_zone` | string | yes |
| `currency` | string | yes |
| `visits_today` | object | yes |
| `visits_today.count` | integer | yes |
| `visits_today.items` | array | yes |
| `visits_today.items[].visit_id` | string (uuid) | yes |
| `visits_today.items[].job_id` | string (uuid) | yes |
| `visits_today.items[].job_summary` | ['string', 'null'] | yes |
| `visits_today.items[].customer_name` | ['string', 'null'] | yes |
| `visits_today.items[].title` | ['string', 'null'] | yes |
| `visits_today.items[].starts_at` | string (date-time) | yes |
| `visits_today.items[].ends_at` | string (date-time) | yes |
| `visits_today.items[].status` | string | yes |
| `visits_today.items[].assignees` | array | yes |
| `unassigned_visits` | object | yes |
| `unassigned_visits.count` | integer | yes |
| `unassigned_visits.items` | array | yes |
| `unassigned_visits.items[].visit_id` | string (uuid) | yes |
| `unassigned_visits.items[].job_id` | string (uuid) | yes |
| `unassigned_visits.items[].job_summary` | ['string', 'null'] | yes |
| `unassigned_visits.items[].customer_name` | ['string', 'null'] | yes |
| `unassigned_visits.items[].title` | ['string', 'null'] | yes |
| `unassigned_visits.items[].starts_at` | string (date-time) | yes |
| `unassigned_visits.items[].ends_at` | string (date-time) | yes |
| `unassigned_visits.items[].status` | string | yes |
| `unassigned_visits.items[].assignees` | array | yes |
| `new_requests` | object | yes |
| `new_requests.count` | integer | yes |
| `new_requests.items` | array | yes |
| `new_requests.items[].request_id` | string (uuid) | yes |
| `new_requests.items[].title` | string | yes |
| `new_requests.items[].source` | string | yes |
| `new_requests.items[].customer_id` | ['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')'] | yes |
| `new_requests.items[].created_at` | string (date-time) | yes |
| `quotes_waiting` | object | yes |
| `quotes_waiting.count` | integer | yes |
| `quotes_waiting.items` | array | yes |
| `quotes_waiting.items[].quote_id` | string (uuid) | yes |
| `quotes_waiting.items[].job_id` | string (uuid) | yes |
| `quotes_waiting.items[].customer_name` | ['string', 'null'] | yes |
| `quotes_waiting.items[].total_minor` | integer | yes |
| `quotes_waiting.items[].sent_at` | string (date-time) | yes |
| `quotes_waiting.items[].days_waiting` | integer | yes |
| `change_orders_waiting` | object | yes |
| `change_orders_waiting.count` | integer | yes |
| `change_orders_waiting.items` | array | yes |
| `change_orders_waiting.items[].change_order_id` | string (uuid) | yes |
| `change_orders_waiting.items[].job_id` | string (uuid) | yes |
| `change_orders_waiting.items[].number` | integer | yes |
| `change_orders_waiting.items[].total_minor` | integer | yes |
| `change_orders_waiting.items[].sent_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `invoices_overdue` | object | yes |
| `invoices_overdue.count` | integer | yes |
| `invoices_overdue.items` | array | yes |
| `invoices_overdue.items[].invoice_id` | string (uuid) | yes |
| `invoices_overdue.items[].job_id` | string (uuid) | yes |
| `invoices_overdue.items[].customer_name` | ['string', 'null'] | yes |
| `invoices_overdue.items[].owed_minor` | integer | yes |
| `invoices_overdue.items[].due_on` | string | yes |
| `invoices_overdue.items[].days_overdue` | integer | yes |
| `draft_invoices` | object | yes |
| `draft_invoices.count` | integer | yes |
| `draft_invoices.items` | array | yes |
| `draft_invoices.items[].invoice_id` | string (uuid) | yes |
| `draft_invoices.items[].job_id` | string (uuid) | yes |
| `draft_invoices.items[].customer_name` | ['string', 'null'] | yes |
| `draft_invoices.items[].total_minor` | integer | yes |
| `draft_invoices.items[].created_at` | string (date-time) | yes |
| `jobs_to_invoice` | object | yes |
| `jobs_to_invoice.count` | integer | yes |
| `jobs_to_invoice.items` | array | yes |
| `jobs_to_invoice.items[].job_id` | string (uuid) | yes |
| `jobs_to_invoice.items[].summary` | ['string', 'null'] | yes |
| `jobs_to_invoice.items[].customer_name` | ['string', 'null'] | yes |
| `jobs_to_invoice.items[].occurred_at` | string (date-time) | yes |
| `time_to_approve` | object | yes |
| `time_to_approve.entries` | integer | yes |
| `time_to_approve.minutes` | integer | yes |
| `time_to_approve.people` | integer | yes |
| `time_to_approve.oldest_started_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `approvals_pending` | object | yes |
| `approvals_pending.count` | integer | yes |
| `approvals_pending.items` | array | yes |
| `approvals_pending.items[].approval_id` | string (uuid) | yes |
| `approvals_pending.items[].op_id` | string | yes |
| `approvals_pending.items[].amount_minor` | ['integer', 'null'] | yes |
| `approvals_pending.items[].requested_by` | string (uuid) | yes |
| `approvals_pending.items[].expires_at` | string (date-time) | yes |

```json
{
  "date": "...",
  "time_zone": "...",
  "currency": "...",
  "visits_today": {
    "count": 1,
    "items": [
      {
        "visit_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "job_summary": "...",
        "customer_name": "...",
        "title": "...",
        "starts_at": "...",
        "ends_at": "...",
        "status": "...",
        "assignees": [
          "00000000-0000-4000-8000-000000000000"
        ]
      }
    ]
  },
  "unassigned_visits": {
    "count": 1,
    "items": [
      {
        "visit_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "job_summary": "...",
        "customer_name": "...",
        "title": "...",
        "starts_at": "...",
        "ends_at": "...",
        "status": "...",
        "assignees": [
          "00000000-0000-4000-8000-000000000000"
        ]
      }
    ]
  },
  "new_requests": {
    "count": 1,
    "items": [
      {
        "request_id": "00000000-0000-4000-8000-000000000000",
        "title": "...",
        "source": "...",
        "customer_id": "00000000-0000-4000-8000-000000000000",
        "created_at": "..."
      }
    ]
  },
  "quotes_waiting": {
    "count": 1,
    "items": [
      {
        "quote_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "customer_name": "...",
        "total_minor": 50000,
        "sent_at": "...",
        "days_waiting": 1
      }
    ]
  },
  "change_orders_waiting": {
    "count": 1,
    "items": [
      {
        "change_order_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "number": 1,
        "total_minor": 50000,
        "sent_at": "..."
      }
    ]
  },
  "invoices_overdue": {
    "count": 1,
    "items": [
      {
        "invoice_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "customer_name": "...",
        "owed_minor": 50000,
        "due_on": "...",
        "days_overdue": 1
      }
    ]
  },
  "draft_invoices": {
    "count": 1,
    "items": [
      {
        "invoice_id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "customer_name": "...",
        "total_minor": 50000,
        "created_at": "..."
      }
    ]
  },
  "jobs_to_invoice": {
    "count": 1,
    "items": [
      {
        "job_id": "00000000-0000-4000-8000-000000000000",
        "summary": "...",
        "customer_name": "...",
        "occurred_at": "..."
      }
    ]
  },
  "time_to_approve": {
    "entries": 1,
    "minutes": 1,
    "people": 1,
    "oldest_started_at": "..."
  },
  "approvals_pending": {
    "count": 1,
    "items": [
      {
        "approval_id": "00000000-0000-4000-8000-000000000000",
        "op_id": "00000000-0000-4000-8000-000000000000",
        "amount_minor": "...",
        "requested_by": "00000000-0000-4000-8000-000000000000",
        "expires_at": "..."
      }
    ]
  }
}
```

## Errors

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