Documentation Index
Fetch the complete documentation index at: https://api-docs.tiro.ooo/llms.txt
Use this file to discover all available pages before exploring further.
Overview
search_notes is the deep tier of note discovery. It takes a required keyword and returns matching notes hydrated with their primary documents (one-pager, custom). Use this when the LLM needs to understand the context behind a topic — its decisions, action items, or conclusions — not just see which notes match.
For lightweight metadata-only listing (e.g., “which notes are in folder X”), use list_notes instead.
Primary Use Cases:
- “What did the team decide about OKR Q2?” — search by topic, read documents inline.
- “Where is the source note for this decision?” — keyword finds the note, documents give the context.
- “Show me everything we wrote about 네이버” — Korean keyword search with content.
- Keyword required; results ordered by OpenSearch relevance (
_scoredesc). - Each matched note carries its primary documents inline (one-pager, custom).
- HTML stripped from document content; documents larger than 5,000 chars are truncated and flagged.
- Graceful degradation when the search index is unavailable.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
keyword | string | Yes | Search keyword (≥1 char). Matched against title and paragraph content via OpenSearch. |
pagination.cursor | string | Optional | Reserved for future use; the deep-search endpoint currently emits null. |
pagination.size | number | Optional | Results per page (default 10, max 30). |
filter.folderId | string | Optional | Restrict to a folder (recursive — includes descendant folders). |
filter.createdAtFrom | string | Optional | ISO 8601 datetime, inclusive lower bound on createdAt. |
filter.createdAtTo | string | Optional | ISO 8601 datetime, exclusive upper bound on createdAt. |
keyword (required)
The search term. Tokenized server-side via OpenSearch; Korean text is morphologically analyzed via the Nori plugin (e.g.,네이버 → [네, 버]). Empty or whitespace-only keywords return 400.
Keyword search currently requires a user-scoped API key. Team-only API keys return 400.
filter.folderId (optional)
Same semantics aslist_notes — recursive folder scope, authorized server-side.
pagination (optional)
{ cursor, size }. Default size: 10, max 30. The smaller cap reflects the higher per-result cost (each note carries its documents).
Response Format
Success Response
| Field | Type | Description |
|---|---|---|
notes[] | array | Matched notes, ordered by OpenSearch relevance. |
notes[].matchedSnippets | string[] | null | Reserved for OpenSearch highlights. Currently null — distinguishes “highlights not yet implemented” from “searched, no highlights matched”. |
notes[].documents[] | array | Note’s primary documents. Empty array when the note has no documents. |
notes[].documents[].documentGuid | string | Stable document identifier. |
notes[].documents[].templateId | number | null | Numeric template id — the only stable discriminator. |
notes[].documents[].templateTitle | string | Display label (e.g., "One Pager", "회의록"). Locale-sensitive and user-editable for custom templates — do NOT discriminate on this string. |
notes[].documents[].content | string | HTML-stripped, markdown-friendly text. Capped at 5,000 chars; see truncated. |
notes[].documents[].truncated | boolean | true when content was truncated. Fetch the full document via get_note_document if you need the rest. |
nextCursor | string | null | Reserved for future use; currently always null. |
degraded | boolean | true when the search index was unavailable or failed. |
degradedReason | string | null | When degraded=true: "search_index_unavailable" or "search_index_degraded". |
Degraded Response
When the search index is unavailable, the response setsdegraded=true and returns an empty notes array:
degradedReason is one of:
search_index_unavailable— OpenSearch is disabled in the environment.search_index_degraded— OpenSearch threw an error mid-query.
Usage Examples
Example 1: Topical search
Request:Example 2: Folder-scoped Korean keyword
Request:네이버 only inside folder 455765 (and descendants). Korean morphological analysis runs server-side.
Example 3: Date-bounded deep search
Request:Best Practices
Start with list_notes, switch to search_notes when content is needed
Start with list_notes, switch to search_notes when content is needed
Use
list_notes first to find which notes match. If the LLM still needs document content to answer, switch to search_notes for the same keyword. This is the cheapest progressive-disclosure path.Use folderId to narrow the search universe
Use folderId to narrow the search universe
A folder-scoped search is faster and returns better-ranked results because the relevance space is smaller. Pair with
list_notes(filter.folderId) to find folder candidates first.Don't loop on `nextCursor`
Don't loop on `nextCursor`
The deep-search endpoint currently emits
nextCursor: null. If 30 results aren’t enough, refine the keyword (more specific) or scope by folderId/dateRange instead of paginating.Watch the `degraded` flag
Watch the `degraded` flag
A
degraded=true response is honest — the search index couldn’t run. Don’t treat the empty notes array as “no matches”; instead, surface the degradation to the user/LLM so retries can be timed appropriately.