visits.brief

One page brief before a visit: the visit and customer, the address, the request it came from, recent texts with the customer (customer words come wrapped as untrusted text) and calls (owner or office only), notes, photo and video summaries with any measurements, open tasks, and similar past quotes. Read only. Prices show only to people who can see prices. next_actions suggests what to do at or after the visit.

WhoAgents can call this
RESTGET /v1/visits/brief
MCP toolvisits_brief
Writesno
AreaScheduling and visits

When to use it

Use these when a worker is heading to, standing at, or just leaving a visit. Everything happens in conversation with the worker: there are no buttons for them to tap and no app to open.

What to tell the owner

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

Input

FieldTypeRequired
visit_idstring (uuid)yes

Example

GET https://doingwork.work/v1/visits/brief?visit_id=00000000-0000-4000-8000-000000000000

Output

FieldTypeAlways there
visitobjectyes
visit.visit_idstring (uuid)yes
visit.job_idstring (uuid)yes
visit.starts_atstring (date-time)yes
visit.ends_atstring (date-time)yes
visit.statusstringyes
visit.title['string', 'null']yes
visit.job_summary['string', 'null']yes
customerobjectyes
customer.customer_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
customer.name['string', 'null']yes
customer.phone['string', 'null']yes
customer.email['string', 'null']yes
customer.address['string', 'null']yes
request['object', 'null']yes
messagesarrayyes
messages[].atstring (date-time)yes
messages[].directionstringyes
messages[].channelstringyes
messages[].customer_text['object', 'null']yes
messages[].shop_text['string', 'null']yes
callsarrayyes
calls[].atstring (date-time)yes
calls[].directionstringyes
calls[].duration_s['integer', 'null']yes
calls[].summary['string', 'null']yes
notesarrayyes
notes[].note_idstring (uuid)yes
notes[].atstring (date-time)yes
notes[].sourcestringyes
notes[].pinnedbooleanyes
notes[].bodystringyes
mediaarrayyes
media[].kindstringyes
media[].summary['string', 'null']yes
media[].measurements['array', 'object', 'null']yes
open_tasksarrayyes
open_tasks[].task_idstring (uuid)yes
open_tasks[].titlestringyes
open_tasks[].due_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
similar_quotesarrayyes
similar_quotes[].quote_idstring (uuid)yes
similar_quotes[].job_idstring (uuid)yes
similar_quotes[].statusstringyes
similar_quotes[].created_atstring (date-time)yes
similar_quotes[].job_summary['string', 'null']yes
similar_quotes[].customer_name['string', 'null']yes
similar_quotes[].total_minor['integer', 'null']yes
similar_quotes[].matchedarrayyes
similar_quotes[].linesarrayyes
similar_quotes[].lines[].descriptionstringyes
similar_quotes[].lines[].quantitynumberyes
similar_quotes[].lines[].unit_price_minor['integer', 'null']yes
has_quotebooleanyes
next_actionsarrayyes
next_actions[].saystringyes
next_actions[].op['string', 'null']yes
{
  "visit": {
    "visit_id": "00000000-0000-4000-8000-000000000000",
    "job_id": "00000000-0000-4000-8000-000000000000",
    "starts_at": "...",
    "ends_at": "...",
    "status": "...",
    "title": "...",
    "job_summary": "..."
  },
  "customer": {
    "customer_id": "00000000-0000-4000-8000-000000000000",
    "name": "Ruiz Plumbing",
    "phone": "...",
    "email": "owner@example.com",
    "address": "..."
  },
  "request": "...",
  "messages": [
    {
      "at": "...",
      "direction": "...",
      "channel": "...",
      "customer_text": "...",
      "shop_text": "..."
    }
  ],
  "calls": [
    {
      "at": "...",
      "direction": "...",
      "duration_s": "...",
      "summary": "..."
    }
  ],
  "notes": [
    {
      "note_id": "00000000-0000-4000-8000-000000000000",
      "at": "...",
      "source": "...",
      "pinned": true,
      "body": "..."
    }
  ],
  "media": [
    {
      "kind": "...",
      "summary": "...",
      "measurements": "..."
    }
  ],
  "open_tasks": [
    {
      "task_id": "00000000-0000-4000-8000-000000000000",
      "title": "...",
      "due_at": "..."
    }
  ],
  "similar_quotes": [
    {
      "quote_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "status": "...",
      "created_at": "...",
      "job_summary": "...",
      "customer_name": "...",
      "total_minor": "...",
      "matched": [
        "..."
      ],
      "lines": [
        {
          "description": "40 gallon gas heater, installed",
          "quantity": "...",
          "unit_price_minor": "..."
        }
      ]
    }
  ],
  "has_quote": true,
  "next_actions": [
    {
      "say": "...",
      "op": "..."
    }
  ]
}

Errors

CodeStatusWhat to do
invalid_input, invalid_token, rate_limitedCan happen on any call. See errors.