Private preview of the new site. Not live.

notes.search

Find notes you may see by their words, across every record in a shop. Optional target_kind narrows it. Newest first among the best matches. Search here before you ask the worker something the team may already have written down.

WhoAgents can call this
RESTGET /v1/notes/search
MCP toolnotes_search
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
shop_idstring (uuid)yes
qstringyes
target_kindstring (one of job, visit, media, customer, property, equipment, quote, invoice, request, worker, payment, pricebook_item, maintenance_plan, shop)no
limitintegerno

Example

GET https://doingwork.work/v1/notes/search?shop_id=00000000-0000-4000-8000-000000000000&q=...

Output

FieldTypeAlways there
itemsarrayyes
items[].note_idstring (uuid)yes
items[].shop_idstring (uuid)yes
items[].target_kindstringyes
items[].target_idstring (uuid)yes
items[].job_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].visit_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].mentionsarrayyes
items[].agent_name['string', 'null']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[].ranknumberyes
{
  "items": [
    {
      "note_id": "00000000-0000-4000-8000-000000000000",
      "shop_id": "00000000-0000-4000-8000-000000000000",
      "target_kind": "...",
      "target_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "visit_id": "00000000-0000-4000-8000-000000000000",
      "mentions": [
        "00000000-0000-4000-8000-000000000000"
      ],
      "agent_name": "...",
      "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": "...",
      "rank": "..."
    }
  ]
}

Errors

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