Private preview of the new site. Not live.

notes.list

Notes you may see on a job (job-level and every visit) or on one visit: pinned first, then newest first. Filter by source (typed or voice_memo); removed notes are left out unless include_removed is true.

WhoAgents can call this
RESTGET /v1/notes
MCP toolnotes_list
Writesno
AreaField work (checklists, forms, time, notes, change orders, subcontractors)

When to use it

Keep the shop's own notes on a job or one visit (notes.add). For a voice memo, transcribe it with your own speech-to-text and save the words with notes.addVoiceMemo (transcript, duration_seconds, and optionally recorded_at, transcribed_with and language); core runs no speech model and does not store the audio.

What to tell the owner

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

Input

FieldTypeRequired
job_idstring (uuid)no
visit_idstring (uuid)no
sourcestring (one of typed, voice_memo)no
include_removedstring (one of true, false)no

Example

GET https://doingwork.work/v1/notes?job_id=00000000-0000-4000-8000-000000000000&visit_id=00000000-0000-4000-8000-000000000000&source=typed&include_removed=true

Output

FieldTypeAlways there
itemsarrayyes
items[].note_idstring (uuid)yes
items[].shop_idstring (uuid)yes
items[].job_idstring (uuid)yes
items[].visit_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].sourcestringyes
items[].bodystringyes
items[].audiencestringyes
items[].pinnedbooleanyes
items[].media_idsarrayyes
items[].recorded_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].duration_seconds['integer', 'null']yes
items[].transcribed_with['string', 'null']yes
items[].language['string', 'null']yes
items[].revisionsintegeryes
items[].written_bystring (uuid)yes
items[].written_by_name['string', 'null']yes
items[].created_atstring (date-time)yes
items[].edited_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].removed_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].removed_by['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].remove_reason['string', 'null']yes
{
  "items": [
    {
      "note_id": "00000000-0000-4000-8000-000000000000",
      "shop_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "visit_id": "00000000-0000-4000-8000-000000000000",
      "source": "...",
      "body": "...",
      "audience": "...",
      "pinned": true,
      "media_ids": [
        "00000000-0000-4000-8000-000000000000"
      ],
      "recorded_at": "...",
      "duration_seconds": "...",
      "transcribed_with": "...",
      "language": "...",
      "revisions": 1,
      "written_by": "00000000-0000-4000-8000-000000000000",
      "written_by_name": "...",
      "created_at": "...",
      "edited_at": "...",
      "removed_at": "...",
      "removed_by": "00000000-0000-4000-8000-000000000000",
      "remove_reason": "..."
    }
  ]
}

Errors

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