# Attach Note to Folder Source: https://docs.tiro.ooo/api-reference/folder/attach-note-to-folder /openapi.yaml post /v1/external/folders/{folderId}/notes Add an existing note to the folder. The note must belong to the same workspace as the folder. Requires edit access to the folder. Attaching a note that is already in the folder succeeds with no effect, so the call is safe to retry. # Create Folder Source: https://docs.tiro.ooo/api-reference/folder/create-folder /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/folders Create a folder in a workspace. Requires a **user** API key — you must be a writable member of the workspace. A team-only API key returns `401`. To nest the folder, set `parentId` (folders can be nested up to 5 levels below the root level). `sharingType` defaults to `ALL_MEMBER_VIEWER` when omitted. # Delete Folder Source: https://docs.tiro.ooo/api-reference/folder/delete-folder /openapi.yaml delete /v1/external/folders/{folderId} Delete a folder. The folder must have no subfolders — delete or move its children first. Requires edit access. This action is irreversible. # Detach Note from Folder Source: https://docs.tiro.ooo/api-reference/folder/detach-note-from-folder /openapi.yaml delete /v1/external/folders/{folderId}/notes/{noteGuid} Remove a note from the folder. This does not delete the note itself. Requires edit access to the folder. # Get Folder Source: https://docs.tiro.ooo/api-reference/folder/get-folder /openapi.yaml get /v1/external/folders/{folderId} Retrieve a single folder by ID. The workspace is resolved from the folder, so no workspace is needed in the path. Requires a **user** API key with access to the folder. # Get Folder Path Source: https://docs.tiro.ooo/api-reference/folder/get-folder-path /openapi.yaml get /v1/external/folders/{folderId}/path Retrieve the breadcrumb path from the root to the folder, inclusive. The first element is the top-level ancestor and the last element is the folder itself. Requires a **user** API key with access to the folder. Ancestors you cannot access appear with `isAccessible: false`. # Get Folder Tree Source: https://docs.tiro.ooo/api-reference/folder/get-folder-tree /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders/tree Retrieve the workspace folder hierarchy as a nested tree. Requires a **user** API key. The tree contains only folders you can access. When a folder's parent is not accessible to you, the folder appears at the root level of the tree instead. # List Folders Source: https://docs.tiro.ooo/api-reference/folder/list-folders /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders List the folders you can access in a workspace, as a flat array. Requires a **user** API key — folder access is evaluated per user via workspace membership. A team-only API key returns `401`. Create folders with `POST` on this same path. Read and manage individual folders with the endpoints under `/v1/external/folders/{folderId}`. # List Folders by Note Source: https://docs.tiro.ooo/api-reference/folder/list-folders-by-note /openapi.yaml get /v1/external/notes/{noteGuid}/folders Retrieve folders for a specific note # Move Folder Source: https://docs.tiro.ooo/api-reference/folder/move-folder /openapi.yaml put /v1/external/folders/{folderId}/move Move a folder under a new parent, or to the root level with `newParentId: null`. The target parent must be in the same workspace and you must have access to it. You cannot move a folder into its own subtree. Use `sharingTypeUpdateStrategy` to control how the folder's sharing permissions are handled after the move (defaults to `KEEP_EXISTING`). Requires edit access to the folder. # Reorder Folders Source: https://docs.tiro.ooo/api-reference/folder/reorder-folders /openapi.yaml post /v1/external/folders/reorder Set the display order of sibling folders. Provide every sibling's ID in the desired order; positions are assigned by array index. The workspace is inferred from the first folder ID. Requires edit access. # Update Folder Source: https://docs.tiro.ooo/api-reference/folder/update-folder /openapi.yaml patch /v1/external/folders/{folderId} Update a folder's title, description, color, or sharing type (partial update). Requires edit access. Changing `sharingType` to `PRIVATE` fails with `403` if the folder still has other members. `PATCH` cannot change the parent — use `PUT /v1/external/folders/{folderId}/move` to re-parent or move to the root. # Generate Note Document Source: https://docs.tiro.ooo/api-reference/note-document/generate-note-document /openapi.yaml post /v1/external/notes/{noteGuid}/documents Generate a note document based on a template. - Blocks until document generation is complete (synchronous) - Requires `UPDATE_CONTENT` permission on the note - User must own the template or have team access See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Document Source: https://docs.tiro.ooo/api-reference/note-document/get-note-document /openapi.yaml get /v1/external/notes/{noteGuid}/documents/{documentId} Retrieve a specific note document by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Documents Source: https://docs.tiro.ooo/api-reference/note-document/list-note-documents /openapi.yaml get /v1/external/notes/{noteGuid}/documents List all documents generated for a specific note. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Delete Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/delete-share-link /openapi.yaml delete /v1/external/notes/{noteGuid}/share-link Delete the share link for a note. - Returns 204 even if already deleted (idempotent) # Get Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/get-share-link /openapi.yaml get /v1/external/notes/{noteGuid}/share-link Retrieve the current share link for a note. - Returns 404 if no share link exists - `sharePassword` is always `null` for security # Upsert Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/upsert-share-link /openapi.yaml put /v1/external/notes/{noteGuid}/share-link Create or update a share link for a note. - If no link exists, creates a new one. If it already exists, updates password settings. - An empty body `{}` creates a link without a password. ### `usePassword` behavior | `usePassword` | No existing link | Existing link | |---|---|---| | `null` (omit) | Create without password | Keep current state | | `true` | Create with password | (Re)generate password | | `false` | Create without password | Remove password | > `sharePassword` is only included when `usePassword: true`. Store it immediately — it cannot be retrieved later. # List Note Summaries Source: https://docs.tiro.ooo/api-reference/note-summary/list-note-summaries /openapi.yaml get /v1/external/notes/{noteGuid}/summaries List all summaries generated for a specific note. - Returns summary metadata without content - To retrieve the full summary content, use the Get Note Summary endpoint See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Source: https://docs.tiro.ooo/api-reference/note/get-note /openapi.yaml get /v1/external/notes/{noteGuid} Retrieve a single note by its GUID # List Note Paragraphs Source: https://docs.tiro.ooo/api-reference/note/list-note-paragraphs /openapi.yaml get /v1/external/notes/{noteGuid}/paragraphs Returns a note's transcript as paragraphs — the "conversation notes" / transcript content (a speaker turn or topic chunk per paragraph). **Paywall masking (free / unpaid notes).** When a note exceeds the free usage limit and is not on a paid plan, the paragraphs past the limit are returned with their text content masked instead of withheld. Such paragraphs have `locked: true`. The first locked paragraph keeps a short readable preview (about the first 80 characters of `transcript`, and the summary header plus its first bullet); every locked paragraph after it is fully masked. Masking preserves length, whitespace, and structure but replaces the words with placeholder characters, so masked text reads as gibberish rather than the real transcript. Unlocked paragraphs (`locked: false`) are always returned in full. Starting a paid plan unlocks the note and removes the masking. A response where the transcript "cuts off partway" is almost always this masking, not a bug. # List Notes Source: https://docs.tiro.ooo/api-reference/note/list-notes /openapi.yaml get /v1/external/notes **Deprecated.** Use `GET /v1/external/workspaces/{workspaceGuid}/notes` for workspace-scoped listing. This endpoint stays available for backward compatibility. List notes with cursor-based pagination. When `keyword` is provided the result set is reordered by full-text relevance (with `createdAt` desc as tiebreaker) instead of `recordingStartAt` desc. Keyword search requires a user-scoped API key — team-only API keys with `keyword` set return `400`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # List Workspace Notes Source: https://docs.tiro.ooo/api-reference/note/list-workspace-notes /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/notes List the notes in a workspace with cursor-based pagination. This is the workspace-scoped successor to the deprecated `GET /v1/external/notes`. The API key must be scoped to the workspace in the path; a key bound to a different workspace returns `403`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # Reserve Note GUID Source: https://docs.tiro.ooo/api-reference/note/reserve-note-guid /openapi.yaml post /v1/external/notes/guids Reserve a note GUID for later use in note creation. This allows you to: - Get a GUID before actually creating the note - Use the reserved GUID when creating a note with POST /v1/notes (internal API) - Reservation expires after 1 hour if not used **Use case**: When you need to know the note GUID before the note content is ready, such as setting up webhooks or references in advance. # Search Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-notes-deep /openapi.yaml post /v1/external/notes/search **Deprecated.** Use `POST /v1/external/workspaces/{workspaceGuid}/notes/search` for workspace-scoped deep search, which also accepts workspace-system and team API keys. This endpoint stays available for backward compatibility. Keyword-required deep search. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. ## When to use this vs `GET /v1/external/notes?keyword=...` - **`GET /v1/external/notes?keyword=...`** — lightweight: returns matched note metadata only. Cheaper. - **`POST /v1/external/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Behavior - Requires a user-scoped API key (team-only API keys return `400`). - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Search Workspace Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-workspace-notes-deep /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/notes/search Deep keyword search scoped to one workspace, named in the path by `workspaceGuid`. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. This is the workspace-scoped successor to the deprecated `POST /v1/external/notes/search`. ## When to use this vs `GET /v1/external/workspaces/{workspaceGuid}/notes?keyword=...` - **`GET …/notes?keyword=…`** — lightweight: returns matched note metadata only. Cheaper. - **`POST …/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Which API keys work Unlike the deprecated `POST /v1/external/notes/search` (user-scoped keys only), this endpoint accepts user, workspace-system, and legacy team API keys. A key bound to a workspace must match the `workspaceGuid` in the path, otherwise the call returns `403`. A user-scoped key must belong to a member of the workspace, otherwise the call returns `403`. ## Behavior - Results stay inside the path workspace. Both note matching and document hydration are workspace-bounded, so cross-workspace notes never leak. - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Update Note Source: https://docs.tiro.ooo/api-reference/note/update-note /openapi.yaml patch /v1/external/notes/{noteGuid} Update a note's metadata (partial update). Currently only the note `title` can be changed. Requires the `note:write` scope. This follows the [AIP-134](https://google.aip.dev/134) field-mask convention: the required `updateMask` query parameter lists which fields to change, and only those fields are touched. A field named in `updateMask` but absent from the body (or sent as `null`) is treated as an error for `title`, since the title cannot be blank. # Create Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/create-voice-file-job /openapi.yaml post /v1/external/voice-file/jobs Create a new Voice File Job for audio transcription and optional translation. - Returns a presigned upload URI for your audio file - Optionally specify source language hints and target translation locales - Job starts in `CREATED` status — upload your file to begin processing - Targets a workspace where Voice File Jobs are enabled - Workspace-unbound user and organization keys must provide `workspaceGuid` - Uses word memories from the key's user, workspace, and organization scopes Documentation: [Complete workflow guide with code examples](/voice-file/tutorial) # Delete Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/delete-voice-file-job /openapi.yaml delete /v1/external/voice-file/jobs/{jobId} Delete a Voice File Job in any status, including while processing. Tiro removes the uploaded audio, transcript, and translations. The deleted job is no longer available through the API, and processing callbacks that arrive after deletion are ignored. # Get Transcript Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript Retrieve the transcribed text from a completed Voice File Job. - Job status must be `COMPLETED` - Returns the full transcript text and detected locales Documentation: [How to retrieve results](/voice-file/tutorial#step-5-retrieve-results) # Get Transcript Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript/paragraph-summary Retrieve AI-generated paragraph summaries from the transcript. - Provides a quick content overview in markdown format - Summaries are generated in the transcript's original language Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Translation Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale} Retrieve a specific translation by locale. - More efficient than listing all translations when you know the target locale - Job status must be `COMPLETED` Documentation: [Supported locales](/fundamentals/supported-locales) # Get Translation Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale}/paragraph-summary Retrieve AI-generated paragraph summaries from a translated version. - Summaries are generated in the target translation language - Requires the translation to exist for the specified locale Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/get-voice-file-job /openapi.yaml get /v1/external/voice-file/jobs/{jobId} Retrieve the current status and details of a Voice File Job. - Poll this endpoint until status reaches `COMPLETED` or `FAILED` - Once completed, use the transcript and translation endpoints to retrieve results Documentation: [Polling strategy and status meanings](/voice-file/overview#polling-strategy-recommended) # List Translations Source: https://docs.tiro.ooo/api-reference/voice-file/list-translations /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations List all translations generated for a Voice File Job. - Job status must be `COMPLETED` - Requires `translationLocales` to have been set during job creation - Returns translations for all requested locales Documentation: [How to retrieve translations](/voice-file/tutorial#step-5-retrieve-results) # Notify Upload Complete Source: https://docs.tiro.ooo/api-reference/voice-file/notify-upload-complete /openapi.yaml put /v1/external/voice-file/jobs/{jobId}/upload-complete Notify that audio file upload is complete and start processing. - Call this after uploading your file to the presigned URL from Create Voice File Job - Triggers the transcription (and optional translation) pipeline - Job status transitions: `CREATED` → `UPLOADED` → `PROCESSING` Documentation: [Step-by-step upload guide](/voice-file/tutorial#step-3-notify-upload-completion) # API 개요 Source: https://docs.tiro.ooo/ko/developers/fundamentals/api-overview Tiro API의 기본 URL, 자격 증명별 접근 범위, 요청 제한, 응답 형식. Tiro API에서 노트, 전사, 요약, 폴더를 조회하고 관리해요. ## Base URL 모든 API 요청은 다음 주소로 보내세요. ``` https://api.tiro.ooo ``` ## 자격 증명별 워크스페이스 접근 범위 계정 API Key는 사용자 신원으로 동작하며, 그 사용자가 현재 접근할 수 있는 모든 워크스페이스의 리소스에 사용자와 같은 권한으로 접근해요. 워크스페이스 API Key는 연결된 워크스페이스 하나, 조직 API Key는 조직에 속한 워크스페이스에 한정돼요. `GET /v1/external/workspaces`를 호출하면 현재 자격 증명이 접근할 수 있는 워크스페이스 목록을 받아요. 각 항목에는 `guid`, `name`, `isWikiEnabled`가 담겨 있어요. `GET /v1/external/workspaces/me`는 계정 API Key의 기본 워크스페이스 또는 워크스페이스 API Key가 연결된 워크스페이스를 반환해요. 워크스페이스 단위 리소스는 `workspaceGuid`를 포함해요. 예를 들어 `POST /v1/external/workspaces/{workspaceGuid}/folders`는 해당 워크스페이스에 폴더를 만들어요. 계정 API Key 하나로 여러 워크스페이스를 연동할 때는 `GET /v1/external/workspaces`에서 현재 접근 가능한 `workspaceGuid`를 확인하세요. ## Rate Limit API Key 하나당 60초에 600개 요청을 보낼 수 있어요. 초과하면 `429` 응답과 `Retry-After`·`X-RateLimit-*` 헤더를 받아요. ### Rate Limit 초과 rate limit을 초과하면 `429 Too Many Requests` 응답을 받아요. ```json theme={"system"} { "error": { "code": 429001, "message": "Rate limit exceeded. Try again in 60 seconds", "detail": "Limit of 600 requests per 60 seconds exceeded" } } ``` ## 응답 형식 모든 API 응답은 일관된 JSON 형식을 따라요. ### 성공 응답 (목록) ```json theme={"system"} { "content": [...], "nextCursor": "opaque-cursor-string" } ``` ### 성공 응답 (단일 리소스) ```json theme={"system"} { "id": "resource-id", "createdAt": "2024-01-01T00:00:00Z", ... } ``` ### 에러 응답 에러에는 디버깅에 도움이 되는 상세 정보가 포함돼요. ```json theme={"system"} { "error": { "code": 400000, "message": "Human readable error message", "detail": null } } ``` # 인증 Source: https://docs.tiro.ooo/ko/developers/fundamentals/authentication API Key 종류, 인증 방법, Scope와 권한 범위. ## API Key Tiro API는 API Key로 인증해요. 모든 요청의 `Authorization` 헤더에 API Key를 Bearer 토큰으로 보내세요. 계정 API Key는 사용자 계정에 연결되고, 그 사용자가 현재 접근할 수 있는 모든 워크스페이스에서 사용자와 같은 권한으로 동작해요. 워크스페이스·조직 API Key는 각각 연결된 워크스페이스나 조직을 기준으로 동작해요. ### API Key 종류와 권한 Tiro API Key는 호출 주체에 따라 세 가지로 나뉘어요. | API Key 종류 | 식별 방식 | 사용할 수 있는 작업 | | ------------------ | ------------------------------ | -------------------------------------------------------------- | | **계정 API Key** | 키가 특정 사용자 계정에 연결돼요. | 읽기와 쓰기 작업에 사용해요. 그 사용자가 앱에서 접근할 수 있는 노트라면 개인 폴더의 노트도 다룰 수 있어요. | | **워크스페이스 API Key** | 사용자 없이 워크스페이스 컨테이너를 기준으로 동작해요. | 워크스페이스 전체에 공유된 리소스에 사용해요. 조회와 변경 모두 아래 범위 안에서만 동작해요. | | **조직 API Key** | 사용자 없이 조직 컨테이너를 기준으로 동작해요. | 조직에 속한 워크스페이스의 전체 공유 리소스와 조직 관리 API에 사용해요. | 워크스페이스 API Key와 조직 API Key는 사용자 없이 동작한다는 점이 같아서, 둘을 묶어 **시스템 API Key**라고 불러요. 이 문서에서 시스템 API Key라고 하면 두 종류를 함께 가리켜요. 워크스페이스 API Key는 워크스페이스 전체 구성원에게 공유된 폴더에 들어 있는 노트만 다뤄요. 조회뿐 아니라 노트 제목 수정, 공유 링크 생성, 문서 생성처럼 노트를 바꾸는 요청에도 같은 범위가 적용돼요. 개인 폴더에 있는 노트, 일부 구성원에게만 공유한 폴더의 노트, 어느 폴더에도 넣지 않은 노트는 이 범위에서 빠져요. 그 노트까지 다뤄야 한다면 계정 API Key를 발급해 사용하세요. **전환 기간 안내.** 이 범위가 적용되기 전에 발급한 워크스페이스 API Key는 당분간 예전처럼 동작하고, 차례로 전환될 예정이에요. 그래서 지금 새로 발급한 키가 기존 키보다 노트를 더 적게 반환할 수 있는데 정상이에요. API Key 종류별 범위와 범위 밖의 노트가 어떤 응답으로 나타나는지는 [시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)에 정리해 두었어요. 워크스페이스 API Key가 아직 워크스페이스에 바인딩되지 않은 상태라면 인증 요청은 `401 Unauthorized`로 실패할 수 있어요. 키가 올바른 형식인데도 401이 계속된다면 키가 연결된 워크스페이스와 발급 화면을 먼저 확인하세요. ## 권한 범위 (Scope) Scope는 키가 할 수 있는 작업을 제한해요. 키를 발급할 때 선택하고 나중에도 바꿀 수 있어요. * **Scope를 지정하지 않으면 모든 작업이 허용돼요.** 앞으로 추가되는 API도 자동으로 포함돼요. 최소 권한이 필요하면 사용할 scope를 명시하세요. Scope는 열어주는 게 아니라 **좁히는** 용도예요 — 지정한 scope에 해당하는 API만 호출할 수 있고, 나머지는 `403 insufficient_scope`로 거부돼요. * **`write` scope는 같은 리소스의 `read`를 포함해요.** 예를 들어 `note:write`만 지정한 키로도 `note:read`가 필요한 조회 API를 호출할 수 있어요. * Scope는 모든 API Key 종류(사용자·워크스페이스·조직)에 적용돼요. * 선택할 수 있는 scope 목록은 `GET /v1/api-key-scopes`로 조회할 수 있어요. ### Scope 목록 | Scope | 설명 | | ----------------------------- | ------------------------------ | | `note:read` | 노트 메타데이터·목록·전사 조회 | | `note:write` | 노트 제목 등 노트 메타데이터 수정 | | `note_summary:read` | 노트 요약(한 페이지 문서) 조회 | | `note_document:read` | 생성된 문서 조회 | | `note_document:write` | 커스텀 템플릿으로 문서 생성 | | `note_document_template:read` | 노트 문서 템플릿 목록·조회 | | `folder:read` | 폴더 조회 | | `folder:write` | 폴더 생성·수정·삭제 | | `wiki:read` | 위키 조회·검색 | | `word_memory:read` | 단어장 조회 | | `word_memory:write` | 단어장 생성·수정·삭제 | | `organization_member:read` | 조직 구성원과 워크스페이스 배정 조회 | | `organization_member:write` | 구성원 녹음 차단·해제 및 워크스페이스 배정 관리 | | `session:write` | 조직 구성원의 Tiro 세션 무효화 | | `workspace:read` | 조직 워크스페이스 목록·조회 | | `workspace:write` | 조직 워크스페이스 생성·이름 변경·사용 한도 설정·삭제 | | `voice_file_job:read` | Voice File Job 상태·전사·번역·요약 조회 | | `voice_file_job:write` | Voice File Job 생성·처리 시작·삭제 | ### API별 필요 Scope Scope를 지정한 키는 아래 표의 scope를 가진 API만 호출할 수 있어요. Scope를 지정하지 않은 키는 모든 API를 호출할 수 있어요. | API | 필요 Scope | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | `GET /v1/external/notes`, `POST /v1/external/notes/search` | `note:read` | | `GET /v1/external/notes/{guid}`, `GET /v1/external/notes/{guid}/folders` | `note:read` | | `GET /v1/external/notes/{guid}/paragraphs` | `note:read` | | `GET /v1/external/notes/{guid}/summaries`, `.../summaries/{id}` | `note_summary:read` | | `GET /v1/external/notes/{guid}/share-link` | `note:read` | | `PATCH /v1/external/notes/{guid}`, `PUT /v1/external/notes/{guid}/share-link`, `DELETE .../share-link` | `note:write` | | `GET /v1/external/organizations/me/notes` | `note:read` | | `GET /v1/external/workspaces/{ws}/notes`, `POST .../workspaces/{ws}/notes/search` | `note:read` | | `GET /v1/external/notes/{guid}/documents`, `.../documents/{id}` | `note_document:read` | | `POST /v1/external/notes/{guid}/documents` | `note_document:write` | | `GET /v1/external/note-document-templates`, `.../managed`, `.../{id}`, `GET /v1/external/{users/me,workspaces/me,workspaces/{ws},workspaces/-,organizations/me}/note-document-templates` | `note_document_template:read` | | `GET .../folders` (폴더 조회) | `folder:read` | | `POST/PATCH/PUT/DELETE .../folders` (폴더 변경) | `folder:write` | | `GET /v1/external/workspaces/{ws}/wiki/**` | `wiki:read` | | `GET .../word-memories`, `.../word-memories/{id}` (users·workspaces·organizations) | `word_memory:read` | | `POST/PATCH/DELETE .../word-memories`, `POST .../word-memories/bulk`, `PATCH .../word-memories/bulk`, `POST .../word-memories/bulk-delete` | `word_memory:write` | | `GET /v1/external/organizations/me/members`, `GET .../members/{userGuid}` | `organization_member:read` | | `PUT/DELETE .../members/{userGuid}/recording-suspension`, `PUT/DELETE .../workspaces/{ws}/members/{userGuid}` | `organization_member:write` | | `DELETE .../members/{userGuid}/sessions` | `session:write` | | `GET /v1/external/organizations/me/workspaces`, `.../workspaces/{ws}` | `workspace:read` | | `POST /v1/external/organizations/me/workspaces`, `PATCH .../{ws}`, `PATCH .../{ws}/quota`, `DELETE .../{ws}` | `workspace:write` | | `GET /v1/external/voice-file/jobs/{jobId}`, `GET .../transcript`, `GET .../translations/**`, `GET .../paragraph-summary` | `voice_file_job:read` | | `POST /v1/external/voice-file/jobs`, `PUT .../{jobId}/upload-complete`, `DELETE .../{jobId}` | `voice_file_job:write` | | `GET /v1/external/auth/me`, `.../organizations/me`, `.../workspaces`, `.../workspaces/me` | (scope 무관 — 모든 키 허용) | ## API Key 발급 [Tiro Platform](https://platform.tiro.ooo/me/api-keys)에서 계정 API Key를 발급받으세요. [platform.tiro.ooo/me/api-keys](https://platform.tiro.ooo/me/api-keys)로 이동하세요. **Create New API Key**를 클릭하고 이름을 지정한 뒤, 점(.)을 포함한 **전체 키**를 복사하세요 — `abc123.xR7mK9pL2qW4...`. 환경 변수로 저장하세요. 비밀 값은 한 번만 표시되며, 대화 상자를 닫으면 복구할 수 없어요. 계정 API Key는 발급할 때 워크스페이스를 고르지 않아요. 현재 사용자가 접근할 수 있는 워크스페이스를 사용자 신원과 권한으로 다뤄요. 서버 간 연동에 사용자 신원이 필요 없다면 해당 워크스페이스나 조직의 관리 화면에서 시스템 API Key를 발급하세요. API Key는 안전하게 보관하고 클라이언트 측 코드에 절대 노출하지 마세요. API Key는 서버 측 애플리케이션에서만 사용해야 해요. ## API Key 형식 Tiro API Key는 다음 형식을 따라요. ``` {id}.{secret} ``` 예시: `abc123.xR7mK9pL2qW4...` | 부분 | 예시 | 설명 | | ----------------------- | ------------------------ | --------------------------------------------------- | | **Key ID** (`{id}`) | `abc123` | Platform 대시보드에서 볼 수 있어요. 어떤 키가 요청을 보내는지 식별하는 데 쓰여요. | | **Secret** (`{secret}`) | `xR7mK9pL2qW4...` | 생성 시 한 번만 표시돼요. 서버는 해시만 저장하므로 복구할 수 없어요. | | **전체 API Key** | `abc123.xR7mK9pL2qW4...` | **점을 포함한 전체 문자열**이에요. 이 값을 Bearer token으로 사용해요. | **흔한 실수:** Key ID(`abc123`)만 Bearer token으로 쓰지 마세요. **전체 키**(`abc123.xR7mK9pL2qW4...`), 즉 키 생성 시 표시된 전체 문자열을 사용해야 해요. ## 인증된 요청 보내기 모든 요청의 `Authorization` 헤더에 API Key를 포함하세요. ```bash cURL theme={"system"} curl -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" \ https://api.tiro.ooo/v1/external/notes ``` ```javascript Node.js theme={"system"} const response = await fetch("https://api.tiro.ooo/v1/external/notes", { method: "GET", headers: { "Authorization": `Bearer ${process.env.TIRO_API_KEY}`, "Content-Type": "application/json", }, }); const notes = await response.json(); ``` ```python Python theme={"system"} import os import requests headers = { 'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}', 'Content-Type': 'application/json' } response = requests.get('https://api.tiro.ooo/v1/external/notes', headers=headers) notes = response.json() ``` ```go Go theme={"system"} import ( "fmt" "net/http" "os" ) func makeAuthenticatedRequest() (*http.Response, error) { client := &http.Client{} req, err := http.NewRequest("GET", "https://api.tiro.ooo/v1/external/notes", nil) if err != nil { return nil, err } apiKey := os.Getenv("TIRO_API_KEY") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) req.Header.Set("Content-Type", "application/json") return client.Do(req) } ``` ```kotlin Kotlin + Spring theme={"system"} @Service class TiroApiService { @Value("\${tiro.api.key}") private lateinit var apiKey: String private val restTemplate = RestTemplate() fun getNotes(): ResponseEntity { val headers = HttpHeaders() headers.set("Authorization", "Bearer $apiKey") headers.contentType = MediaType.APPLICATION_JSON val entity = HttpEntity(headers) return restTemplate.exchange( "https://api.tiro.ooo/v1/external/notes", HttpMethod.GET, entity, String::class.java ) } } ``` ## 인증 에러 인증에 실패하면 `401 Unauthorized` 응답을 받아요. * Authorization 헤더 누락 * 잘못된 형식의 키 (`{id}.{secret}` 형식이어야 해요) * 알 수 없는 key id * 비활성·만료·삭제된 키 ```json theme={"system"} { "error": { "code": "invalid_api_key", "message": "The API key provided is invalid", "type": "authentication_error" } } ``` ## 보안 모범 사례 ### 환경 변수 환경 변수를 사용해 API Key를 안전하게 보관하세요. ```bash .env theme={"system"} # .env file (never commit this!) TIRO_API_KEY=abc123.XYZ... ``` ```javascript Node.js theme={"system"} // Load from environment const apiKey = process.env.TIRO_API_KEY; if (!apiKey) { throw new Error('TIRO_API_KEY environment variable is required'); } ``` ```python Python theme={"system"} import os # Load from environment with validation api_key = os.getenv('TIRO_API_KEY') if not api_key: raise ValueError('TIRO_API_KEY environment variable is required') ``` ```go Go theme={"system"} import ( "fmt" "os" ) func getAPIKey() (string, error) { apiKey := os.Getenv("TIRO_API_KEY") if apiKey == "" { return "", fmt.Errorf("TIRO_API_KEY environment variable is required") } return apiKey, nil } ``` ```kotlin Kotlin + Spring theme={"system"} # application.properties tiro.api.key=${TIRO_API_KEY} # Or application.yml tiro: api: key: ${TIRO_API_KEY} ``` ### 추가 보안 가이드라인 * **키를 주기적으로 교체하세요**: 사용하지 않는 키는 삭제하고 새 키를 생성하세요 * **환경별로 키를 분리하세요**: 개발과 프로덕션에 서로 다른 키를 사용하세요 * **사용량을 모니터링하세요**: API Key 사용량을 추적하고 이상이 보이면 교체하세요 * **API Key를 절대 로그에 남기지 마세요**: 애플리케이션 로그에 키가 나타나지 않도록 하세요 * **HTTPS만 사용하세요**: 항상 보안 연결로 요청을 보내세요 # 에러 처리 Source: https://docs.tiro.ooo/ko/developers/fundamentals/error-handling Tiro API 에러 응답 형식과 상태 코드. ## 에러 응답 형식 Tiro API 에러는 모두 같은 JSON 구조를 사용해요. ```json theme={"system"} { "error": { "code": 400001, "errorType": "bad_request", "message": "Human readable error message", "detail": "Additional context or null" } } ``` ### 필드 | 필드 | 타입 | 설명 | | ----------- | ------------------------ | --------------------------------------------------------------------------------------- | | `code` | integer | `AAABBB` 형태의 6자리 에러 코드예요. 앞 3자리는 HTTP 상태와 일치하고, 뒤 3자리는 상태별 일련번호예요. 세밀한 클라이언트 분기에 사용하세요. | | `errorType` | string | HTTP 상태에서 파생된 큰 범주의 분류예요. 시간이 지나도 안정적이라 클라이언트 분기에 안전해요. 아래 표를 참고하세요. | | `message` | string | 사람이 읽을 수 있는 에러 메시지예요. 안정적이지 않으니 분기에 사용하지 마세요. | | `detail` | object \| string \| null | 에러에 따라 포함되는 추가 정보예요. | ## HTTP 상태 코드 & 에러 타입 | 상태 | `errorType` | 의미 | | ------- | ---------------------- | ----------------------------------- | | **400** | `bad_request` | 잘못된 요청 형식 또는 파라미터 | | **401** | `unauthorized` | API Key 누락 또는 무효 | | **403** | `forbidden` | API Key에 필요한 권한 없음 | | **404** | `not_found` | 리소스가 존재하지 않음 | | **406** | `not_acceptable` | 지원하지 않는 `Accept` 헤더 | | **409** | `conflict` | 리소스가 이미 존재하거나 상태 충돌 | | **413** | `payload_too_large` | 요청 본문이 크기 제한 초과 | | **422** | `unprocessable_entity` | 형식은 유효하지만 데이터가 유효하지 않음 | | **429** | `too_many_requests` | rate limit 초과 | | **5xx** | `internal_error` | 서버 측 에러 (더 파싱하지 말고 backoff로 재시도하세요) | # 노트 데이터 모델 Source: https://docs.tiro.ooo/ko/developers/fundamentals/note-data-model Note, Paragraph, NoteSummary, NoteDocument의 관계와 조회 API. `Note`는 녹음 세션 하나를 담아요. 내용은 **Paragraphs**(전사), **NoteSummary**(한 페이지 요약), **NoteDocument**(섹션으로 나뉜 문서)로 나뉘어요. 아래에서 각 항목의 관계와 조회 API를 확인하세요. ## 엔티티 관계 ```mermaid theme={"system"} erDiagram Note ||--o{ Paragraph : "has" Note ||--o{ NoteSummary : "has" Note ||--o{ NoteDocument : "has" NoteDocumentTemplate ||--o{ NoteDocument : "generates" Folder o|--o{ Note : "contains" ``` ## 엔티티 ### Note 녹음 세션이 시작될 때(또는 오디오·텍스트를 가져올 때) 생성되는 컨테이너예요. `guid` 필드로 식별하며, API 경로에서는 `{noteGuid}`로 참조해요. 제목, 소스 타입, 녹음 길이, 협업자 같은 메타데이터를 담아요. 실제 내용은 아래 하위 항목에 들어 있어요. ### Paragraph Note 전사의 의미 단위예요. 보통 화자 발화 구간이나 주제 덩어리이며, 일반적인 산문 문단이 **아니에요**. 각 Paragraph는 `transcript`, `translated`(번역을 요청한 경우), `summary`(짧은 문단 단위 요약), 그리고 타임스탬프를 담아요. 각 텍스트 필드는 `{ type, content }` 형태의 `TextObject`(`type`은 `text/plain` 또는 `text/markdown`)이며, 전사·번역·요약이 비동기로 완료됨에 따라 단계적으로 non-null이 돼요. ### NoteSummary Note 전체를 다루는 단일 요약 텍스트 블록이에요. "한 페이지" 요약으로 보이는 것이 바로 이거예요. `content` 필드는 raw 문자열이 아니라 `TextObject`(`{ type, content }`)예요. 하나의 Note는 여러 개의 NoteSummary를 가질 수 있어요(언어나 템플릿이 다를 때). NoteDocument와 달리 섹션으로 나뉘지 않아요. ### NoteDocument 여러 섹션으로 구성된 구조화된 문서예요. 예를 들면 회의록, 액션 아이템, 영업 통화 노트 같은 거예요. 어떤 섹션이 있는지 정의하는 `NoteDocumentTemplate`으로부터 생성돼요. 각 섹션은 개별적으로 렌더링돼요. 자유 형식 요약이 아니라 템플릿 기반의 구조화된 산출물이 필요할 때 사용하세요. ### NoteDocumentTemplate NoteDocument의 섹션 구조를 정의해요. 플랫폼에서 관리하거나(`isManaged: true`, 예: "회의록") 팀이 커스텀할 수 있어요. NoteDocument를 생성하기 전에 사용 가능한 템플릿을 둘러보고 적절한 형태를 고르세요. ### Folder Note를 계층적으로 정리해요. 하나의 Note는 최대 하나의 Folder에 속해요. Folder는 사용자 소유이거나 팀 소유일 수 있고, 공유 규칙이 적용돼요. ## 어떤 API를 호출해야 하나요? | 원하는 것... | 사용할 API | | ---------------- | ---------------------------------------------- | | 노트의 전체 전사 | `GET /v1/external/notes/{noteGuid}/paragraphs` | | 한 페이지 요약 | `GET /v1/external/notes/{noteGuid}/summaries` | | 구조화된 리포트 (회의록 등) | `GET /v1/external/notes/{noteGuid}/documents` | | 사용 가능한 문서 템플릿 | `GET /v1/external/note-document-templates` | | 폴더 상세 정보 | `GET /v1/external/teams/me/folders/{folderId}` | ## FAQ **"한 페이지" 요약은 어디에 있나요?** `NoteSummary`에 있어요. `GET /v1/external/notes/{noteGuid}/summaries`를 호출하세요. `NoteDocument`는 여러 섹션으로 구성된 구조화된 리포트를 위한 것이지, 한 페이지 요약을 위한 게 아니에요. **NoteSummary와 NoteDocument 중 무엇을 써야 하나요?** * 단일 요약 텍스트 블록 → `NoteSummary`. * 여러 섹션으로 구성된 구조화된 리포트(템플릿 기반) → `NoteDocument`. 하나의 Note는 둘 다 가질 수 있어요. 애플리케이션이 기대하는 형태에 맞춰 고르세요. 기능별 비교(사용 가능한 템플릿, 생성 경로, webhook 지원)는 [Summary And Document](/ko/developers/template-based-documents/summary-and-document)를 참고하세요. # 시스템 API Key가 조회하는 노트 범위 Source: https://docs.tiro.ooo/ko/developers/fundamentals/system-key-note-scope 시스템 API Key와 시스템 Webhook은 워크스페이스 전체에 공유된 폴더의 노트만 조회하고 변경해요. 자격 증명 종류별 범위를 정리했어요. 시스템 API Key와 시스템 Webhook은 **워크스페이스 전체 구성원에게 공유된 폴더에 들어 있는 노트만** 다뤄요. 조회뿐 아니라 노트를 바꾸는 요청에도 같은 범위가 적용돼요. 구성원이 개인 폴더에 둔 노트, 일부 사람에게만 공유한 폴더의 노트, 어느 폴더에도 넣지 않은 노트는 이 범위에서 빠져요. 계정 API Key와 계정 Webhook은 사용자 신원과 실제 접근 권한을 따르므로 이 시스템 범위가 적용되지 않아요. 어느 폴더에도 넣지 않은 노트를 놓치기 쉬워요. 공유 대상이 정해지지 않은 상태라서 전체 공유 폴더의 노트로 보지 않아요. ## API Key 종류별로 어떤 노트를 다루나요? | API Key 종류 | 다루는 노트 | | ------------------ | ------------------------------------------------------------------------- | | **계정 API Key** | 그 사용자가 앱에서 볼 수 있는 노트와 같아요. 본인의 개인 폴더 노트도 포함해요. | | **워크스페이스 API Key** | 그 워크스페이스에서 전체 구성원에게 공유된 폴더의 노트만 조회하고 변경해요. | | **조직 API Key** | 조직에 소속된 워크스페이스에서, 그 워크스페이스 전체 구성원에게 공유된 폴더의 노트만 조회하고 변경해요. | | **계정 Webhook** | 그 사용자가 현재 접근할 수 있는 모든 워크스페이스에서, 사용자가 접근할 수 있는 노트의 이벤트를 하나의 endpoint로 받아요. | | **워크스페이스 Webhook** | 연결된 워크스페이스에서 전체 구성원에게 공유된 폴더의 노트 이벤트만 받아요. | | **조직 Webhook** | 조직 소속 워크스페이스에서 전체 구성원에게 공유된 폴더의 노트 이벤트만 받아요. | API Key 종류를 구분하는 방법과 발급 절차는 [인증](/ko/developers/fundamentals/authentication)에서 확인하세요. **Scope를 넓혀도 이 범위는 달라지지 않아요.** Scope는 키가 호출할 수 있는 API를 정하고, 이 문서의 범위는 그 API가 어떤 노트에 닿는지를 정해요. `note:read`를 가진 시스템 API Key도 전체 공유 폴더 밖의 노트는 조회하지 못하고, `note:write`를 가졌더라도 그 노트를 바꾸지 못해요. 관리자가 발급한 키도 같아요. ## 범위 밖의 노트는 어떻게 나타나나요? | 호출 | 결과 | | ------------------------------- | ----------------------------------- | | 목록, 검색 | 범위 밖의 노트가 **응답에서 빠져요.** 에러는 나지 않아요. | | 노트 단건 조회 | `404`를 반환해요. | | 노트의 전사, 요약, 문서, 공유 링크, 소속 폴더 조회 | `404`를 반환해요. | | 노트 제목 수정, 공유 링크 생성·삭제, 문서 생성 | `404`를 반환해요. | 범위 밖의 노트는 `403`이 아니라 `404`를 반환해요. 노트가 존재하는지 자체를 알리지 않기 위한 동작이에요. 그래서 **삭제된 노트와 응답이 같아요.** 어제까지 되던 요청이 `404`를 반환하기 시작했다면 그 노트가 전체 공유 폴더 밖으로 이동했는지 먼저 확인하세요. 연동에서 노트 수를 기준으로 동작을 판단한다면, 범위가 좁아졌을 때와 실제로 노트가 없을 때를 구분하지 못할 수 있어요. ## 폴더는 어디까지 다루나요? 시스템 API Key로 할 수 있는 폴더 작업은 **제목 수정, 이동, 순서 변경** 세 가지예요. 폴더 목록·단건 조회, 폴더 삭제, 노트를 폴더에 넣고 빼는 요청은 폴더 종류와 상관없이 계정 API Key만 할 수 있고, 시스템 API Key로 호출하면 `401`을 반환해요. 이 세 작업은 **전체 공유 폴더에만** 할 수 있어요. 개인 폴더나 일부 사람에게만 공유한 폴더를 대상으로 하면 `403`을 반환하고, 옮길 위치로 지정한 상위 폴더에도 같은 조건이 적용돼요. 순서 변경은 목록에 전체 공유 폴더가 아닌 폴더가 하나라도 있으면 요청 전체가 `403`이 되니, 전체 공유 폴더만 골라서 보내세요. 폴더를 옮겨도 공유 범위는 그대로예요. 상위 폴더의 공유 설정을 물려받는 옵션(`sharingTypeUpdateStrategy`)을 보내도 시스템 API Key에서는 적용되지 않아요. **노트가 어느 폴더에 들어 있는지 조회할 때**(`GET /v1/external/notes/{guid}/folders`)는 전체 공유 폴더만 응답에 담겨요. 같은 노트가 구성원의 개인 폴더에도 들어 있다면 그 폴더는 빠져요. 이때는 에러가 나지 않고 목록만 짧아지므로, 폴더 이름으로 분류하는 연동이라면 계정 API Key로 볼 때와 결과가 다를 수 있어요. 노트를 검색할 때 `folderId`로 폴더를 지정하는 경우에도 전체 공유 폴더만 쓸 수 있어요. 개인 폴더의 ID를 지정하면 `404`를 반환해요. ## 이 범위가 적용되지 않는 API는 무엇인가요? **음성 파일 작업**(Voice File Job) API와 `voice_file_job.*` 이벤트(`created`, `completed`, `failed`, `deleted`)는 이 범위의 대상이 아니에요. ## 개인 폴더의 노트가 필요하면 **계정 API Key를 발급해서 사용하세요.** 발급 방법은 [인증](/ko/developers/fundamentals/authentication)을 참고하세요. 연동에 필요한 노트를 전체 공유 폴더로 옮기는 방법도 있어요. ## 기존에 발급한 키는 어떻게 되나요? 이 범위가 적용되기 전에 발급한 시스템 API Key와 등록한 시스템 Webhook은 당분간 예전처럼 동작하고, 차례로 전환될 예정이에요. 그래서 지금 새로 발급한 키가 기존 키보다 노트를 더 적게 반환할 수 있는데 정상이에요. 전환되면 조회 결과가 줄어드는 것뿐 아니라 **폴더 제목 수정·이동·순서 변경이 `403`으로 거부될 수 있어요.** 지금 그 요청이 성공하는 폴더라도 전체 공유 폴더가 아니면 전환 후에는 거부돼요. 전환 대상인 키와 Webhook은 [Tiro Platform](https://platform.tiro.ooo)의 API Keys, Webhooks 화면에서 확인해보세요. # 빠른 시작 Source: https://docs.tiro.ooo/ko/developers/getting-started/quickstart API Key를 발급하고 첫 Tiro API 요청을 보내는 방법. 백엔드에서는 REST API를, Claude나 ChatGPT 같은 AI 클라이언트에서는 MCP Server를 사용하세요. ## API Key 발급 [Tiro Platform API Keys 페이지](https://platform.tiro.ooo/me/api-keys)로 이동해 계정 API Key를 생성하세요. 계정 API Key는 현재 접근할 수 있는 모든 워크스페이스에서 사용자와 같은 권한으로 동작해요. [platform.tiro.ooo/me/api-keys](https://platform.tiro.ooo/me/api-keys)로 이동하세요. **Create New API Key**를 클릭하세요. 점(.)을 포함한 **전체 키**를 복사하세요 — `abc123.xR7mK9pL2qW4...`. 환경 변수로 저장하세요. 생성 대화 상자를 닫으면 다시 볼 수 없어요. API Key는 환경 변수에 저장하세요. 절대 하드코딩하거나 커밋하지 마세요. ## 첫 요청 보내기 노트 목록을 가져옵니다. ```bash cURL theme={"system"} curl -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" \ https://api.tiro.ooo/v1/external/notes ``` ```javascript Node.js theme={"system"} const response = await fetch("https://api.tiro.ooo/v1/external/notes", { headers: { "Authorization": `Bearer ${process.env.TIRO_API_KEY}`, "Content-Type": "application/json", }, }); const data = await response.json(); console.log(`Found ${data.content.length} notes`); ``` ```python Python theme={"system"} import os import requests headers = { 'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}', 'Content-Type': 'application/json' } response = requests.get('https://api.tiro.ooo/v1/external/notes', headers=headers) data = response.json() print(f"Found {len(data['content'])} notes") ``` ```go Go theme={"system"} package main import ( "encoding/json" "fmt" "net/http" "os" ) func main() { client := &http.Client{} req, _ := http.NewRequest("GET", "https://api.tiro.ooo/v1/external/notes", nil) apiKey := os.Getenv("TIRO_API_KEY") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) req.Header.Set("Content-Type", "application/json") resp, _ := client.Do(req) defer resp.Body.Close() var data map[string]interface{} json.NewDecoder(resp.Body).Decode(&data) fmt.Printf("Found %v notes\n", len(data["content"].([]interface{}))) } ``` ```kotlin Kotlin + Spring theme={"system"} @RestController class NotesController { @Value("\${tiro.api.key}") private lateinit var apiKey: String private val restTemplate = RestTemplate() @GetMapping("/my-notes") fun getMyNotes(): ResponseEntity> { val headers = HttpHeaders() headers.set("Authorization", "Bearer $apiKey") headers.contentType = MediaType.APPLICATION_JSON val entity = HttpEntity(headers) val response = restTemplate.exchange( "https://api.tiro.ooo/v1/external/notes", HttpMethod.GET, entity, object : ParameterizedTypeReference>() {} ) val data = response.body!! println("Found ${(data["content"] as List<*>).size} notes") return ResponseEntity.ok(data) } } ``` Tiro는 노트 목록을 페이지네이션된 형태로 반환해요. 각 객체에는 제목, 생성 날짜, 처리 상태, 그리고 전사·요약·문서를 가져올 때 사용하는 `guid`가 담겨 있어요. 이제 목록을 얻었으니 [노트 데이터 모델](/ko/developers/fundamentals/note-data-model)을 읽고 각 `guid`로 무엇을 할 수 있는지 알아보세요 — 전사, 요약, 문서, 폴더까지요. # Tiro 개발자 문서 Source: https://docs.tiro.ooo/ko/developers/index REST API, Webhook, MCP, CLI로 Tiro를 연동하는 방법.

Tiro 개발자 문서

API, Webhook, MCP, CLI 연동 방법을 확인하세요.

노트·전사·요약·음성·문서를 API로 조회하고 관리해요. 노트·요약·문서의 변경 이벤트를 받아요. AI 클라이언트에서 Tiro 노트를 검색하고 읽어요. 셸·CI·임시 에이전트에서 노트를 검색하고 파일로 내보내요.
API Key를 발급하고 첫 요청을 보내세요.
# 조직 단위로 연동하기 Source: https://docs.tiro.ooo/ko/developers/organization/org-integration 조직 API Key로 노트, 워크스페이스, 구성원, 세션 관리. 조직 API Key는 조직 소속 워크스페이스의 노트, 구성원, 세션을 관리하는 서버 간 연동용 키예요. 인증과 웹훅 방식은 일반 API Key와 같고 접근 범위만 달라요. * 인증 방식과 API Key 종류 비교: [인증](/ko/developers/fundamentals/authentication) * 조직 단위 웹훅으로 이벤트를 받는 방법: [Webhook 개요](/ko/developers/webhooks/webhooks-overview) 조직 API Key와 조직 웹훅은 조직 **관리자**만 발급·등록할 수 있어요. ## 조직 API Key는 어디까지 닿나요? 조직 API Key는 조직에 소속된 워크스페이스에 들어 있는 노트에 닿아요. 조직 밖 개인 워크스페이스의 노트에는 닿지 않아요. 조직 API Key는 시스템 API Key라서, 소속 워크스페이스 안에서도 **전체 구성원에게 공유된 폴더의 노트만** 조회해요. 구성원의 개인 폴더에 있는 노트, 일부 구성원에게만 공유한 폴더의 노트, 어느 폴더에도 넣지 않은 노트는 조회 범위에서 빠져요. 자세한 범위는 [시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)에 정리해 두었어요. ## 조직 API Key로 호출할 수 있는 엔드포인트 조직 API Key는 아래 엔드포인트로 조직, 워크스페이스, 구성원 접근과 노트를 관리해요. | 엔드포인트 | 용도 | | ------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | `GET /v1/external/organizations/me` | 키가 연결된 조직 확인 | | `GET /v1/external/workspaces` | 조직 소속 워크스페이스 목록 (조직 키면 전체 반환) | | `GET /v1/external/organizations/me/notes` | 조직 소속 워크스페이스의 종료된 노트 목록 (`endedAfter`·`endedBefore`로 기간 한정, cursor 페이지네이션) | | `GET /v1/external/notes/{noteGuid}` | 개별 노트 메타데이터 조회 | | `GET /v1/external/organizations/me/members`, `GET .../members/{userGuid}` | 조직 구성원과 워크스페이스 배정 조회 | | `PUT`, `DELETE .../members/{userGuid}/recording-suspension` | 구성원 녹음 차단·해제 | | `DELETE .../members/{userGuid}/sessions` | 구성원의 모든 Tiro 세션 무효화 | | `PUT`, `DELETE .../workspaces/{workspaceGuid}/members/{userGuid}` | 기존 조직 구성원의 워크스페이스 배정·역할 변경·해제 | | `GET /v1/external/organizations/me/workspaces` | 조직 워크스페이스 목록·검색 (`query`로 이름 검색, cursor 페이지네이션) | | `POST /v1/external/organizations/me/workspaces` | 워크스페이스 생성 | | `PATCH /v1/external/organizations/me/workspaces/{workspaceGuid}` | 워크스페이스 이름·설명 수정 (`updateMask` 로 변경할 필드만 지정) | | `PATCH /v1/external/organizations/me/workspaces/{workspaceGuid}/quota` | 워크스페이스 사용 한도(분) 설정 | | `DELETE /v1/external/organizations/me/workspaces/{workspaceGuid}` | 워크스페이스 삭제 | ## 워크스페이스를 프로그래밍 방식으로 관리하기 조직 API Key로 워크스페이스를 만들고 수정하거나 삭제할 수 있어요. 사내 프로비저닝 도구나 자동화 스크립트에 사용하세요. * **목록·조회**: `GET .../workspaces`로 조직 소속 워크스페이스를 훑어요. `query`로 이름을 검색하고, `cursor`·`size`로 페이지를 넘겨요. * **생성·수정·삭제**: `POST`로 새 워크스페이스를 만들고, `PATCH .../{workspaceGuid}`로 이름·설명을 바꾸고, `DELETE`로 정리해요. 수정은 `updateMask` 쿼리 파라미터에 바꿀 필드만 적어요 — 예: `?updateMask=name` 이면 이름만 바뀌고 나머지는 그대로예요. * **사용 한도 설정**: `PATCH .../{workspaceGuid}/quota`의 `quotaInMinutes`로 워크스페이스별 녹음 한도를 정해요. `null`이면 무제한, `0`이면 전면 차단, 양수면 그만큼(분)이에요. 조직 한도를 설정해 둔 경우, 워크스페이스 한도의 합이 조직 한도를 넘을 수는 없어요. 조회에는 `workspace:read`, 생성·이름 변경·한도 설정·삭제에는 `workspace:write` scope가 필요해요. scope를 지정하지 않은 키는 모든 작업이 허용돼요 — 자세한 내용은 [인증](/ko/developers/fundamentals/authentication)을 참고하세요. ## 구성원 접근 관리하기 `GET .../members`로 조직에 이미 가입한 구성원을 조회하고, `PUT .../workspaces/{workspaceGuid}/members/{userGuid}`로 워크스페이스와 역할을 배정해요. 같은 PUT을 다시 호출해도 최종 상태는 같아요. `DELETE`로 배정을 해제할 수 있어요. 역할은 `ADMIN`, `MEMBER`, `VIEWER` 중 하나예요. `ADMIN`은 워크스페이스를 관리할 수 있고, `ADMIN`과 `MEMBER`는 seat를 사용하며 녹음할 수 있어요. `VIEWER`는 읽기 전용이고 seat를 사용하지 않으며 녹음할 수 없어요. 남은 seat가 없으면 `ADMIN`·`MEMBER` 배정은 `409`로 거절돼요. 녹음 차단은 `PUT .../recording-suspension`, 해제는 같은 경로의 `DELETE`를 사용해요. `DELETE .../sessions`는 현재 Tiro 세션을 모두 무효화하지만 다시 로그인하는 것까지 막지는 않아요. 지속적으로 접근을 차단하려면 Entra ID 같은 ID 제공자에서도 해당 사용자의 접근을 해제하세요. 구성원 조회에는 `organization_member:read`, 녹음·워크스페이스 배정 변경에는 `organization_member:write`, 세션 무효화에는 `session:write` scope가 필요해요. 이 API는 사용자 생성·초대, 비밀번호 변경, 계정 삭제를 제공하지 않아요. 조직 키는 구성원 전체의 노트와 이름·이메일에 접근하고 구성원의 세션을 강제로 종료할 수 있으므로 보관과 접근 통제에 유의하세요. 유출이 의심되면 즉시 조직 콘솔에서 회수하고 재발급하세요. 키의 secret은 발급 시점에만 표시돼요. ## Next steps API Key 종류별 접근 범위와 발급 방법 이벤트 구조, 재시도 정책, 검증 방법 # Note Source: https://docs.tiro.ooo/ko/developers/schemas/note Note 리소스의 필드와 메타데이터. ## 개요 Note 리소스에는 회의 정보, 참가자, 조직 메타데이터가 들어 있어요. 전사와 텍스트는 paragraphs 엔드포인트에서 조회하세요. ## 메타데이터 카테고리 Note 메타데이터는 다음과 같이 나뉘어요. * **Basic Information**: 제목, 타임스탬프, 소스 타입 * **Recording Details**: 시작/종료 시각, 길이, locales * **Collaboration**: 역할과 식별자를 포함한 collaborator 정보 * **Participants**: note에 태그된 회의 참가자 ## Base shape # Summary And Document Source: https://docs.tiro.ooo/ko/developers/template-based-documents/summary-and-document NoteDocument와 NoteSummary의 차이와 API 지원 범위. ## 개요 Tiro에는 **NoteDocument**와 **NoteSummary**가 있어요. 용도와 생성 방법이 달라요. 전체 Note 구조는 [노트 데이터 모델](/ko/developers/fundamentals/note-data-model)을 참고하세요. Template-based document types in Tiro ## NoteDocument vs NoteSummary | 기능 | NoteDocument | NoteSummary | | -------------- | --------------------------------- | ---------------------- | | **목적** | 구조화된 회의 문서 | 빠른 포맷 템플릿 | | **템플릿** | 회의록 (Meeting Minutes), Custom 템플릿 | One-Pager, Pitch 등 | | **API 지원** | ✅ 전체 지원 | ✅ 전체 지원 | | **Webhook 지원** | ✅ `note_document.*` 이벤트 | ✅ `note_summary.*` 이벤트 | | **생성 방법** | API 또는 Tiro 앱 | Tiro 앱 전용 | ### NoteDocument **NoteDocument**는 섹션으로 나뉜 문서예요. API에서 생성하고 조회하거나 관리할 수 있어요. **주요 특징:** * 정의된 섹션을 가진 템플릿으로 생성 * 사용자 지시문이 포함된 custom 템플릿 지원 * 전체 API CRUD 작업 가능 * 실시간 알림을 위한 Webhook 이벤트 **예시 템플릿:** * 회의록 (Meeting Minutes) * 직접 만드는 custom 템플릿 **API endpoint:** * `POST /v1/external/notes/{noteGuid}/documents` - 문서 생성 * `GET /v1/external/notes/{noteGuid}/documents` - 문서 목록 조회 * `GET /v1/external/notes/{noteGuid}/documents/{documentId}` - 문서 조회 ### NoteSummary **NoteSummary**는 다양한 표현 스타일을 위한 빠른 포맷 템플릿을 제공해요. **주요 특징:** * 특정 사용 사례(pitch, one-pager 등)에 최적화 * 요약 조회를 위한 전체 API 지원 * 실시간 알림을 위한 Webhook 이벤트 * 현재는 Tiro 앱 인터페이스를 통해서만 생성 가능 **예시 템플릿:** * One-Pager * Pitch * 그 외 포맷별 템플릿 **API endpoint:** * `GET /v1/external/notes/{noteGuid}/summaries` - 요약 목록 조회 * `GET /v1/external/notes/{noteGuid}/summaries/{summaryId}` - 콘텐츠가 포함된 요약 조회 **Webhook 이벤트:** * `note_summary.generated` - 요약 생성 완료 * `note_summary.updated` - 요약 수정됨 * `note_summary.deleted` - 요약 삭제됨 # 계정 관련 자주 묻는 질문 Source: https://docs.tiro.ooo/ko/guide/account/faq 로그인 수단, SSO, Apple 계정 통합 등 계정에 대해 자주 묻는 질문을 모았어요. ## 자주 묻는 질문 ### 어떤 방법으로 로그인할 수 있나요? 플랫폼에 따라 지원하는 로그인 수단이 달라요. * **웹·데스크탑 앱**: Google, Microsoft, SSO, 이메일 * **모바일 앱**: Google, Apple, Microsoft, 이메일 이메일 회원가입은 조직(Organization) 단위로 등록된 도메인의 사용자에게 제공돼요. 등록된 도메인이 아니라면 Google이나 Microsoft 로그인을 이용해 주세요. ### 로그인 창의 "SSO로 계속하기"는 어떤 기능인가요? 회사에서 별도로 SSO(통합 로그인) 환경을 설정한 엔터프라이즈 고객 전용 기능이에요. 회사 이메일을 입력하면 회사의 ID 관리 시스템을 통해 티로에 로그인할 수 있어요. SSO를 설정하지 않은 개인·팀은 사용하지 않아도 돼요. 자세한 내용은 [조직 보안 설정](/ko/guide/privacy/enterprise-security)을 참고하세요. ### Apple 아이디로 데스크탑이나 웹 로그인은 안 되나요? Apple 아이디 로그인은 모바일 앱에서만 지원해요. 데스크탑이나 웹에서도 같은 계정을 쓰고 싶다면 아래 계정 통합 절차로 다른 로그인 수단을 연결하면 돼요. 통합 후에도 기존 노트와 구독은 그대로 유지돼요. ### 하나의 계정으로 여러 사람이 동시에 쓸 수 있나요? 같은 노트를 여러 기기에서 동시에 열람하는 건 가능해요. 다만 기록은 한 번에 한 기기에서만 진행되고, 다른 기기에서 새 기록을 시작하면 기존 기록이 종료돼요. 자세한 내용은 [여러 장치에서 사용](/ko/guide/account/multi-device)을 참고하세요. ## 계정 통합하기 (로그인 수단 추가 연결) Apple 아이디로 가입했는데 PC에서도 쓰고 싶거나, 더 이상 접근할 수 없는 이메일로 가입한 경우 계정 통합으로 해결할 수 있어요. 데이터는 옮겨지지 않고, 새 로그인 수단이 기존 계정으로 연결되는 방식이에요. 연결하고 싶은 새 로그인 수단(예: Google 계정)으로 티로에 한 번 로그인(가입)해 주세요. 통합을 위해 필요한 절차예요. 기존에 쓰던 계정의 이메일과 새로 가입한 이메일을 고객문의 또는 [hello@theplato.io](mailto:hello@theplato.io) 로 보내주세요. Apple 아이디는 "이메일 가리기"를 썼다면 앱의 프로필 화면에 표시되는 이메일을 알려주시면 정확해요. 통합 처리가 끝나면 안내를 드려요. 모든 기기에서 한 번 로그아웃한 뒤 새 로그인 수단으로 다시 로그인하면, 기존 노트와 구독이 그대로 보여요. *** **관련 페이지**: [계정 관리 가이드](/ko/guide/account/overview) · [여러 장치에서 사용](/ko/guide/account/multi-device) # 여러 장치에서 사용 Source: https://docs.tiro.ooo/ko/guide/account/multi-device 같은 계정으로 웹, 데스크탑 앱, 모바일 앱에 동시에 로그인해서 쓸 수 있어요. 노트는 서버에 저장되어 모든 기기에서 똑같이 보여요. ## 어디서든 같은 계정으로 티로는 웹, 데스크탑 앱(Windows·Mac), 모바일 앱(iOS·Android)을 모두 지원해요. 같은 계정으로 로그인하면 어느 기기에서든 같은 노트와 같은 플랜을 사용할 수 있어요. * 동시 로그인에 제한이 없어요. 회사 컴퓨터, 노트북, 휴대폰에 모두 로그인해 두고 쓰면 돼요. * 노트는 서버에 저장되어 기기 간에 자동으로 동기화돼요. 데스크탑에서 기록한 노트를 바로 휴대폰에서 열 수 있어요. * 플랜은 계정이 아니라 워크스페이스 단위라서, 어느 기기에서 접속하든 그 워크스페이스의 플랜이 그대로 적용돼요. ## 동시 녹음은 한 기기에서만 한 계정은 한 번에 하나의 기록만 진행할 수 있어요. * 한 기기에서 기록 중일 때 다른 기기에서 새 기록을 시작하면, **새로 시작한 기기가 기록을 이어받고 기존 기기의 기록은 종료돼요.** * 모바일에서는 "현재 다른 기기에서 대화 기록 중입니다"라는 안내가 표시돼요. * 여러 사람이 각자 기록해야 한다면 각자의 계정으로 워크스페이스에 참여하는 방식을 권장해요. [워크스페이스](/ko/guide/workspace/overview)를 참고하세요. ## 로그인한 기기 관리하기 **\[설정]** → **\[로그인된 기기]** 화면에서 지금 계정에 로그인된 기기를 모두 확인하고, 쓰지 않는 기기를 원격으로 로그아웃시킬 수 있어요. 휴대폰을 잃어버렸거나 공용 컴퓨터에 로그인한 채로 자리를 떴을 때 안전하게 정리할 수 있어요. * 지금 쓰는 기기는 맨 위에 **\[지금 사용 중]** 표시와 함께 보여요. 이 기기는 여기서 로그아웃하지 않아요. * **\[다른 기기]** 목록에서 각 기기의 **\[로그아웃]** 버튼을 누르면 그 기기만 로그아웃돼요. * **\[다른 모든 기기에서 로그아웃]** 행을 누르면 이 기기를 **제외한** 모든 기기에서 한 번에 로그아웃돼요. * 로그아웃해도 노트는 서버에 그대로 남아 있어서, 다시 로그인하면 똑같이 보여요. 로그인된 기기 설정 화면. 현재 기기 Chrome·macOS에 '지금 사용 중' 표시, 빨간 '다른 모든 기기에서 로그아웃' 행, 다른 기기 목록(MacBook Pro·iPhone 15 Pro·Galaxy Book)에 각각 로그아웃 버튼이 있는 화면 ## 자주 묻는 질문 ### 한 계정을 팀원들과 같이 써도 되나요? 같은 노트를 여러 기기에서 동시에 열람하는 건 가능하지만, 동시에 기록할 수는 없고 개인 설정과 보안 측면에서도 권장하지 않아요. 팀이라면 각자 계정으로 한 워크스페이스에 모이는 게 안전하고 편해요. ### 기기마다 설정이 따로 적용되나요? 화자 분리, 다시 듣기 같은 계정 설정은 모든 기기에 공통으로 적용돼요. 음성파일 로컬 저장처럼 기기 자체에 저장하는 설정은 해당 기기에서만 동작해요. ### 데스크탑에서 기록하던 중에 휴대폰에서 기록을 시작했더니 데스크탑 기록이 멈췄어요. 의도된 동작이에요. 한 계정은 한 번에 하나의 기록만 유지돼서, 나중에 시작한 기기가 기록을 이어받아요. 기존 기기의 기록 내용은 그대로 노트에 남아 있어요. ### 기기를 잃어버렸어요. 그 기기만 로그아웃할 수 있나요? 네. 다른 기기에서 **\[설정]** → **\[로그인된 기기]** 화면을 열고, 잃어버린 기기의 **\[로그아웃]** 버튼을 누르면 그 기기만 로그아웃돼요. 계정 비밀번호가 걱정되면 함께 변경하는 걸 권장해요. *** **관련 페이지**: [계정 관리 가이드](/ko/guide/account/overview) · [계정 FAQ](/ko/guide/account/faq) · [앱 안내](/ko/guide/start/download) # 계정 관리 가이드 Source: https://docs.tiro.ooo/ko/guide/account/overview 계정 하나로 여러 워크스페이스를 오가며 쓸 수 있어요. 계정 단위로 따라다니는 것과 워크스페이스 단위로 분리되는 것을 정리했어요. ## 계정이란? 계정은 로그인할 때 쓰는 이메일과 그에 연결된 프로필 정보예요. 한 계정으로 여러 워크스페이스를 만들거나 합류할 수 있어요. 결제와 구성원, 노트는 워크스페이스마다 독립적이지만, 내 프로필과 개인 단어장, 개인 템플릿은 어느 워크스페이스에서든 동일하게 따라다녀요. ## 계정 단위 vs 워크스페이스 단위 | 항목 | 단위 | | -------------------------------------------- | -------------------------------------------- | | 프로필, 개인 단어장, 개인 템플릿, 대화 참석자, 연동(캘린더·Slack 등) | **계정** (어느 워크스페이스에서든 동일) | | 공유받은 노트 | **계정** (사이드바 상단 한곳에 모임) | | 노트, 플랜·결제, 구성원, 워크스페이스 단어장·템플릿 | **워크스페이스** (공간마다 독립) | | 무료 체험 | **계정** (가입 시 1회 제공, 새 워크스페이스를 만들어도 추가 제공 없음) | 노트는 기록한 시점의 워크스페이스에 귀속되고, 한 계정이 여러 워크스페이스에서 각각 다른 플랜을 쓸 수 있어요. ## 계정 정보 수정하기 사이드바 상단 프로필 아이콘으로 설정을 열고 **\[내 계정]** 메뉴로 들어가세요. * **기본 정보**: 이름, 직책, 소개, 회사명, 회사 소개를 수정할 수 있어요. 입력한 정보는 티로가 맥락으로 활용해 더 정확하게 기록해요. * **비밀번호 변경**: 이메일 방식으로 로그인하는 경우에만 표시돼요. 새 비밀번호는 8자 이상이어야 해요. * **표시 언어**: 언어 설정은 **\[기본 설정]** 메뉴에 있어요. * **로그인 이메일**: 직접 변경할 수 없어요. 변경이 필요하면 고객 지원으로 문의해 주세요. 다른 로그인 수단을 같은 계정에 연결하는 방법은 [계정 FAQ](/ko/guide/account/faq)의 계정 통합을 참고하세요. ## 계정 삭제하기 설정의 **\[내 계정]** → **\[고급 설정]** → **\[계정 삭제]** 버튼에서 삭제할 수 있어요. 본인 이메일을 입력해 확인하면 진행돼요. * 삭제는 되돌릴 수 없어요. 필요한 노트는 미리 내보내거나 다른 곳에 옮겨두세요. * 본인이 만든 노트 중 팀 폴더에 공유된 노트는 워크스페이스에 남고, 작성자 표기만 익명으로 바뀌어요. * 계정과 개인 데이터는 복구 불가능한 상태로 제거돼요(최장 30일 이내). 모바일 인앱 결제로 구독 중이라면 계정 삭제와 별개로 App Store / Google Play에서 직접 구독을 취소해야 해요. 활성 인앱 구독이 남아 있으면 계정 삭제가 진행되지 않으니, 스토어에서 구독을 해지한 뒤 다시 시도해 주세요. ## 자주 묻는 질문 ### 같은 이메일로 계정을 여러 개 만들 수 있나요? 아니요, 이메일 하나당 하나의 티로 계정만 만들 수 있어요. 공간을 분리하고 싶다면 같은 계정 안에서 워크스페이스를 새로 만드세요. ### 회사 이메일로 가입했는데 회사를 떠나면 계정도 잃나요? 계정은 이메일에 연결되어 있어서, 그 이메일에 접근할 수 없게 되면 로그인이 제한될 수 있어요. 이직 등으로 접근이 어려워졌다면 고객문의나 [hello@theplato.io](mailto:hello@theplato.io) 로 알려주시면 계정 통합으로 도와드려요. ### 계정을 삭제하면 팀원들이 보던 내 노트는 어떻게 되나요? 팀 폴더에 공유해둔 노트는 그 워크스페이스에 남아요. 작성자 표기만 익명으로 바뀌고, 다른 구성원은 내용을 계속 볼 수 있어요. *** **관련 페이지**: [계정 FAQ](/ko/guide/account/faq) · [여러 장치에서 사용](/ko/guide/account/multi-device) · [워크스페이스](/ko/guide/workspace/overview) # 캘린더 연동 Source: https://docs.tiro.ooo/ko/guide/automation/calendar Google 캘린더와 MS Outlook 일정을 티로에 연결하면, 예정된 일정에서 클릭 한 번으로 제목과 참석자가 채워진 노트가 만들어져요. ## 캘린더 연결하기 웹·데스크탑 앱의 **\[설정]** → **\[캘린더 관리]** 메뉴에서 Google 캘린더 또는 MS Outlook 계정을 연결하세요. 메인 화면의 캘린더 연동 배너에서 **\[연동하기]** 버튼을 눌러도 같은 화면으로 이동해요. * 여러 계정을 추가로 연동할 수 있어요. * 한 계정 안의 여러 캘린더(공유 캘린더 포함) 중 어떤 캘린더를 메인 화면에 보여줄지 캘린더별로 켜고 끌 수 있어요. * 티로는 일정을 읽기만 해요. 일정을 만들거나 수정하지 않아요. 모바일 앱은 Google 계정으로 로그인한 경우 앱 안에서 캘린더를 연결할 수 있어요. 연동 관리는 웹·데스크탑에서 해주세요. ## 일정에서 바로 노트 만들기 캘린더를 연결하면 메인 화면 위쪽 **\[예정된 일정]** 영역에 연결된 캘린더의 일정이 시작 시간순으로 표시돼요. 가까운 일정 5개가 먼저 보이고, **\[일정 전체 보기]** 버튼을 누르면 나머지 일정까지 펼쳐서 볼 수 있어요. 메인 화면의 예정된 일정 목록. 곧 시작 배지가 붙은 첫 일정에 미팅 참여와 노트 생성 버튼이 표시된 화면 오늘 일정에는 **\[미팅 참여]**, **\[노트 생성]** 버튼이 붙어요. 1시간 안에 시작하거나 이미 진행 중인 일정은 버튼이 항상 보이고, 오늘의 다른 일정은 마우스를 올리면 나타나요. * **노트 생성**: 일정 제목이 노트 제목으로, 일정을 수락한 참석자의 이메일이 대화 참석자로 자동 입력된 노트가 만들어져요. * **미팅 참여**: 일정에 Google Meet 같은 회의 링크가 있을 때만 보여요. 누르면 회의 링크가 새 탭에서 열려요. 일정 왼쪽의 색 막대는 그 일정이 속한 캘린더의 색이에요. 캘린더를 여러 개 연결했다면 어느 캘린더의 일정인지 색으로 구분할 수 있어요. Slack 같은 외부 도구에서 만든 일정도 연결된 Google 캘린더 또는 Outlook 캘린더에 저장되어 있다면 같은 방식으로 표시돼요. Slack과 티로가 직접 연결되는 것은 아니며, 티로는 연결된 캘린더에 저장된 일정을 읽어와요. 일정이 보이지 않는다면 **\[설정]** → **\[캘린더 관리]** 메뉴에서 일정이 저장된 계정과 캘린더가 연결되어 있고, 메인 화면에 표시하도록 켜져 있는지 확인해 주세요. ## 미팅 전 알림 받기 데스크탑 앱을 쓰면 미팅 시작 10분 전에 알림을 받을 수 있어요. 알림을 받자마자 바로 기록을 시작하면 회의 첫 마디부터 놓치지 않아요. 데스크탑 앱이 없다면 [앱 안내](/ko/guide/start/download)에서 설치할 수 있어요. ## 자주 묻는 질문 ### Outlook 캘린더도 되나요? 네, 웹·데스크탑 앱에서 Google 캘린더와 MS Outlook 모두 연동할 수 있어요. ### 공유 캘린더의 일정도 볼 수 있나요? 네, 연동한 계정이 접근할 수 있는 캘린더라면 **\[캘린더 관리]** 메뉴에서 켜서 메인 화면에 표시할 수 있어요. ### 티로가 내 일정을 수정하나요? 아니요, 티로는 일정을 읽기 전용으로만 가져와요. 캘린더의 일정을 만들거나 바꾸지 않아요. ### 캘린더 연동을 해제하고 싶어요. 웹·데스크탑 앱의 **\[설정]** → **\[캘린더 관리]** 메뉴에서 연동된 계정을 관리하고 해제할 수 있어요. *** **관련 페이지**: [실시간 대화기록](/ko/guide/recording/live) · [대화 참석자 관리](/ko/guide/recording/participants) # 폴더 자동화 Source: https://docs.tiro.ooo/ko/guide/automation/folders 폴더에 노트 제목, 참석자, 맞춤문서, 자동 공유를 미리 지정해두면 그 폴더의 모든 노트에 자동으로 적용돼요. 반복 회의가 완전 자동화돼요. ## 언제 쓰면 좋은가요? * 매주 반복되는 회의의 제목과 참석자를 매번 입력하기 번거로울 때 * 특정 회의는 항상 같은 맞춤문서 템플릿으로 정리되길 원할 때 * 회의가 끝나면 노트가 자동으로 Slack에 공유되길 원할 때 폴더에 설정을 한 번 해두면, 그 폴더에서 만드는 모든 새 노트에 자동으로 적용돼요. 본인이 만들었거나 편집자 권한이 있는 폴더에서 설정할 수 있어요. ## 설정하기 폴더 옆 **\[⋯]** 버튼 → **\[폴더 설정]** → 자동화 탭에서 설정해요. * **노트 제목**: 이 폴더에서 만드는 새 노트의 기본 제목이에요. * **참석자**: 노트 생성 시 자동으로 추가될 참석자예요. * **맞춤문서**: 기록이 종료될 때 자동으로 생성할 템플릿이에요. 여러 개를 복수 선택할 수 있어요. 템플릿 만드는 법은 [템플릿](/ko/guide/notes/templates)을 참고하세요. * **자동 공유 설정(선택)**: 기록 종료 후 자동으로 공유할 Slack 채널을 연결해요. 자세한 내용은 [공유 자동화](/ko/guide/automation/sharing)를 참고하세요. 적용 시점은 두 단계예요. 폴더에서 노트를 만들 때 제목과 참석자가 채워지고, 기록이 종료되면 맞춤문서 생성과 자동 공유가 차례로 실행돼요. ## 자주 묻는 질문 ### 노트 하나에만 템플릿을 미리 지정할 수 있나요? 노트 단위 사전 지정은 지원하지 않아요. 폴더 단위로 지정한 뒤 그 폴더에서 노트를 만들어 주세요. ### 이미 폴더에 있던 기존 노트에도 적용되나요? 기본 제목과 참석자는 노트를 만들 때 적용되므로 기존 노트에는 소급되지 않아요. Slack 자동 공유는 기록이 끝나는 시점의 폴더를 기준으로 실행돼요. 아직 기록 중인 노트를 자동 공유 폴더로 옮긴 뒤 기록을 종료하면 자동 공유 대상이 되지만, 이미 기록이 끝난 노트를 옮겨도 자동 공유가 다시 실행되지는 않아요. ### 누가 폴더 자동화를 설정할 수 있나요? 폴더를 만든 사람과 편집자 권한이 있는 구성원이 설정할 수 있어요. 폴더 권한은 [폴더](/ko/guide/sharing/folders)를 참고하세요. *** **관련 페이지**: [공유 자동화](/ko/guide/automation/sharing) · [템플릿](/ko/guide/notes/templates) · [폴더](/ko/guide/sharing/folders) # 공유 자동화 Source: https://docs.tiro.ooo/ko/guide/automation/sharing 조건에 맞는 노트의 기록이 끝나면 Slack 채널에 자동으로 공유돼요. 주간 회의 노트를 매번 손으로 올릴 필요가 없어요. ## 언제 쓰면 좋은가요? * 제목에 특정 키워드가 들어가는 회의를 항상 같은 채널에 공유할 때 (예: "주간 회의") * 특정 폴더에서 만들어지는 모든 노트를 자동으로 공유할 때 현재 Slack을 지원해요. 기록이 종료되는 시점에 트리거가 실행되어, 노트의 공유 링크와 메시지가 채널에 게시돼요. ## 자동 공유 설정하기 **\[설정]** → **\[연동 관리]** → Slack → 자동 공유 설정에서 트리거를 만들어요. 트리거는 이름과 함께 세 가지를 정해요. 노트 제목 조건 또는 폴더 조건 중 하나를 선택해요. * **Is**: 제목이 입력한 값과 정확히 일치할 때 * **Contains**: 제목에 키워드가 포함될 때 * **In**: 쉼표로 구분해 입력한 여러 제목 중 하나와 정확히 일치할 때 * **Is Not**: 제목이 특정 값이 아닐 때 * **Not Contains**: 제목에 특정 키워드가 없을 때 * **폴더 Is**: 특정 폴더에서 만들어진 모든 노트 연동된 Slack 워크스페이스의 채널 하나를 선택해요. 비공개 채널은 그 채널에서 `/invite @Tiro`로 봇을 초대하면 선택할 수 있어요. 함께 게시할 메시지(선택, 최대 1000자)와 공유할 문서를 골라요. 대화 기록, 스크립트, 템플릿 문서를 복수 선택할 수 있고, 선택한 문서가 없으면 기록 종료 시 자동 생성돼서 공유돼요. 만든 트리거는 언제든 끄고 켤 수 있어요. 자동 공유로 게시되는 링크는 비밀번호가 없는 공개 공유 링크예요. 링크가 있는 사람은 누구나 노트를 볼 수 있으니, 민감한 회의는 자동 공유 대상에서 제외하세요. ## 자주 묻는 질문 ### 하나의 노트가 여러 트리거 조건에 맞으면 어떻게 되나요? 조건이 맞는 모든 트리거가 각각 실행돼요. 같은 문서를 여러 트리거가 선택했다면 문서는 한 번만 생성돼요. ### 폴더 조건과 제목 조건을 함께 쓸 수 있나요? 하나의 트리거에는 하나의 조건만 설정할 수 있어요. 두 조건이 모두 필요하면 트리거를 각각 만들어 주세요. ### In 조건에 키워드를 넣었는데 실행이 안 돼요. In은 쉼표로 구분한 여러 제목 중 하나와 **정확히 일치**할 때 실행돼요. "제목에 포함되면 실행"을 원한다면 Contains 조건을 사용하세요. ### 폴더 단위로 더 많은 걸 자동화하고 싶어요. 폴더에는 자동 공유 외에도 기본 제목·참석자·맞춤문서를 미리 지정할 수 있어요. [폴더 자동화](/ko/guide/automation/folders)를 참고하세요. *** **관련 페이지**: [폴더 자동화](/ko/guide/automation/folders) · [연동](/ko/guide/sharing/integrations) · [공유](/ko/guide/sharing/overview) # Tiro API & MCP & CLI 사용 안내 Source: https://docs.tiro.ooo/ko/guide/notes/api-mcp-cli 티로의 노트와 위키를 외부 시스템, AI 에이전트, 터미널에서 그대로 활용할 수 있어요. 모든 플랜에서 추가 과금 없이 제공돼요. **티로는 API·MCP·CLI 세 가지로 노트·위키를 외부에서 다룰 수 있어요.** **API**는 프로그래밍 방식 연동(노트 조회·음성 처리·웹훅), **MCP**는 Claude 같은 AI 에이전트에 티로를 컨텍스트로 연결, **CLI**는 터미널·자동화 스크립트용이에요. 모든 플랜에서 추가 과금 없이 쓸 수 있고, 연결 방법·토큰 발급은 [개발자 문서](/ko/developers)에 정리돼 있어요. ## Tiro API 노트 조회·검색, 음성 파일 처리, 웹훅(Webhooks) 등 Tiro의 데이터를 외부 시스템에서 프로그래밍 방식으로 활용할 때 사용해요. 폴더(Folder), 단어장(Word Memory) 등 주요 리소스에 대한 API도 제공됩니다. ## Tiro MCP Claude 등 MCP(Model Context Protocol)를 지원하는 AI 에이전트에서 Tiro 노트와 위키를 컨텍스트로 바로 활용할 때 사용해요. 예를 들어 AI 에이전트에 "이번 주 미팅 내용 요약해줘"라고 요청할 수 있어요. 노트 제목 변경, 폴더 제목·설명·색상 변경, 폴더 이동·순서 변경도 MCP에서 바로 할 수 있어요. 수정 기능은 Tiro Platform에서 발급한 API Key로 연결했을 때 사용할 수 있어요. 편집 권한이 있는 노트와 폴더만 수정할 수 있어요. ## Tiro CLI CLI에서 Tiro 노트를 다룰 때 사용해요. 노트를 검색하거나 트랜스크립트를 파일로 내려받을 수 있어서, MCP 서버를 연결할 수 없는 자동화 스크립트·CI 환경에서 유용합니다. ## 자세한 사용법은 개발자 문서에서 확인하세요 인증 방법, API Key 발급, API 엔드포인트, 웹훅 이벤트, MCP 서버 연결 방법 등 상세한 사용법은 [개발자 문서](/ko/developers/fundamentals/api-overview)에 정리되어 있어요. MCP 도구별 명세는 [MCP 도구 문서](/ko/developers/mcp/tools/wiki)를 참고하세요. ## 자주 묻는 질문 ### 누구나 사용할 수 있나요? 네, 모든 플랜에서 쓸 수 있어요. 로그인 방법도 가리지 않아요. 구글·애플·마이크로소프트·이메일(비밀번호)·기업용 SSO(Enterprise SSO) 가운데 어느 방식으로 가입했든 API·MCP·CLI를 똑같이 사용할 수 있어요. 인증이 로그인 방식과 별개인 API Key나 토큰으로 이뤄지기 때문이에요. ### API Key는 어디서 발급하나요? Tiro 계정이 있으면 [platform.tiro.ooo/me/api-keys](https://platform.tiro.ooo/me/api-keys)의 API Key 화면에서 계정 API Key를 발급할 수 있어요. 특정 플랜 이상이어야 발급되는 제한은 없어요. 계정 API Key는 현재 접근할 수 있는 모든 워크스페이스에서 내 권한으로 동작해요. 워크스페이스 공용 키는 그 워크스페이스에서 키 발급 권한이 있을 때 발급돼요. ### 추가 과금이 있나요? 아니요. 티로 API·MCP·CLI는 추가 과금이 없어요. 티로 요금은 음성을 텍스트로 바꾸는 처리(STT)와 대량 AI(LLM) 사용량을 기준으로 매겨지는데, API·MCP·CLI는 이미 만들어진 노트와 트랜스크립트를 조회하고 검색할 뿐 새로 STT나 AI 생성을 일으키지 않기 때문이에요. 다만 과도한 호출을 막기 위한 호출 한도(rate limit)가 있고, 한도를 넘으면 잠시 후 다시 시도하면 돼요. 앞으로 파일 업로드나 실시간 녹음을 처리하는 API가 추가되면, 그 기능은 STT·AI 사용을 일으킬 수 있어 따로 안내하고 과금될 수 있어요. *** **관련 페이지**: [위키](/ko/guide/notes/wiki) · [Ask Tiro](/ko/guide/notes/ask-tiro) · [티로를 AI와 연결하기](/ko/guide/start/ai-connect) # Ask Tiro Source: https://docs.tiro.ooo/ko/guide/notes/ask-tiro 노트 하나든 전체 노트든, 기록된 대화에 대해 무엇이든 물어보세요. AI가 출처와 함께 답해드려요. ## Ask Tiro로 할 수 있는 일 Ask Tiro는 내 노트를 근거로 답하는 AI 채팅이에요. 질문 범위가 두 가지예요. * **이 노트에 묻기**: 열려 있는 노트의 내용을 바탕으로 답해요. "주요 결정사항 알려줘", "해야 할 일 정리해줘"처럼 물어보세요. * **전체 노트에 묻기**: 워크스페이스에 쌓인 노트 전체를 검색해서 답해요. "최근 2주간의 미팅을 요약해줘", "이번 주에 해야 하는 액션 아이템 정리해줘"처럼 기간을 걸친 질문이 가능해요. 입력창에서 **@ 기호**를 입력하면 특정 노트나 폴더를 참조 대상으로 지정할 수 있어요. 답변에는 출처 번호가 붙고, 번호를 클릭하면 근거가 된 노트의 해당 문단으로 바로 이동해 하이라이트로 보여줘요. ## Ask Tiro 여는 법 * **웹·데스크탑 앱**: 노트 목록 화면 우상단의 Ask Tiro 패널 버튼을 누르면 오른쪽에 채팅 패널이 열려요. 폴더 안에서 열면 그 폴더가 자동으로 참조 대상이 돼요. 노트 상세 화면에서는 우측 사이드바에서 그 노트에 대해 바로 물어볼 수 있어요. 데스크탑 앱은 단축키 `alt+a`로도 열 수 있어요. * **모바일 앱**: 노트 화면의 **\[Ask Tiro]** 탭에서 그 노트에 대해 질문할 수 있어요. 기록이 진행 중일 때도 물어볼 수 있어요. 전체 노트를 대상으로 한 질문과 @참조는 웹·데스크탑 앱에서 제공돼요. 모바일 앱은 노트 단위 질문을 지원해요. ## 이렇게 물어보세요 처음이라면 빈 화면의 추천 질문으로 시작해 보세요. * **한 노트에 대해**: "주요 내용을 알려줘" · "해야 할 일을 정리해줘" · "주요 결정사항들을 알려줘" · "핵심만 한 줄로 요약해줘" * **전체 노트에 대해**: "최근 2주간의 미팅을 요약해줘" · "최근 3주간 가장 많이 언급된 키워드는?" · "이번 주에 해야 하는 액션 아이템을 정리해줘" · "최근 노트들의 주요 결정사항을 정리해줘" 대화는 세션으로 보존돼서 이전 채팅을 이어가거나 새 대화를 시작할 수 있고, 답변 내용은 복사 버튼으로 바로 가져갈 수 있어요. 생성 중인 답변은 중지할 수도 있어요. ## 자주 묻는 질문 ### 사용 횟수에 제한이 있나요? 유료 플랜은 노트 기록 기반의 AI 채팅을 무제한으로 사용할 수 있어요. 무료 체험 중에도 전 기능을 사용할 수 있어요. ### 답변이 정확한지 어떻게 확인하나요? 답변에 붙은 출처 번호를 클릭하세요. 근거가 된 노트의 문단으로 바로 이동해서 원문을 확인할 수 있어요. Ask Tiro는 노트에 없는 내용을 지어내지 않도록 기록을 검색해서 답해요. ### 기록 중에도 질문할 수 있나요? 네, 기록이 진행 중일 때도 Ask Tiro를 열어 질문할 수 있어요. ### 노트 안에서 특정 단어만 빨리 찾고 싶어요. AI 채팅 대신 키워드 검색이 빠를 때가 있어요. 웹·데스크탑에서 노트를 열고 `cmd+F`(Windows는 `ctrl+F`)를 누르면 노트 내 검색을 쓸 수 있어요. ### 위키와는 어떻게 연결되나요? 위키가 활성화된 워크스페이스에서는 Ask Tiro가 노트와 함께 위키의 사람·주제·결정 정보를 참고해 더 정확하게 답해요. 자세한 내용은 [위키](/ko/guide/notes/wiki)를 참고하세요. *** **관련 페이지**: [위키](/ko/guide/notes/wiki) · [API·MCP·CLI 안내](/ko/guide/notes/api-mcp-cli) · [기본 노트](/ko/guide/notes/document) # 음성파일 관리 Source: https://docs.tiro.ooo/ko/guide/notes/audio-manage 휴대폰에 저장된 녹음 파일을 한곳에서 재생하고, 노트로 변환하고, 백업하고, 삭제할 수 있어요. ## 전체 음성 파일 화면 열기 모바일 앱의 **\[설정]** → **\[관리]** 섹션에서 **\[전체 음성 파일]** 메뉴를 누르세요. 기기에 저장된 오프라인 녹음 파일이 날짜별로 정리되어 있고, 사용 중인 저장 용량도 함께 표시돼요. 제목으로 검색할 수 있고, 화면을 아래로 당기면 새로고침돼요. ## 할 수 있는 일 * **\[파일 재생]**: 변환하기 전에 녹음 내용을 들어볼 수 있어요. * **\[노트로 만들기]**: 아직 변환하지 않은 녹음을 업로드해 텍스트 노트로 변환해요. 사용량은 이때 차감돼요. * **\[선택]** 모드: 헤더의 선택 버튼을 누르면 파일을 골라 다음 작업을 할 수 있어요. * **다운로드**: Android는 다운로드 폴더에 저장되고, iOS는 공유 시트로 파일 앱 등에 저장할 수 있어요. 한 번에 1개씩 가능해요. * **공유**: 텍스트 변환 없이 음성만 다른 앱으로 내보내요. 한 번에 1개씩 가능해요. * **삭제**: 선택한 파일을 삭제해요. 삭제한 오디오 파일은 되돌릴 수 없어요. 노트를 삭제할 때도 그 노트의 오디오 파일이 함께 삭제되니, 음성을 남기고 싶다면 삭제 확인 창의 **\[오디오 백업하기]** 버튼으로 먼저 내보내 주세요. ## 파일은 어떻게 보관되나요? * 녹음 파일은 티로 앱 전용 저장 공간에 보관돼요. * 직접 만든 오프라인 녹음 파일은 삭제하기 전까지 보관돼요. * 실시간 기록 중에 저장된 음성도 삭제하기 전까지 보관돼요. 다만 기기의 남은 저장 공간이 부족하면 새로 녹음한 음성이 기기에 저장되지 않을 수 있으니, 남기고 싶은 음성은 미리 다운로드해 두세요. ## 자주 묻는 질문 ### 여러 파일을 한 번에 공유할 수 있나요? 공유와 다운로드는 한 번에 1개씩 가능해요. 여러 파일이 필요하면 하나씩 내보내 주세요. ### 녹음만 해두고 변환을 안 하면 사용량이 차감되나요? 아니요, 사용량은 **\[노트로 만들기]** 버튼으로 변환하는 시점에 차감돼요. 자세한 내용은 [오프라인 녹음](/ko/guide/recording/offline)을 참고하세요. ### 저장 공간이 부족하다고 나와요. 전체 음성 파일 화면에서 필요 없는 녹음을 삭제하면 공간이 확보돼요. 중요한 파일은 다운로드로 백업한 뒤 삭제하세요. *** **관련 페이지**: [오프라인 녹음](/ko/guide/recording/offline) · [문단별 다시 듣기](/ko/guide/notes/replay) · [음성파일 로컬 저장](/ko/guide/notes/local-audio) # 기본 노트 Source: https://docs.tiro.ooo/ko/guide/notes/document 기록이 끝나면 한 페이지 문서, 대화 기록, 스크립트가 자동으로 만들어져요. 어디에 무엇이 담기는지, 어떻게 고치고 활용하는지 알아보세요. ## 노트는 이렇게 구성돼요 기록이 끝난 노트에는 세 가지가 담겨요. * **한 페이지 문서**: 대화 전체를 핵심 주제별로 구조화한 요약이에요. 회의에 참석하지 않은 사람도 이 문서만 읽으면 내용을 따라잡을 수 있도록 만들어져요. 기록이 종료되면 자동으로 생성돼요. * **대화 기록**: 기록 중 실시간으로 쌓인 문단별 요약이에요. 문장이 어느 정도 쌓이면 한 문단으로 정리되고, 문단이 나뉜 뒤에 더 좋은 품질로 다듬어져요. * **스크립트**: 발화를 그대로 받아 적은 전체 원문이에요. [화자 분리](/ko/guide/recording/diarization)를 켰다면 화자 태그도 여기에 붙어요. 한 페이지 문서 자동 생성이 필요 없다면 **\[설정]** → **\[기본 설정]** 메뉴의 **\[노트 종료 후 자동 요약 생성]** 토글로 끌 수 있어요. ## 내용 고치기 대화 기록과 스크립트는 언제든 직접 수정할 수 있어요. 잘못 인식된 단어나 이름을 발견하면 해당 문단을 클릭해서 바로 고치세요. 고친 내용은 이후에 생성하는 문서에도 반영돼요. ## 맞춤 문서 만들기 기본 요약 외에 회의록, 인터뷰 정리, 강의 노트처럼 특정 형식의 문서가 필요하면 **\[맞춤 문서 생성]** 버튼을 누르세요. 1. 기록이 종료된 노트에서 **\[맞춤 문서 생성]** 버튼을 눌러요. 2. 티로가 준비해둔 기본 템플릿이나 직접 만든 템플릿 중에서 고르면, 대화 내용이 그 형식에 맞춰 문서로 정리돼요. 3. 스크립트를 수정했거나 다른 언어·다른 형식으로 다시 만들고 싶다면 재생성 버튼으로 언제든 새로 만들 수 있어요. 원하는 형식의 템플릿을 직접 만드는 방법은 [템플릿](/ko/guide/notes/templates)에서 자세히 다뤄요. ## 자주 묻는 질문 ### 대화 기록과 스크립트는 뭐가 다른가요? 스크립트는 발화 전체를 그대로 받아 적은 원문이고, 대화 기록은 그 내용을 문단 단위로 요약한 거예요. 대화 중 놓친 부분을 빠르게 훑을 땐 대화 기록을, 정확한 발언을 확인할 땐 스크립트를 보세요. ### 맞춤 문서 생성 버튼이 안 보여요. 맞춤 문서는 기록이 종료된 뒤에 생성할 수 있어요. 기록을 종료했는데도 보이지 않는다면 화면을 새로고침해 보세요. ### 한 페이지 문서가 자동으로 안 만들어져요. **\[설정]** → **\[기본 설정]** 메뉴에서 **\[노트 종료 후 자동 요약 생성]** 토글이 켜져 있는지 확인하세요. 꺼져 있어도 **\[맞춤 문서 생성]** 버튼으로 언제든 문서를 만들 수 있어요. ### 문단 요약이 처음엔 어색했다가 나중에 좋아져요. 정상 동작이에요. 기록 중에는 빠르게 임시 요약을 만들고, 문단이 완성된 뒤 내용을 곱씹어 더 좋은 품질로 다듬어요. *** **관련 페이지**: [한 페이지 문서](/ko/guide/notes/one-page) · [템플릿](/ko/guide/notes/templates) · [화자 분리](/ko/guide/recording/diarization) # 음성파일 로컬 저장 Source: https://docs.tiro.ooo/ko/guide/notes/local-audio 실시간 기록의 음성 파일을 서버에 올리지 않고 내 컴퓨터에만 자동 저장해요. 원본 음성을 직접 보관하고 싶을 때 사용하세요. 음성파일 로컬 저장은 데스크탑 앱 전용 기능이에요. 웹 설정에서는 미리보기만 표시돼요. ## 로컬 저장 켜는 법 데스크탑 앱의 **\[설정]** → **\[기본 설정]** 메뉴에서 **\[음성 파일 로컬 저장]** 토글을 켜세요. 이후 실시간 대화 기록을 할 때마다 음성 파일이 내 컴퓨터에 자동으로 저장돼요. * 음성 파일은 기록한 사용자의 기기에만 저장되고, **서버에는 저장되지 않아요.** * 저장 위치는 내 문서 폴더의 `Tiro/recordings`이고, WAV 형식으로 저장돼요. * 최근에 기록된 파일부터 일정 개수까지 보관되고, 오래된 파일은 자동으로 정리돼요. ## 저장된 음성 내려받기 로컬에 음성이 저장된 노트는 노트 상단에 **\[음성파일 다운로드]** 버튼이 표시돼요. 기록이 진행 중일 때는 일시정지한 뒤 내려받을 수 있어요. 데스크탑에서 오프라인 녹음을 했다면 저장 창에서 원하는 위치에 노트 제목으로 저장돼요. ## 문단별 다시 듣기와는 어떻게 다른가요? 두 기능은 서로 독립적으로 켜고 끌 수 있어요. * **음성파일 로컬 저장**: 음성을 내 컴퓨터에만 통째로 보관해요. 서버 업로드가 없어 원본을 직접 관리하고 싶을 때 적합해요. * **[문단별 음성 다시 듣기](/ko/guide/notes/replay)**: 음성을 서버에 저장하고 노트의 문단 단위로 어느 기기에서든 재생해요. ## 자주 묻는 질문 ### 저장된 음성이 서버로 올라가나요? 아니요, 로컬 저장 음성은 기록한 기기에만 남아요. 서버 저장이 필요하면 문단별 음성 다시 듣기를 따로 켜면 돼요. ### 웹 브라우저에서도 쓸 수 있나요? 데스크탑 앱 전용이에요. 웹 설정에서는 안내만 표시되고 동작하지 않으니, 필요하면 [데스크탑 앱](/ko/guide/start/download)을 설치해 주세요. ### 오래된 녹음이 사라졌어요. 저장 공간 관리를 위해 최근 파일부터 일정 개수까지만 보관하고 오래된 파일은 자동으로 삭제돼요. 오래 보관할 파일은 저장 폴더에서 다른 위치로 옮겨두세요. *** **관련 페이지**: [문단별 다시 듣기](/ko/guide/notes/replay) · [음성파일 관리](/ko/guide/notes/audio-manage) · [개인정보 보호 및 보안](/ko/guide/privacy/overview) # 한 페이지 문서 Source: https://docs.tiro.ooo/ko/guide/notes/one-page 회의에 참석하지 않은 사람도 이 문서 하나로 내용을 따라잡을 수 있어요. 기록이 끝나면 자동으로 만들어지는 티로의 기본 요약이에요. ## 한 페이지 문서가 뭔가요? 한 페이지 문서는 대화 전체를 핵심 주제별로 구조화한 요약 문서예요. 시간 순서대로 나열하는 대신 주제 단위로 묶어 정리하기 때문에, 미팅에 참여하지 않은 사람이 읽어도 마치 그 자리에 있었던 것처럼 주요 내용을 이해할 수 있게 만드는 것이 목표예요. * 기록이 종료되면 자동으로 생성돼요. * 기록 언어로 설정한 언어로 작성돼요. ## 자동 생성 켜고 끄기 **\[설정]** → **\[기본 설정]** 메뉴의 **\[노트 종료 후 자동 요약 생성]** 토글로 제어할 수 있어요. 꺼두면 기록 종료 시 자동으로 만들어지지 않고, 필요할 때 **\[맞춤 문서 생성]** 버튼으로 직접 만들면 돼요. ## 원하는 형식으로 바꾸기 한 페이지 문서의 기본 형식이 너무 길거나 원하는 구성과 다르다면, 형식을 직접 정의할 수 있어요. 1. [템플릿](/ko/guide/notes/templates)에서 원하는 섹션 구성으로 나만의 템플릿을 만들어요. 간결한 요약을 원하면 그렇게 지침을 적으면 돼요. 2. 노트에서 **\[맞춤 문서 생성]** 버튼을 눌러 그 템플릿을 선택하면, 같은 대화가 내 형식대로 정리돼요. 맥락에 "요약은 간결하게", "전문 용어는 영어 그대로" 같은 요청을 적어두면 한 페이지 문서의 톤에도 반영돼요. 자세한 내용은 [맥락](/ko/guide/recording/context)을 참고하세요. ## 자주 묻는 질문 ### 한 페이지 문서가 예전보다 길어졌어요. 간략한 형식으로 되돌릴 수 있나요? 기본 형식은 "참석하지 않은 사람도 이해할 수 있는 상세한 요약"을 목표로 개선됐어요. 간략한 요약을 선호한다면 템플릿 관리에서 원하는 형식의 맞춤 템플릿을 만들어 사용할 수 있어요. 만드는 방법은 [템플릿](/ko/guide/notes/templates)을 참고하세요. ### 기록이 끝났는데 한 페이지 문서가 안 보여요. **\[설정]** → **\[기본 설정]** 메뉴에서 **\[노트 종료 후 자동 요약 생성]** 토글이 꺼져 있지 않은지 확인하세요. 꺼져 있었다면 **\[맞춤 문서 생성]** 버튼으로 지금 바로 만들 수 있어요. ### 스크립트를 수정했는데 문서에 반영이 안 돼요. 문서는 생성 시점의 내용을 기준으로 만들어져요. 스크립트를 고친 뒤에는 문서를 다시 생성하면 수정된 내용이 반영돼요. *** **관련 페이지**: [기본 노트](/ko/guide/notes/document) · [템플릿](/ko/guide/notes/templates) · [맥락](/ko/guide/recording/context) # 문단별 다시 듣기 Source: https://docs.tiro.ooo/ko/guide/notes/replay 스크립트의 각 문단에서 그 구간의 원본 음성을 바로 재생할 수 있어요. 받아쓰기가 정확한지 원문으로 확인할 때 유용해요. ## 다시 듣기 켜는 법 **\[설정]** → **\[기본 설정]** 메뉴에서 **\[문단별 음성 다시 듣기]** 토글을 켜세요. 현재 Beta로 제공되는 기능이에요. 이 기능을 켜면 음성 파일이 저장돼요. 개인정보 보호를 위해 녹음 전에 대화 상대의 동의를 꼭 받아주세요. ## 문단 음성 재생하기 * **웹·데스크탑 앱**: 노트 본문이나 스크립트의 문단에 마우스를 올리면 나타나는 툴바에서 헤드폰 모양의 **\[음성 재생하기]** 버튼을 누르세요. 문단 아래에 플레이어가 열려요. * **모바일 앱**: 문단의 타임스탬프(시간 표시)를 탭하면 그 구간의 플레이어가 열려요. 오디오가 있는 문단에만 재생 표시가 보여요. 모든 기록 방식에서 동작해요. 실시간 기록은 문단별로 저장된 음성을, 음성파일 업로드와 오프라인 녹음은 원본 음성에서 해당 문단 구간을 재생해요. ## 미리 알아두세요 * **소급 적용되지 않아요.** 토글을 켠 이후에 기록된 문단부터 다시 듣기가 가능해요. 켜기 전에 만든 노트의 문단은 음성이 저장되지 않아 재생할 수 없어요. * 음성파일 업로드와 오프라인 녹음은 **변환 시점에 토글이 켜져 있어야** 원본 음성이 보관돼요. 꺼진 상태로 변환하면 원본 음성은 변환 후 폐기돼요. * 웹·데스크탑에서는 토글이 켜져 있어야 재생 버튼이 보여요. * 조직 관리자가 다시 듣기 음성의 보관 기간을 정할 수 있어요. 기간이 지나 음성이 삭제돼도 대화 내용과 노트는 그대로 남아요. ## 자주 묻는 질문 ### 예전에 만든 노트는 왜 다시 듣기가 안 되나요? 다시 듣기는 토글을 켠 이후의 기록부터 적용돼요. 켜기 전에 만든 노트는 음성이 저장되어 있지 않아 재생할 수 없어요. ### 저장된 음성은 어디에 보관되나요? 티로 서버에 암호화되어 저장되고, 어느 기기에서든 노트를 열면 재생할 수 있어요. 서버에 올리지 않고 내 컴퓨터에만 음성을 남기고 싶다면 [음성파일 로컬 저장](/ko/guide/notes/local-audio)을 참고하세요. ### 설정에서 토글이 비활성화되어 있어요. 조직 정책에 따라 이 기능이 제한된 워크스페이스가 있어요. "조직 정책에 따라 이 기능을 사용할 수 없어요"라고 표시되면 워크스페이스 관리자에게 문의하세요. ### 예전에는 들을 수 있었는데 지금은 재생되지 않아요. 조직에서 설정한 음성 보관 기간이 지났을 수 있어요. 이 기간은 이전 녹음에도 적용돼요. 기간이 지난 음성은 복구할 수 없지만, 대화 내용과 노트는 계속 확인할 수 있어요. *** **관련 페이지**: [음성파일 로컬 저장](/ko/guide/notes/local-audio) · [음성파일 관리](/ko/guide/notes/audio-manage) · [개인정보 보호 및 보안](/ko/guide/privacy/overview) # 템플릿 Source: https://docs.tiro.ooo/ko/guide/notes/templates 회의록, 인터뷰, 평가표처럼 반복되는 문서 형식을 템플릿으로 만들어두면 클릭 한 번으로 어떤 노트든 그 형식으로 정리돼요. ## 템플릿은 세 종류예요 * **개인 템플릿**: 내가 만들어 나만 쓰는 템플릿이에요. 다른 워크스페이스로 옮겨도 따라오고, 다른 구성원에게는 보이지 않아요. * **워크스페이스 공유 템플릿**: 같은 워크스페이스 구성원 누구나 쓸 수 있는 템플릿이에요. 템플릿 관리에서 **\[\{워크스페이스 이름} 공유 템플릿]** 영역에 모여요. * **티로 라이브러리**: 강의 노트, 회의록, 채용 인터뷰 등 티로가 미리 만들어둔 기본 템플릿 모음이에요. 그대로 쓰거나 **\[내 템플릿으로 복제]** 버튼으로 가져와 수정할 수 있어요. ## 템플릿 만들기 사이드바 프로필 메뉴의 **\[템플릿 관리]** 메뉴를 누르거나, 노트의 **\[맞춤 문서 생성]** → **\[모든 템플릿 보기]** 메뉴로 들어가서 **\[새 템플릿]** 버튼을 누르세요. 템플릿을 새로 만들거나 수정하는 기능은 데스크탑 웹·앱에서 제공돼요. 템플릿은 섹션 단위로 구성해요. 문서 목적에 맞춰 섹션을 추가하고, 섹션 제목을 입력하면 최종 문서에 그대로 반영돼요. "회의 결과", "해야 할 일"처럼 명확하게 붙이면 좋아요. 섹션을 어떤 방식으로 정리할지 네 가지 타입 중에 골라요. * **\[Q\&A]**: 미리 준비한 질문을 붙여 넣으면 대화에서 답을 찾아 정리해요. 채용·세일즈 인터뷰처럼 질문지가 정해진 자리에 좋아요. * **\[액션 아이템]**: 누가, 언제까지, 무엇을 해야 하는지 할 일을 추출해 정리해요. * **\[예시 문서]**: 평소 쓰는 문서의 원문을 붙여 넣으면 그 형식·말투·구성을 그대로 따라 만들어요. URL이 아니라 문서 원문을 복사해 붙여 넣어야 해요. * **\[일반 텍스트]**: 위 타입에 안 맞으면 원하는 정리 방식을 자유롭게 지침으로 적어요. **\[개인]** 범위로 저장하거나 **\[\{워크스페이스 이름}에 공유하기]** 옵션으로 구성원 전체에 공유할 수 있어요. 저장 후에도 템플릿 상세에서 범위를 바꿀 수 있고, 범위 변경과 수정·삭제는 그 템플릿을 만든 사람만 할 수 있어요. ## 노트에 템플릿 적용하기 * **노트에서 바로**: 기록이 종료된 노트에서 **\[맞춤 문서 생성]** 버튼을 누르고 템플릿을 고르면 그 형식의 문서가 만들어져요. * **폴더에 미리 지정**: 폴더 설정의 자동화에서 맞춤문서 템플릿을 지정해두면, 그 폴더의 새 노트가 기록 종료될 때 자동으로 해당 형식의 문서가 만들어져요. 노트 단위로는 미리 지정할 수 없어요. 자세한 내용은 [폴더 자동화](/ko/guide/automation/folders)를 참고하세요. ## 자주 묻는 질문 ### 티로 기본 템플릿을 고쳐서 쓸 수 있나요? 네, 티로 라이브러리의 템플릿에서 **\[내 템플릿으로 복제]** 버튼을 누르면 내 템플릿으로 복사돼요. 복사본은 자유롭게 수정할 수 있어요. ### 워크스페이스 공유 템플릿은 누가 수정할 수 있나요? 사용은 구성원 누구나 할 수 있지만, 수정·삭제와 공유 범위 변경은 그 템플릿을 만든 사람만 할 수 있어요. ### 예시 문서 타입에 노션 링크를 넣었는데 안 돼요. URL은 읽지 못해요. 문서를 열어 원문 내용을 복사한 뒤 그대로 붙여 넣어 주세요. 티로가 마크다운, 말투, 구성을 파악해 같은 형태로 만들어요. ### 모바일에서도 템플릿을 만들 수 있나요? 템플릿을 만들고 수정하는 기능은 데스크탑 웹·앱에서 제공돼요. 만들어둔 템플릿으로 맞춤 문서를 생성하는 건 모바일에서도 가능해요. *** **관련 페이지**: [기본 노트](/ko/guide/notes/document) · [한 페이지 문서](/ko/guide/notes/one-page) · [폴더 자동화](/ko/guide/automation/folders) # 위키 Source: https://docs.tiro.ooo/ko/guide/notes/wiki 회의 기록에서 사람·주제·결정을 자동으로 정리해 조직의 지식 지도를 만드는 기능이에요. Pro 플랜 이상에서 사용할 수 있는 기능입니다. ## 1. 위키가 무엇인가요? ### 회의에서 흘러가던 조직의 언어를 잡아둡니다 조직마다 고유한 언어가 있습니다. "결제 시스템 개편 프로젝트", "지난번 보류한 가격 인상 결정"처럼, 같은 사람·결정·주제가 서로 다른 회의에서 반복해서 등장하고, 반복될 때마다 모호한 언어들 사이의 관계가 조금씩 명확해져 갑니다. 문제는 이 언어가 회의가 끝나는 순간 대부분 휘발된다는 점입니다. 시간을 들여 회의록을 다시 펴 보지 않으면, 다음 회의에서는 맥락을 잃은 채 또 처음부터 시작해야 합니다. 티로에서 선보이는 새로운 기능인 위키는 이렇게 휘발되던 언어와 관계들을 자동으로 잡아 정리합니다. 별도로 정리하실 필요 없이 노트를 작성하시기만 하면, 등장한 사람·주제·결정이 페이지로 정리되고, 그 사이의 관계가 **개인과 조직의 맥락과 지식을 표현하는 지도**로 만들어집니다. 물론 직접 위키의 내용을 수정하시거나 연결 관계를 바꾸실 수도 있어요. #### 기록에서 위키로, 위키에서 에이전트로 티로는 세 단계로 팀의 대화를 자산으로 바꿉니다. 1. **기록:** 회의·통화·메모를 녹음하고 자동으로 받아쓰기·요약합니다. 2. **위키:** 그 기록에 흩어진 사람·결정·주제를 우리 조직의 언어로 정리합니다. 3. **에이전트:** 정리된 언어를 바탕으로 AI가 우리 팀 맥락을 알고 일합니다. MCP, API, CLI 등 에이전트가 접근할 수 있는 다양한 도구들을 지원하고 있어요. 회의록은 조직의 AI 전환에 있어 끝이 아니라 시작입니다. 위키는 기록과 에이전트 사이에서, 발화 즉시 사라져 버리는 대화를 언제든 다시 활용할 수 있는 지식으로 남깁니다. 회의를 할수록, 노트가 쌓일수록 위키는 자연스럽게 자라납니다. 처음에는 페이지 몇 개로 시작해서, 노트가 200개·1,000개가 되면 그 사이를 잇는 관계가 또렷해집니다. 위키는 똑똑하게 동작해서, 기존에 티로가 생성한 위키들을 사용자가 지우거나 연결 관계를 수정한다면, 이를 이해하고 변경된 위키의 내용에 맞추어 자라나도록 만들어졌어요. ### 위키는 어떻게 구성되어 있나요? 위키는 네 가지 요소로 구성됩니다. 1. **페이지:** 노트에서 추출된 사람·주제·결정 단위입니다. 위키에 올라오는 페이지(노드)는 아래 세 종류로 나뉩니다. 1. 회의에 등장한 **사람** 2. 반복해서 언급되는 **주제** 3. 합의된 **결정** 2. **출처:** 그 페이지가 어느 노트의 어느 발언에서 나왔는지 가리키는 링크입니다. 클릭하면 해당 노트 문단으로 바로 이동하면서 하이라이트됩니다. 3. **관계:** 페이지와 페이지 사이의 연결입니다. 동료, 보고대상, 소속, 관련처럼 관계마다 종류가 붙습니다. 4. **개인 설명문:** 같은 페이지라도 사람마다 다르게 정리할 수 있는, 본인만 볼 수 있는 설명입니다. 처음에는 AI가 초안을 써 드리고, 그 위에 자유롭게 편집하실 수 있습니다. ### 위키가 왜 필요한가요 위키의 가치는 AI 에이전트와 함께 쓸 때 가장 분명해집니다. 크게 세 가지입니다. 1. **AI가 우리 팀 맥락을 알고 정확히 답합니다.** 위키가 없으면 AI는 노트 수백 개의 전체 대화 스크립트를 통째로 훑어, 그럴듯해 보이지만 실제로는 틀린 답(할루시네이션)을 내놓기 쉽습니다. 위키가 있으면 AI는 먼저 해당 페이지를 찾아, 정확한 출처와 관계를 따라 답하고, 모르는 건 모른다고 답합니다. 2. **AI 답변이 빠르고 가벼워집니다.** 정확한 페이지와 관계만 전달하니 AI가 처리할 양이 줄고, 답도 더 빠르게 옵니다. 노트가 1만 개를 넘어가면, 위키가 있고 없고가 답이 나오느냐 마느냐의 차이가 되기도 합니다. 3. **AI가 어디서 답을 찾았는지 추적할 수 있습니다.** AI가 어느 페이지의 어느 출처를 따라갔는지 확인할 수 있어, 잘못 연결된 부분을 찾아 고치면 다음부터는 정확한 답이 돌아옵니다. 위키는 조직에 흩어져 있던 말들을 잘 정돈된 형태로 모아 두고, 사람이 쉽게 고치고 관리할 수 있게 해 줍니다. 그 위에서 AI 에이전트가 더 정확하게, 더 가볍게, 그리고 믿을 수 있게 동작합니다. ### 누구에게 도움이 되나요 * **혼자 쓰실 때:** 내 생각·사람·주제의 지도가 됩니다. 한 달 전에 어떤 결정을 했는지, 누구와 어떤 얘기를 나눴는지가 사라지지 않습니다. * **팀과 쓰실 때:** 매번 처음부터 설명하지 않아도 통하는 공동의 언어가 됩니다. 새 구성원 온보딩, 반복되는 회의, 1:1 준비, 분기 회고가 훨씬 빨라집니다. * **AI와 함께 쓰실 때:** Ask Tiro와 Claude 같은 AI 에이전트가 우리 팀 맥락을 알고, 그럴듯한 답이 아니라 정확한 답을 가져옵니다. ## 2. 위키는 어떻게 사용하나요? 위키는 **Pro 플랜 이상**에서 쓰실 수 있습니다. Lite 또는 Free 플랜을 사용 중이시라면 플랜 업그레이드 안내가 표시됩니다. 위키 추출과 AI 활용은 Pro 플랜 이상의 구독 플랜에 포함되어 있으며, 별도 추가 비용은 없습니다. (팀 플랜과 엔터프라이즈 플랜도 사용하실 수 있습니다.) ### 위키를 활성화하기 위키는 위키 기능을 명시적으로 활성화한 워크스페이스에 한해 제공됩니다. 1. 워크스페이스 사이드바에서 **\[위키]** 메뉴로 들어갑니다. 2. 위키 활성화 안내를 확인하고 활성화합니다. 3. 활성화 시점부터 최근 **3개월치 노트**를 가공해 시작 위키를 구성합니다. 시점에 따라 다르지만 보통 1\~2시간 정도 소요됩니다. 모든 Pro 플랜 이상 워크스페이스에서 활성화하실 수 있습니다. 3개월 이전의 노트들도 위키에 반영하고 싶으시다면 [hello@theplato.io](mailto:hello@theplato.io) 로 문의 주시면 개별적으로 안내드립니다. ### 위키 화면 둘러보기 위키는 크게 세 화면으로 보실 수 있습니다. #### 페이지 목록 워크스페이스에 쌓인 사람·주제·결정 페이지가 한곳에 모입니다. 검색으로 원하는 페이지를 바로 찾으실 수 있습니다. 위키 홈에서는 전체 페이지 수와 연결 수, 그래프 미리보기를 한눈에 보실 수 있습니다. #### 페이지 상세 한 페이지를 열면 출처, 관계, 별칭, 개인 설명문을 함께 봅니다. * **출처:** 그 페이지가 어느 노트의 어느 발언에서 나왔는지 보여줍니다. 클릭하면 해당 노트 문단으로 바로 이동합니다. * **관계:** 이 페이지가 다른 어떤 사람·주제·결정과 이어져 있는지 보여줍니다. * **별칭:** 같은 대상을 가리키는 다른 이름을 함께 묶어 보여줍니다. * **개인 설명문:** 본인만 볼 수 있는 설명입니다. AI 초안 위에 직접 편집하실 수 있습니다. #### 위키 그래프 사람·주제·결정이 관계선으로 이어진 지도입니다. 노드에 마우스를 올리면 연결과 정의가 드러나고, 노드를 클릭하거나 끌어서 자세히 볼 수 있습니다. 대화가 더해질 때마다 그래프는 스스로 자라납니다. ### 위키 정리하기 #### 위키는 자동으로 채워집니다 노트를 작성하시는 순간부터 위키가 자동으로 채워집니다. 별도로 페이지를 만드실 필요가 없습니다. 한 노트에서 여러 번 언급되거나 직접 추가하신 항목이 페이지가 됩니다. 노트가 쌓일수록 위키는 자동으로 자라납니다. 보통 노트를 마친 뒤 1\~2분 안에 페이지가 정리되며, 노트를 새로 끝내거나, 다시 녹음·재요약하거나, 파일을 새로 업로드하면 위키가 갱신됩니다. #### 위키 직접 정리하기 자동 정리가 완벽하지 않을 때는 직접 다듬으실 수 있습니다. 직접 정리하신 내용은 항상 자동 정리보다 우선합니다. 페이지 상세에서 **\[페이지 작업]** 메뉴를 열면 아래의 작업을 하실 수 있습니다. * **이름 바꾸기·별칭 추가:** 페이지 이름을 다듬거나, A 명칭과 B 명칭이 같은 대상이라고 별칭으로 묶습니다. * **이 페이지 머지:** 같은 대상이 두 페이지로 나뉘었을 때 하나로 합칩니다. 별칭·관계·출처가 모두 옮겨집니다. * **자동 추출 차단:** 위키에 올라오지 않았으면 하는 페이지를 자동 추출에서 제외합니다. * **페이지 삭제:** 페이지와 연결된 별칭·관계를 지웁니다. 노트에 남은 원래 멘션은 사라지지 않습니다. 미리 두고 싶은 사람·주제가 있으면 페이지를 **직접 추가**하실 수도 있습니다. 이후 관련 노트가 쌓일 때 출처가 자동으로 연결됩니다. #### 티로가 정리를 제안해드려요 자동 정리가 쌓이다 보면 비슷한 페이지가 둘로 나뉘거나, 한 번 언급되고 다시 쓰이지 않는 페이지가 생깁니다. 티로는 이렇게 정리하면 좋을 페이지를 직접 찾아 제안해 드립니다. 제안은 한 번에 몇 개씩 묶여서 오고, 확인하고 수락하신 것만 위키에 반영됩니다. 한 번에 전부 바뀌는 것이 아니라, 보시고 고르는 방식입니다. **어떤 페이지가 정리 대상이 되나요?** 두 가지를 제안해 드립니다. * **합치기(병합) 제안:** 같은 대상이 이름이나 별칭이 겹쳐 두 페이지로 나뉜 경우, 하나로 합치자고 제안합니다. 합치면 별칭·관계·출처가 남는 페이지로 모두 옮겨집니다. * **삭제 제안:** 다른 노트나 페이지와 거의 이어지지 않은 고립된 페이지를 정리하자고 제안합니다. 삭제해도 노트에 남은 원래 멘션은 사라지지 않습니다. 직접 손대신 페이지는 제안에서 빠집니다. 별칭을 달거나, 관계를 잇거나, 개인 설명문을 쓰신 페이지는 직접 정리하신 것으로 보아 제안 대상에서 제외됩니다. 직접 정리하신 내용이 항상 우선한다는 원칙은 여기서도 같습니다. ### Ask Tiro · MCP · CLI · REST API에서 위키 쓰기 위키는 화면에서 둘러보는 것에 그치지 않습니다. Ask Tiro 안에서, Claude 같은 AI 에이전트 안에서, 터미널에서 바로 쿼리하실 수 있습니다. #### Ask Tiro Ask Tiro에게 질문하시면, 노트뿐 아니라 위키의 사람·주제·결정을 함께 참고해서 답합니다. > 지난 분기에 티로 PM이 내린 결정 정리해줘 Ask Tiro가 위키의 "티로 PM" 페이지에서 결정 관계를 따라가, 시간 순으로 정리한 답변을 출처와 함께 보여 드립니다. 위키가 쌓일수록 답변이 더 정확해집니다. 위키가 활성화되어 있다면 Ask Tiro가 상황에 맞게 알아서 위키에 접근하여 위키 기반으로 답변합니다. #### Claude · 외부 AI 에이전트 (MCP) Claude Desktop 또는 Claude Code에서 Tiro MCP를 연결하시면 아래 도구가 바로 동작합니다. | 도구 | 무엇을 하나요 | | ---------------- | ------------------------------------ | | `search_wiki` | 워크스페이스 위키를 키워드로 검색합니다. | | `get_wiki_page` | 특정 페이지의 상세·출처·관계를 한 번에 가져옵니다. | | `get_wiki_graph` | 한 페이지를 중심으로 인접한 사람·주제·결정 그래프를 가져옵니다. | 각 도구의 파라미터와 응답 형식 등 자세한 명세는 [개발자 문서의 Wiki 도구 페이지](/ko/developers/mcp/tools/wiki)에서 확인하실 수 있어요. 예를 들어 Claude에게 이렇게 물어보세요. > 이번 주 회의에서 결제 시스템 개편 얘기가 어디에 나왔어? 결정된 게 있으면 정리해줘. #### Tiro CLI 터미널에서 바로 위키를 검색·조회하실 수 있습니다. 사내에서 외부 AI 사용이 제한된 환경이거나, 자체 워크플로우에 위키 데이터를 끼워 넣고 싶을 때 유용합니다. ```bash theme={"system"} # 위키 검색 tiro wiki search "결제 시스템" --workspace <워크스페이스 ID> # 특정 페이지 상세 tiro wiki page <페이지 ID> --workspace <워크스페이스 ID> # 워크스페이스 목록 tiro wiki workspaces # 이 페이지가 근거한 노트 문단 tiro wiki mentions <페이지 ID> --workspace # 이웃 그래프 tiro wiki graph <페이지 ID> --mode around --workspace # 개요 그래프 tiro wiki graph --mode seed --type CONCEPT --workspace ``` 설치와 인증은 `tiro auth login` 한 번이면 됩니다. 자세한 안내는 [Tiro API & MCP & CLI 사용 안내](/ko/guide/notes/api-mcp-cli)를 참고해 주세요. #### REST API 직접 자동화 워크플로우를 만들고 싶으시면, 위키의 모든 데이터를 REST API로 조회하실 수 있습니다. 페이지 목록, 페이지 상세, 그래프, 검색까지 모두 동일한 권한 모델로 제공됩니다. 자세한 명세는 [개발자 문서](/ko/developers/fundamentals/api-overview)를 참고해 주세요. ## 3. 위키의 보안과 권한 위키의 보안은 **노트 권한**에서 출발합니다. 위키를 통해 원래 열람할 수 없었던 노트 정보가 보이게 되는 일은 없습니다. 각자에게는 **자신이 볼 수 있는 범위만큼의 위키**만 보입니다. 노트 열람 권한이 없는 계정에게는 노트의 정보가 어디에도 노출되지 않습니다. ### 위키는 워크스페이스 단위입니다 * 서로 다른 워크스페이스는 서로 다른 위키를 가집니다. * 한 워크스페이스의 구성원은 다른 워크스페이스의 위키 페이지·관계·출처를 어느 것도 볼 수 없습니다. * 같은 사람이 두 워크스페이스에 등장하면, 각 워크스페이스에 별도의 페이지가 만들어집니다. ### 노트 권한을 그대로 따릅니다 * 워크스페이스 구성원은 위키의 페이지·관계·출처를 함께 봅니다. * 본인이 접근할 수 없는 노트의 발화는 위키 어디에서도 보이지 않습니다. 페이지 자체는 보이더라도, 권한 없는 노트에서 나온 출처는 자동으로 빠집니다. * 워크스페이스에서 나가시거나 노트 협업자에서 제외되시면, 그 노트가 만든 정보는 더 이상 보이지 않습니다. * 노트를 삭제하시면 그 노트의 출처·관계·검색 결과가 모두 사라집니다. ### 개인 설명문은 본인만 봅니다 개인 설명문은 같은 페이지라도 사람마다 다르게 보입니다. 본인이 쓴 설명문은 본인에게만 보입니다. 워크스페이스 관리자도, 티로 운영자도 다른 사람의 개인 설명문에 접근할 수 없습니다. 개인 설명문은 앱의 권한 검증과 개인 키 암호화, 두 단계로 보호됩니다. ### 예시로 보는 권한 흐름 #### 팀에서 함께 쓸 때 팀 워크스페이스에서 회의 노트를 쌓으면, 그 노트에 접근할 수 있는 구성원들은 같은 사람·주제·결정 페이지를 함께 봅니다. 다만 비공개로 진행한 1:1 노트처럼 본인만 접근할 수 있는 노트에서 나온 출처는, 권한이 없는 다른 구성원에게는 보이지 않습니다. 페이지가 보이더라도 그 출처만 가려집니다. #### 개인이 쓰다가 협업자(collaborator)를 추가할 때 개인이 워크스페이스에서 노트를 쌓아 위키를 만들어 두었다가, 어떤 노트에 동료를 **Collaborator**(협업자)로 추가하면, 그때부터 그 동료는 해당 노트에서 나온 페이지의 출처를 볼 수 있게 됩니다. 반대로 협업자에서 제외하면, 그 노트가 만든 출처는 그 동료에게 다시 보이지 않습니다. 이 경우에도 개인 설명문은 공유되지 않습니다. ### 데이터는 어떻게 저장되고 보호되나요 * 위키 데이터는 국내(서울) 리전 안에만 저장됩니다. * 저장 구간과 전송 구간 모두 암호화되며, 개인 설명문처럼 민감한 정보는 본인만 열 수 있도록 한 번 더 잠급니다. * 음성 원본은 위키에 저장되거나 전달되지 않습니다. 위키는 텍스트로 정리된 노트 본문만 입력으로 받습니다. * 위키를 만드는 데 쓰이는 AI는 고객 데이터로 모델을 학습시키지 않습니다. 엔터프라이즈 보안 검토(데이터 위치, 컴플라이언스, 부속 처리자 등)가 필요하시면 영업팀 또는 보안 검토 자료 요청 양식으로 문의해 주세요. ### 위키 데이터 내보내기 본인 워크스페이스의 위키 데이터는 언제든 내보내실 수 있습니다. 내보낸 데이터는 **JSON** 형식입니다. 페이지(이름·종류·별칭), 각 페이지의 출처, 페이지 사이의 관계, 그리고 본인이 쓴 개인 설명문이 담깁니다. * 위키 화면의 **\[내보내기]** 메뉴에서 JSON 파일로 일괄 다운로드합니다. * REST API · MCP · CLI로도 같은 JSON 데이터를 받으실 수 있습니다. ## 자주 묻는 질문 **Q. 노션 같은 위키와 무엇이 다른가요?** 노션 위키는 사람이 직접 써서 채웁니다. 티로의 위키는 회의·통화·미팅의 대화에서 자동으로 자라납니다. 사람·프로젝트·고객이 언급될 때마다 연결되고, 반복 등장하는 대상에는 우리 회사에서의 뜻이 붙습니다. 따로 정리하지 않아도 일하는 만큼 채워진다는 점이 다릅니다. **Q. 노트를 다른 워크스페이스로 옮기면 위키도 따라가나요?** 원래 워크스페이스의 위키에서는 그 노트의 흔적이 정리되고, 새 워크스페이스의 위키에 그 노트의 사람·주제·결정이 새로 정리됩니다. **Q. 노트 본문을 직접 편집하면 위키도 같이 바뀌나요?** 노트를 처음 끝낸 시점, 다시 녹음·재요약하신 시점, 파일을 새로 업로드하신 시점에 위키가 갱신됩니다. 본문만 살짝 손보신 경우에는 다음 갱신 때까지 이전 상태로 남을 수 있습니다. # 조직 보안 설정 Source: https://docs.tiro.ooo/ko/guide/privacy/enterprise-security SSO 로그인 통합, 접속 IP 제한, 개인정보 마스킹, 공유 링크 통제까지. 조직의 보안 요구사항에 맞춰 워크스페이스를 구성할 수 있어요. 엔터프라이즈 플랜에서 제공하는 기능이에요. ## 어떤 보안을 제공하나요? 조직 보안 설정은 네 가지 축으로 구성돼요. * **인증**: SAML SSO로 사내 계정 체계와 로그인을 통합해요. * **접근 통제**: 접속 IP를 제한하고, 공유 링크의 공개 범위를 정책으로 통제해요. * **개인정보**: 노트에 기록되는 전화번호·이메일 같은 개인정보를 마스킹 정책으로 가릴 수 있어요. * **기반 보안**: 저장 데이터 암호화, 서울 리전 저장, AI 학습 미사용 같은 기반 보안은 전 플랜 공통이에요. [개인정보 보호 및 보안](/ko/guide/privacy/overview)을 참고하세요. ## SSO로 로그인 통합하기 SAML 기반 SSO를 지원해요. Okta, Azure AD(Microsoft Entra ID) 같은 IdP와 연동하면 구성원이 사내 계정으로 티로에 로그인할 수 있어요. * SSO 전용 운영도 가능해요. 이메일·소셜 로그인 같은 다른 방법을 차단하면 계정 관리가 IdP에서 한 번에 끝나요. * 외부 인증 서비스에 직접 접근할 수 없는 폐쇄망 환경도 지원해요. IdP 연동 설정은 도입 과정에서 함께 진행해요. ## 조직 네트워크로 접속 제한하기 워크스페이스 접속을 허용된 IP에서만 가능하도록 제한할 수 있어요. 사내망이나 VPN을 거친 접속만 허용하는 구성이에요. 조직 방화벽에 등록할 고정 IP가 필요한 경우도 지원해요. 구체적인 구성은 도입 시 협의해요. ## 개인정보 마스킹 켜기 조직 정책으로 개인정보 마스킹을 켜면, 새로 만드는 노트의 대화 기록과 문서에서 전화번호, 이메일, 주민등록번호 같은 개인정보가 자동으로 가려져요. 콜센터처럼 고객 개인정보가 대화에 자주 등장하는 환경을 위한 옵션이에요. 마스킹 여부는 노트를 만드는 시점에 정해져요. 정책을 켜면 그 뒤에 만드는 노트부터 적용되고, 이미 저장된 노트에는 적용되지 않아요. 옵션이 열린 조직은 조직 관리자가 조직 설정의 **\[보안]** 탭에 있는 **\[개인정보 마스킹]** 토글로 직접 켜고 끌 수 있어요. ## 공유 링크 통제하기 공유 링크의 공개 범위 상한, 최대 유효기간, 허용된 회사 도메인을 정책으로 관리하고, 공유 중인 링크를 한곳에서 회수할 수 있어요. 자세한 동작은 [링크 공유 보안](/ko/guide/sharing/link-security)을 참고하세요. ## 자주 묻는 질문 ### 보안 검토 자료를 받을 수 있나요? 예, 가능해요. 티로는 ISO/IEC 27001:2022 인증을 보유하고 있고 SOC 2 Type 1·Type 2 심사를 모두 완료했어요. 감사 보고서와 데이터 위치, 하위 처리자 목록 같은 보안 검토 자료는 NDA 체결 후 제공돼요. 영업팀에 문의해 주세요. ### 데이터를 특정 리전에만 저장할 수 있나요? 노트 데이터는 기본으로 AWS 서울 리전에 저장돼요. 전용 VPC나 다른 리전이 필요하면 계약 시 협의할 수 있어요. ### 도입 절차는 어떻게 되나요? 도입 문의를 남기면 영업팀이 조직의 보안 요구사항을 확인하고 맞춤 구성을 함께 설계해요. 맞춤형 온보딩 세션과 핫라인도 제공돼요. *** **관련 페이지**: [개인정보 보호 및 보안](/ko/guide/privacy/overview) · [링크 공유 보안](/ko/guide/sharing/link-security) · [티로 요금제](/ko/guide/workspace/plans) # 개인정보 보호 및 보안 Source: https://docs.tiro.ooo/ko/guide/privacy/overview 음성은 텍스트 변환 직후 폐기되고, 노트는 암호화되어 서울 리전에 저장돼요. 고객 데이터는 AI 학습에 일절 사용하지 않아요. ## 음성은 변환 직후 폐기돼요 티로의 원칙은 "음성은 전사를 위해서만 처리되고, 처리 직후 복구 불가능하게 폐기"예요. * **실시간 기록**: 마이크·시스템 오디오가 스트리밍으로 텍스트로 변환되고, 변환 후 메모리에서 폐기돼요. 평문으로 디스크에 저장되지 않아요. * **음성파일 업로드·오프라인 녹음**: 업로드된 파일은 받아쓰기와 화자 분리 처리 후 자동으로 폐기돼요. * **예외는 사용자가 직접 켠 경우뿐이에요.** [문단별 음성 다시 듣기](/ko/guide/notes/replay)를 켜면 음성이 본인 계정의 암호화된 스토리지에 보관돼요. 기본값은 꺼짐이고, 끄거나 삭제를 요청하면 파기돼요. 조직 단위로 이 기능을 차단할 수도 있어요. ## 데이터는 어떻게 저장되나요? * 노트 텍스트는 여러 기기에서 보실 수 있도록 서버에 저장돼요. 저장 위치는 **AWS 서울 리전**(ap-northeast-2)이고, Multi-AZ로 이중화돼요. * 저장 데이터는 사용자·조직별 키로 **AES-256** 암호화되고, 전송 구간은 **TLS 1.3**으로 보호돼요. * 데이터 접근은 엄격히 통제돼요. 평문 데이터 접근 권한은 CTO와 시니어 엔지니어 1인으로 제한되고, 모든 접근은 쿼리·컬럼 단위로 영구 기록돼요. ## AI 학습에 쓰이지 않아요 고객의 대화 기록을 포함한 어떠한 정보도 모델 학습이나 파인튜닝에 활용하지 않아요. 무료·유료·기업 고객 모두 동일하고, 티로가 사용하는 모든 LLM·음성 인식 벤더와 학습 미사용·비저장(Zero Data Retention) 계약을 체결하고 있어요. ## 삭제하면 어떻게 되나요? * **노트 삭제**: 운영 데이터베이스와 검색 인덱스, 캐시에서 즉시 삭제돼요. 재해 복구용 백업 사본은 보존 기간(최대 21일)이 지나면 자동 폐기돼요. * **계정 삭제**: 관련 데이터가 복구 불가능한 상태로 제거돼요(최장 30일 이내). 암호화 키 삭제가 함께 예약되어 잔여 데이터에 영구적으로 접근할 수 없게 돼요. ## 보안 인증 * **ISO/IEC 27001:2022** 인증을 취득했어요 (2026년 6월). * **SOC 2 Type 1**(2026년 3월)과 **Type 2**(2026년 7월) 심사를 모두 완료했어요. 5개 Trust Services Criteria 전 범위 대상이에요. * 감사 보고서는 NDA 체결 후 제공돼요. ## 기업을 위한 보안 옵션 Enterprise 플랜에서는 감사 로그(SIEM 연동), 외부 공유 도메인 화이트리스트, 데이터 보존 기간 정책과 삭제 증빙, SAML/OIDC SSO·MFA·SCIM, 세션·디바이스 통제 등을 정책 단위로 설정할 수 있어요. 보안 검토 자료(데이터 위치, 컴플라이언스, 하위 처리자 목록)가 필요하면 영업팀에 문의해 주세요. 자세한 설정 방법은 [조직 보안 설정](/ko/guide/privacy/enterprise-security)을 참고하세요. ## 자주 묻는 질문 ### 녹음한 음성 파일을 티로가 보관하나요? 기본적으로 보관하지 않아요. 음성은 텍스트 변환 직후 폐기되고, 사용자가 문단별 음성 다시 듣기를 직접 켠 경우에만 본인 계정의 암호화 스토리지에 보관돼요. ### 티로 직원이 제 노트를 볼 수 있나요? 평문 데이터 접근은 2인으로 제한되고 모든 접근이 영구 기록돼요. 운영상 필요한 경우가 아니면 고객 노트에 접근하지 않아요. ### 데이터가 해외로 나가나요? 노트 데이터는 AWS 서울 리전에 저장돼요. Enterprise 계약 시 전용 VPC나 다른 리전도 협의할 수 있어요. 조직 단위 보안 옵션은 [조직 보안 설정](/ko/guide/privacy/enterprise-security)을 참고하세요. *** **관련 페이지**: [문단별 다시 듣기](/ko/guide/notes/replay) · [음성파일 로컬 저장](/ko/guide/notes/local-audio) · [계정 관리 가이드](/ko/guide/account/overview) # 통화 녹음 변환 Source: https://docs.tiro.ooo/ko/guide/recording/call-recording 갤럭시 통화 녹음 파일을 티로가 자동으로 찾아 텍스트 노트로 변환해요. 자동 변환을 켜두면 새 통화 녹음이 알아서 노트가 돼요. 통화 녹음 변환은 Android 전용 기능이에요. iOS는 OS 정책상 통화 녹음 자체가 제한되어 메뉴가 표시되지 않아요. 삼성 갤럭시 기기를 기준으로 동작하며, 다른 제조사 기기에서는 일부 기능이 다르게 동작할 수 있어요. ## 어떻게 동작하나요? 티로가 통화를 직접 녹음하는 것이 아니에요. 갤럭시의 기본 통화 녹음 기능이 휴대폰에 남긴 녹음 파일을 티로가 읽어와서 텍스트로 변환하는 방식이에요. 그래서 먼저 기기의 통화 앱에서 통화 녹음 기능이 켜져 있어야 해요. ## 통화 녹음 변환 시작하기 노트 목록 우상단 프로필 아이콘으로 설정에 들어가 **\[관리]** → **\[통화 녹음]** 메뉴를 선택하세요. 처음 들어가면 저장소 권한이 필요해요. 화면의 **\[접근 허용]** 버튼을 누르면 기기의 통화 녹음 파일 목록이 날짜별로 표시돼요. 목록에서 원하는 통화의 **\[변환]** 버튼을 누르면 업로드와 텍스트 변환이 시작돼요. 완료되면 **\[변환 완료]** 상태로 바뀌고, 누르면 해당 노트로 이동해요. 노트 제목은 통화 상대의 전화번호로 만들어져요. ## 자동 변환 켜기 화면 상단의 **\[자동 변환]** 토글을 켜면 이후 새로 들어오는 통화 녹음이 백그라운드에서 자동으로 노트로 변환돼요. * 자동 변환은 **켠 시점 이후의 새 녹음만** 처리해요. 그 전에 이미 있던 녹음은 사용량이 한꺼번에 빠지지 않도록 자동 대상에서 제외되니, 목록에서 직접 **\[변환]** 버튼을 눌러 주세요. * **\[업로드 알림]** 토글을 켜면 자동 변환 결과(성공·실패·크레딧 소진)를 푸시 알림으로 받아요. * 자동 변환이 켜져 있는 동안에는 새 녹음을 감지하기 위한 상시 알림이 알림 영역에 하나 떠 있어요. 자동 변환을 끄면 함께 사라져요. ## 안 될 때 확인하기 * **녹음 파일이 하나도 안 보여요**: 저장소 권한이 허용되어 있는지, 기기의 통화 앱에서 통화 녹음 기능이 켜져 있는지 확인하세요. 화면을 아래로 당기면 목록이 새로고침돼요. * **삼성이 아닌 기기예요**: 안드로이드 표준 통화 녹음 폴더에 파일을 저장하는 기기라면 목록에 잡힐 수 있지만, 전화번호 대신 파일명으로 표시되는 등 일부 동작이 다를 수 있어요. ## 자주 묻는 질문 ### iPhone에는 통화 녹음 메뉴가 없어요. 통화 녹음 변환은 Android 전용이에요. iOS는 OS 정책상 통화 녹음 자체가 제한되어 있어 기능을 제공하지 못하고 있어요. iPhone에서 녹음 파일이 있다면 [음성파일 업로드](/ko/guide/recording/upload)로 변환할 수 있어요. ### 자동 변환을 켰는데 예전 통화 녹음은 변환이 안 돼요. 의도된 동작이에요. 자동 변환은 켠 시점 이후의 새 녹음만 자동 처리해요. 사용량이 실수로 한 번에 빠져나가지 않게 막아두는 보호 장치예요. 이전 녹음은 목록에서 직접 **\[변환]** 버튼을 눌러 변환할 수 있어요. ### 같은 통화를 두 번 변환하면 노트가 두 개 생기나요? 아니요, 같은 녹음 파일은 기존 노트를 다시 사용해서 중복으로 만들어지지 않아요. ### 크레딧이 소진된 상태에서 자동 변환이 멈췄어요. 대기 중인 녹음은 그대로 보존돼요. 플랜을 업그레이드하거나 결제가 갱신되어 사용량이 다시 생기면 자동으로 변환이 재개돼요. ### 변환 결과 알림이 안 와요. 화면 상단의 **\[업로드 알림]** 토글로 알림 권한을 켜 주세요. 토글을 누르면 OS 설정으로 이동해 권한을 바꿀 수 있어요. *** **관련 페이지**: [음성파일 업로드](/ko/guide/recording/upload) · [크레딧](/ko/guide/workspace/credits) # 컨퍼런스 모드: 행사장 실시간 자막·번역 송출 Source: https://docs.tiro.ooo/ko/guide/recording/conference 컨퍼런스, 세미나, 강연, 학회에서 발표를 실시간 자막으로 스크린에 띄우고, 청중은 QR 코드로 각자 휴대폰에서 자막과 번역을 받아 봐요. 직접 운영하면 쓰던 요금제 그대로 추가 구매가 없고, 세팅부터 맡기고 싶다면 티로 팀이 준비하는 컨퍼런스 모드 패키지가 있어요 (partners@theplato.io). 컨퍼런스 모드는 실시간 기록을 행사용 풀스크린 자막 화면으로 바꿔주는 기능이에요. 노트북 한 대와 발표 음향만 있으면 발표장 스크린에 자막이 뜨고, 청중은 QR 코드로 각자 휴대폰에서 같은 자막을 봐요. 통역 부스도, 자막 송출 장비도 필요 없어요. 컨퍼런스 무대. 대형 스크린이 세 구역으로 나뉘어 왼쪽에 한국어 실시간 자막, 가운데에 발표 슬라이드, 오른쪽에 영어 번역 자막이 표시되고 연사가 연단에서 발표하는 모습 ## 컨퍼런스 모드로 할 수 있는 일 * 발표장 스크린에 실시간 자막을 큼직하게 띄워요 * 청중이 QR 코드를 스캔해 각자 휴대폰에서 자막을 받아 봐요 * 외국인 청중을 위해 실시간 번역 자막을 함께 보여줘요 * 행사가 끝나면 청중이 보던 링크가 전체 기록 페이지로 바뀌어 그대로 가져갈 수 있어요 컨퍼런스 모드는 웹과 데스크탑 앱에서 사용할 수 있어요. 대화 언어를 **\[다국어]** 옵션으로 설정한 실시간 기록에서만 켤 수 있고, 기록이 진행 중일 때만 보여요. ### 이런 행사에 맞아요 발표자가 말하고 청중이 듣는 자리라면 어디든 맞아요. * **국제 컨퍼런스·서밋**: 연사와 청중의 언어가 다를 때 원문과 번역을 나란히 띄워요 * **대학 특강·학회**: 외국인 연사의 강연을 자국어 자막과 함께 들어요 * **데모데이·기업 설명회**: 발표 내용이 그대로 기록으로 남아 참가자에게 공유돼요 * **사내 타운홀·전사 워크숍**: 원격 참가자와 외국인 구성원이 같은 내용을 따라와요 * **강연·북토크·세미나**: 뒷자리 청중도 QR로 자기 휴대폰에서 자막을 읽어요 ## 컨퍼런스 화면 띄우기 ### 켜는 법 [실시간 대화기록](/ko/guide/recording/live)을 시작할 때 **\[대화]** 언어를 **\[다국어]** 옵션으로 설정하세요. 다른 언어로 설정되어 있으면 컨퍼런스 모드 버튼이 비활성화돼요. 기록 중인 노트 상단의 **\[컨퍼런스 모드]** 버튼을 누르면 풀스크린 자막 화면으로 전환돼요. 이 화면을 발표장 스크린이나 보조 모니터에 띄우면 돼요. 컨퍼런스 모드 풀스크린 화면. 흰 배경에 발표 자막이 큰 글씨로 표시되고 상단에 번역·맥락·QR·가이드·화면 설정 버튼이 늘어선 모습 ### 자막 배치 고르기 상단 **\[화면 설정]** 팝오버의 **\[디스플레이 모드]** 에서 원문과 번역을 어떻게 놓을지 고를 수 있어요. 좌우, 상하, 고정 세 가지 형태에 각각 **반전** 버전이 있어서 모두 6가지예요. * **좌우 · 좌우 반전**: 원문과 번역을 왼쪽·오른쪽 두 단으로 나란히 놓아요. 가로로 넓은 행사장 스크린에 잘 맞아요 * **상하 · 상하 반전**: 원문과 번역을 위아래로 놓아요. 세로가 긴 화면이나 폭이 좁은 스크린에 맞아요 * **고정 · 고정 반전**: 원문과 번역 영역을 화면에 고정해두고 각 영역에서 자막이 갱신돼요 **반전**을 고르면 원문과 번역이 놓이는 자리가 서로 바뀌어요. 청중 대부분이 번역을 읽는 행사라면 반전을 켜서 번역이 먼저 눈에 들어오는 자리에 오게 하면 돼요. 화면 설정 팝오버. 글자 크기 100%, 본문 너비 90%, 디스플레이 모드 6종 버튼, 다크·라이트 토글, 헤더 항상 표시 스위치가 세로로 나열된 화면 ### 글자 크기와 화면 맞추기 같은 팝오버에서 행사장 크기와 조명에 맞게 화면을 조정해요. * **글자 크기**: 75%에서 180%까지 10% 단위로 조절해요. 맨 뒷자리에서 직접 읽어보고 맞추는 게 가장 정확해요 * **본문 너비**: 78%에서 96%까지 6% 단위로 조절해요. 스크린 비율에 맞게 좌우 여백을 줄이거나 늘릴 수 있어요 * **다크 모드**: 어두운 배경과 밝은 배경 중에 골라요. 조명을 낮춘 행사장은 어두운 배경이 눈에 편해요 * **헤더 항상 표시**: 화면 상단의 행사 정보 헤더를 계속 띄워둘지 정해요 처음이라면 상단 **\[가이드]** 버튼을 눌러보세요. 준비·음향·화면·문제 해결 안내가 화면 안에 들어 있어요. ## 발표 중에 쓰는 기능 ### 청중에게 QR로 자막 공유하기 상단 **\[QR]** 버튼을 누르면 청중용 QR 코드가 화면에 표시돼요. 청중은 휴대폰 카메라로 스캔하기만 하면 되고, **로그인이 필요 없어요.** 각자 다크 모드와 글자 크기를 조절할 수 있고, 번역이 켜진 발표라면 번역 표시도 켜고 끌 수 있어요. 링크에 비밀번호를 걸면 발표 화면에 표시된 비밀번호를 입력한 사람만 볼 수 있어요. 컨퍼런스 QR 공유 화면. 왼쪽에 'Tiro가 받아쓰고 있어요 LIVE' 발표 헤더와 발표 제목·발표자·장소가, 오른쪽에 QR 코드와 '휴대폰 카메라로 QR 코드를 스캔하세요' 안내, tiro.ooo 공유 링크가 보이는 모습 메인 스크린이 작거나 멀어도 청중이 자기 속도로 읽을 수 있어요. 시작 슬라이드와 좌석 안내에 QR을 미리 띄워두면 놓치는 사람이 없어요. ### 실시간 번역 자막 보여주기 상단 **\[번역]** 토글을 켜고 번역 언어를 고르면 원문 자막과 번역 자막이 함께 표시돼요. 번역 언어는 발표자가 선택하고, 청중은 그 언어의 번역을 받아 봐요. 한국어, 영어, 일본어, 중국어를 포함해 [15개 언어](/ko/guide/recording/live)를 지원해요. 컨퍼런스 모드 번역 켜짐 화면. 상단 번역 토글이 켜진 상태에서 왼쪽 열에 한국어 원문 자막, 오른쪽 열에 같은 내용의 영어 번역 자막이 두 단으로 나란히 표시된 모습 ### 티로의 정확도를 더 높이는 법 상단 **\[맥락]** 버튼에 발표 주제, 인명·기업명 같은 고유명사, 전문 용어를 미리 넣어두면 자막 정확도가 크게 올라가요. 텍스트뿐 아니라 발표자료 같은 파일도 올릴 수 있고(최대 5개, 파일당 20MB 이하), 이전에 쓴 맥락을 불러와 재사용할 수도 있어요. 발표 중에도 바꿀 수 있어요. 자세한 내용은 [맥락](/ko/guide/recording/context) 페이지에 있어요. ## 행사 준비와 비용 ### 준비물 행사장에 따로 들일 장비가 없어요. * **노트북 1대**: 자막을 띄울 화면에 연결해요. 웹 브라우저나 데스크탑 앱이면 돼요 * **발표 음향**: 메인 믹서의 라인아웃을 USB 오디오 인터페이스로 노트북에 연결하면 자막 정확도가 가장 높아요. 내장 마이크로 받을 때와 차이가 커요 * **인터넷**: 유선 LAN이 가장 안전하고, 와이파이라면 다운로드 10Mbps·업로드 5Mbps 이상을 권해요 ### 비용 **쓰고 있는 요금제 그대로예요.** 컨퍼런스 모드는 모든 유료 요금제에 포함돼 있어서 행사용으로 따로 구매할 게 없어요. 하루짜리 행사라면 사용량이 무제한인 [맥스 요금제](/ko/guide/workspace/plans) 한 달치로 리허설까지 넉넉하게 커버돼요. 유료 요금제는 노트 1개당 최대 5시간까지 기록돼요. 5시간이 넘는 행사는 세션 사이 쉬는 시간에 기록을 한 번 끊고 새 노트로 이어가면 되는데, 이때 청중용 QR 링크도 새로 안내해야 해요. ## 기록을 마치면 발표자가 기록을 종료하면 청중이 보던 화면은 자동으로 일반 공유 페이지로 바뀌어요. 청중은 같은 링크에서 발표 전체 기록을 처음부터 다시 읽을 수 있어요. 발표자의 노트에는 평소처럼 한 페이지 문서, 대화 기록, 스크립트가 남아요. ## 큰 행사를 준비 중이라면, 티로 팀에 세팅을 맡길 수도 있어요 수백 명 규모의 컨퍼런스, 여러 언어가 오가는 국제 행사, 트랙이 동시에 돌아가는 행사라면 준비할 게 많아요. 이럴 때 쓰라고 **컨퍼런스 모드 패키지**가 있어요. 행사 전용 운영 계정, 행사 정보와 언어 구성 세팅, 사전 테스트 링크, 행사 주간 우선 지원 채널까지 세팅을 끝낸 상태로 전달해 드려요. 다국어 화면, 커스텀 브랜딩, 대규모 참가자, 멀티 트랙처럼 행사에 따라 더 필요한 구성도 맞춰 드려요. **[partners@theplato.io](mailto:partners@theplato.io)** 로 행사 날짜, 진행 시간, 사용 언어, 예상 참가 인원을 보내주세요. 행사에 맞는 구성과 견적을 안내해 드려요. 패키지는 기능을 여는 상품이 아니라 준비와 지원을 대행하는 서비스예요. 컨퍼런스 모드 자체는 패키지 없이도 지금 쓰고 있는 요금제에서 바로 쓸 수 있어요. ## 자주 묻는 질문 ### 컨퍼런스 모드를 쓰려면 따로 결제해야 하나요? 아니요. 유료 요금제를 쓰고 있다면 추가 구매 없이 바로 켤 수 있어요. 하루 종일 진행되는 행사라면 사용량이 무제한인 맥스 요금제가 여유로워요. ### 통역사나 자막 장비가 따로 필요한가요? 필요 없어요. 노트북 1대와 발표 음향만 노트북으로 받으면 돼요. 자막과 번역은 티로가 처리하고, 청중은 각자 휴대폰에서 봐요. ### 5시간이 넘는 행사는 어떻게 하나요? 노트 1개당 기록이 최대 5시간이라 세션 사이에 기록을 끊고 새 노트로 이어가야 해요. 새 노트에서는 QR 링크도 새로 발급되니 청중에게 다시 안내해 주세요. 오전·오후처럼 세션을 미리 나눠 계획해두면 편해요. ### 청중이 티로 계정에 가입해야 하나요? 아니요, QR을 스캔하면 로그인 없이 바로 자막을 볼 수 있어요. 외부 공개가 걱정되면 링크에 비밀번호를 설정하세요. ### 컨퍼런스 모드 버튼이 비활성화되어 있어요. 세 가지 조건을 확인하세요. 실시간 기록 노트인지(파일 업로드 노트는 불가), **\[대화]** 언어가 **\[다국어]** 옵션으로 설정되어 있는지, 기록이 진행 중인지(종료된 노트에서는 버튼이 보이지 않아요). ### 모바일에서도 쓸 수 있나요? 발표자 화면(컨퍼런스 모드)은 웹과 데스크탑 앱에서만 켤 수 있어요. 청중은 휴대폰으로 QR을 스캔해 보는 거라 기기 제한이 없어요. *** **관련 페이지**: [실시간 대화기록](/ko/guide/recording/live) · [맥락](/ko/guide/recording/context) · [공유](/ko/guide/sharing/overview) · [요금제](/ko/guide/workspace/plans) # 맥락 Source: https://docs.tiro.ooo/ko/guide/recording/context 대화 상황과 고유명사를 미리 알려주면 티로가 더 정확하게 받아 적고, 원하는 톤으로 요약해요. ## 맥락이 뭔가요? 맥락은 티로가 음성을 더 정확하게 받아 적도록 돕는 단서예요. 어떤 자리에서 누가 무엇을 이야기하는지 알려주면, 처음 듣는 고유명사도 정확하게 잡아내고 요약도 상황에 맞게 만들어져요. 실시간 기록, 오프라인 녹음, 음성파일 업로드, [컨퍼런스 모드](/ko/guide/recording/conference) 어디서든 쓸 수 있어요. ## 맥락 입력하는 법 * **기록 시작 전**: 새 노트의 **\[맥락 입력]** 칸에 적으세요. * **기록 중**: 녹음 컨트롤의 **\[맥락]** 버튼으로 언제든 추가하거나 고칠 수 있어요. 대화 중 갑자기 나온 고유명사를 넣으면 바로 다음 내용부터 반영돼요. * **텍스트 외에도**: 캡처한 이미지를 붙여넣거나, **\[파일 업로드]** 버튼으로 회의 자료를 올릴 수 있어요(최대 5개, 파일당 20MB). PDF, 이미지, 텍스트, 음성, 영상 파일을 지원해요. * **재사용**: **\[이전 맥락 불러오기]** 버튼으로 지난 노트에 썼던 맥락을 그대로 가져올 수 있어요. 매주 반복되는 회의에 편리해요. 맥락이 대화 기록과 스크립트에 반영되려면 기록 시작 전이나 기록 중에 입력해야 해요. 기록이 끝난 뒤에 입력한 맥락은 한 페이지 문서를 다시 생성할 때 반영돼요. ## 어떻게 쓰면 효과적인가요? 상황, 고유명사, 원하는 톤 세 가지를 담으면 가장 효과가 좋아요. > 예) \[더플레이토]와 진행하는 비즈니스 미팅입니다. 제품명, 참석자 등 고유명사와 비즈니스 용어를 정확히 기록하고, 요약은 전문적이고 공식적인 톤으로 작성해주세요. 사람/회사/제품: \[홍길동], \[더플레이토], \[티로] * **상황**: 비즈니스 미팅, 강의, 인터뷰처럼 대화의 종류를 알려주세요. * **고유명사**: 사람, 회사, 제품 이름을 나열하세요. 처음 듣는 단어일수록 효과가 커요. * **톤 요청**: "요약은 친근한 톤으로", "전문 용어는 영어 그대로" 같은 요청도 반영돼요. ## 자주 묻는 질문 ### 기록이 끝난 뒤에 맥락을 입력하면 소용없나요? 대화 기록과 스크립트에는 반영되지 않지만, 맥락을 입력한 뒤 한 페이지 문서를 다시 생성하면 반영돼요. ### 맥락과 단어장은 뭐가 다른가요? 맥락은 이번 대화 한 번에 적용되는 상황 설명이고, [단어장](/ko/guide/recording/wordbook)은 모든 노트에 상시 적용되는 고유명사 사전이에요. 매번 나오는 회사·제품 이름은 단어장에 등록하고, 이번 대화에만 해당하는 상황과 인물은 맥락에 적으면 좋아요. ### 회의 자료를 통째로 올려도 되나요? 네, 맥락의 **\[파일 업로드]** 버튼으로 발표 자료나 안건 문서를 올리면 티로가 내용을 읽고 기록에 참고해요. 최대 5개, 파일당 20MB까지 올릴 수 있어요. *** **관련 페이지**: [실시간 대화기록](/ko/guide/recording/live) · [단어장](/ko/guide/recording/wordbook) · [대화 참석자 관리](/ko/guide/recording/participants) # 화자 분리 Source: https://docs.tiro.ooo/ko/guide/recording/diarization 누가 말했는지 자동으로 구분해 스크립트에 화자 태그를 붙여요. 태그를 클릭해 실제 이름으로 바꿀 수 있어요. **티로는 화자 분리(참여자별 음성 구분)를 지원해요.** 누가 말했는지 자동으로 구분해 스크립트에 Speaker A·B 같은 태그를 붙여요. **Pro 플랜 이상**에서 쓸 수 있고, 실시간 대화기록은 **기록을 종료하면 전체 음성을 자동으로 다시 분석해** 화자 태그를 붙여요. 오프라인 기록 또는 음성파일 업로드 기능에서는 노트 생성 직후 바로 화자분리된 결과물을 확인할 수 있어요. Pro 플랜 이상에서 사용할 수 있는 기능이에요. Lite 플랜에서 화자 분리를 켜면 업그레이드 안내가 표시돼요. **무료체험 기간에도 화자 분리를 사용할 수 있어요.** ## 어떻게 동작하나요? 화자 분리는 완성된 음성 전체를 분석해 발화 구간을 사람별로 가르고, 스크립트에 Speaker A, Speaker B 같은 태그를 붙이는 기능이에요. 기록 방식에 따라 적용 시점이 달라요. * **음성파일 업로드**: 변환할 때 바로 적용돼요. 업로드 시 **\[화자수 입력]** 칸에 인원을 지정하면 더 정확해져요. * **오프라인 녹음**: 녹음 종료 후 변환할 때 적용돼요. * **실시간 대화기록**: 기록하는 도중에는 화자가 갈리지 않아요. 대신 **기록을 종료하면 전체 음성을 자동으로 다시 분석해서** 잠시 후 스크립트에 화자 태그가 붙어요. ## 화자 분리 켜는 법 **\[설정]** → **\[기본 설정]** 메뉴에서 **\[화자 분리]** 토글을 켜세요. 평소처럼 기록하면 돼요. 음성파일 업로드라면 **\[화자수 입력]** 칸에 대화 인원을 지정하세요. 모르면 자동 감지로 두면 돼요. **\[스크립트]** 탭을 열면 발화 구간마다 Speaker A, Speaker B 태그가 붙어 있어요. ## 화자 태그를 실제 이름으로 바꾸기 자동 태그는 원하는 이름으로 바꿀 수 있고, 바꾼 이름은 맞춤 문서 생성에도 반영되어 더 정확한 문서가 만들어져요. 1. 스크립트에서 화자 태그(Speaker A 등)를 클릭하세요. 2. 이름을 직접 입력하거나, [등록해둔 참석자](/ko/guide/recording/participants) 중에서 선택하세요. 3. 적용 범위를 고르세요: **\[이 섹션만]**, **\[이 섹션부터]**, **\[전체 섹션]** 중에서 선택할 수 있어요. 자동 분리가 한 사람으로 묶은 구간에 실제로는 두 사람이 말했다면, 문단 안에서 **엔터 키**를 눌러 직접 화자를 나눌 수도 있어요. 모바일 앱에서도 화자 태그를 수정할 수 있어요. 태그를 바꾸지 않아도 화자 분리는 그대로 쓸 수 있어요. 이 경우 맞춤 문서는 대화 내용만을 기반으로 작성돼요. ## 자주 묻는 질문 ### 실시간 기록 중에는 왜 화자가 안 갈리나요? 실시간 기록은 음성을 짧은 단위로 즉시 받아 적는 방식이라 기록 도중에는 화자를 가르지 않아요. 대신 기록을 종료하면 전체 음성을 자동으로 다시 분석해 화자 태그를 붙여줘요. 기록이 끝난 직후 스크립트에서 확인할 수 있어요. ### 화자 분리는 어느 플랜부터 되나요? Pro 플랜 이상에서 지원해요. **무료체험 기간(개인/팀 워크스페이스 모두)에도 화자 분리를 사용할 수 있어요.** **\[설정]** → **\[기본 설정]** 메뉴의 **\[화자 분리]** 토글로 켜고 끌 수 있어요. ### 화자가 잘못 구분되어 있어요. 화자 태그를 클릭해 올바른 이름으로 바꾸고 적용 범위를 선택하세요. 한 구간에 두 사람의 발화가 섞여 있다면 엔터 키로 직접 나눌 수 있어요. 음성파일 업로드라면 다음부터 **\[화자수 입력]** 칸에 인원을 지정해 보세요. 정확도가 올라가요. ### 화자 이름을 바꾸면 문서에도 반영되나요? 네, 직접 태그한 참석자 정보는 맞춤 문서 생성에 반영돼요. 회의록에 "Speaker A" 대신 실제 이름이 들어가요. *** **관련 페이지**: [대화 참석자 관리](/ko/guide/recording/participants) · [음성파일 업로드](/ko/guide/recording/upload) · [오프라인 녹음](/ko/guide/recording/offline) # 실시간 대화기록 Source: https://docs.tiro.ooo/ko/guide/recording/live 말하는 동시에 화면에 텍스트가 기록돼요. 대화 언어와 기록 언어를 다르게 설정하면 실시간 번역도 함께 볼 수 있어요. ## 언제 실시간 기록을 쓰나요? 기록되는 내용을 화면으로 바로 확인하고 싶을 때 쓰는 모드예요. 이런 상황에 잘 맞아요. * 회의 중 놓친 내용을 그 자리에서 다시 확인하고 싶을 때 * 외국어 대화를 실시간 번역으로 따라가고 싶을 때 이동 중이거나 네트워크가 불안정한 환경, 화면을 계속 볼 필요가 없는 긴 녹음이라면 [오프라인 녹음](/ko/guide/recording/offline)이 더 안정적이에요. 이미 녹음된 파일이 있다면 [음성파일 업로드](/ko/guide/recording/upload)를, 발표장 스크린이나 청중 휴대폰에 자막을 띄우고 싶다면 [컨퍼런스 모드](/ko/guide/recording/conference)를 이용하세요. ## 실시간 기록 시작하는 법 플랫폼에 따라 시작 위치가 달라요. * **웹·데스크탑 앱**: 노트 목록 화면의 **\[실시간 기록 시작]** 버튼을 누르세요. 새 노트가 만들어지면서 바로 기록을 준비할 수 있어요. * **모바일 앱**: 새 노트 화면에서 **\[실시간 기록]** 모드를 선택하고 **\[실시간 기록 시작]** 버튼을 누르세요. 기본 선택은 오프라인 녹음 모드예요. 기록을 시작하기 전에 노트 화면에서 아래 항목을 설정할 수 있어요. 제목을 직접 정하지 않으면 티로가 대화를 듣고 주제에 맞는 제목을 자동으로 만들어요. **\[대화참석자]** 칸에 함께한 사람의 이름과 이메일을 입력하면 참석자 이름을 더 정확하게 인식하고, 기록이 끝난 뒤 노트에 초대하거나 참석자로 검색할 때도 편해요. 자세한 내용은 [대화 참석자 관리](/ko/guide/recording/participants)를 참고하세요. 기록 시작 전 노트 화면. 노트 제목과 대화 참석자, 폴더 버튼 아래로 대화 기록과 스크립트 탭이 있고, 하단에 마이크와 대화·기록 언어 선택, 빨간 녹음 시작 버튼이 표시된 화면 맥락은 티로가 음성을 더 정확하게 받아 적도록 돕는 단서예요. **\[맥락 입력]** 칸에 대화 상황, 고유명사, 사람 이름을 미리 알려주면 받아쓰기 정확도와 요약 품질이 크게 올라가요. > 예) \[더플레이토]와 진행하는 비즈니스 미팅입니다. 제품명, 참석자 등 고유명사를 정확히 기록하고, 요약은 공식적인 톤으로 작성해주세요. 사람/회사/제품: \[홍길동], \[티로] 맥락을 잘 쓰는 방법은 [맥락](/ko/guide/recording/context)에서 더 자세히 다뤄요. 맥락 입력 팝업. 대화 상황과 고유명사를 적은 입력란, 파일 업로드 영역, 이전 맥락 불러오기와 저장 버튼이 표시된 화면 두 가지 언어를 각각 고를 수 있어요. * **\[대화]**: 실제 대화에서 사용하는 언어예요. 음성 인식의 기준이 돼요. * **\[기록]**: 스크립트와 요약이 만들어지는 언어예요. 한국어, 영어, 일본어를 포함해 15개 언어를 지원해요. 어떤 언어로 진행될지 모르거나 여러 언어가 섞이는 자리라면 **\[다국어]** 옵션을 선택하세요. 대화 언어 드롭다운이 열려 다국어, 한국어, 영어, 일본어 등 지원 언어 목록이 표시된 녹음 컨트롤 화면 두 언어를 다르게 설정하면 실시간 번역이 시작돼요. 아래 [실시간 번역](#실시간-번역-사용하기) 섹션을 참고하세요. 시작 버튼을 누르면 빨간 녹음 버튼이 음성 파형으로 바뀌면서 기록이 시작돼요. ## 기록 중에 할 수 있는 일 * **일시정지·재개**: 파형 버튼을 누르면 기록이 일시정지되고, 다시 누르면 이어서 기록돼요. * **맥락 추가·수정**: 기록 중에도 맥락을 입력하거나 고칠 수 있고, 바로 다음 내용부터 반영돼요. 대화 중 갑자기 나온 고유명사나 핵심 키워드를 그때그때 넣어 주세요. * **원문 확인·수정**: **\[스크립트 보기]** 버튼으로 원문을 펼치고, 잘못 인식된 부분을 클릭해 바로 고칠 수 있어요. 맥락이 대화 기록과 스크립트에 반영되려면 녹음 시작 전이나 기록 중에 입력해야 해요. 기록이 끝난 뒤에 입력한 맥락은 한 페이지 문서를 다시 생성할 때 반영돼요. ## 데스크탑 앱에서 기록을 더 편하게 데스크탑 앱에는 기록을 놓치지 않게 도와주는 편의 기능 두 가지가 있어요. **\[설정]** → **\[기본 설정]** 메뉴에서 각각 켜고 끌 수 있고, 데스크탑 앱에서만 동작해요. * **대화 자동 감지**: 컴퓨터에서 대화나 마이크 사용이 감지되면 화면에 **“대화 중이신 것 같아요”** 팝업을 띄우고 **\[실시간 기록 시작하기]** 버튼으로 바로 기록을 시작할 수 있게 해요. 이 팝업을 원하지 않으면 **\[설정]** → **\[기본 설정]** → **\[대화 자동 감지]** 항목을 끄세요. 일정 기반으로 미리 알려주는 미팅 알림과 달리, 실제 소리가 들리면 알려주는 기능이에요. * **실시간 기록 표시**: 기록 중이라는 사실을 잊지 않도록 화면 우측에 기록 상태를 항상 표시해요. ## 실시간 번역 사용하기 **\[대화]** 언어와 **\[기록]** 언어를 다르게 설정하면 실시간 번역을 쓸 수 있어요. 예를 들어 대화 언어를 영어, 기록 언어를 한국어로 설정하면 영어 발화가 한국어로 번역돼요. 번역이 화면에 보이는 방식은 기기와 대화 언어 설정에 따라 조금 달라요. ### 번역 토글 켜기 **\[대화]** 언어와 **\[기록]** 언어가 다르면(대화 언어를 **\[다국어]** 옵션으로 둔 경우 포함) 기록 화면에 **\[번역]** 토글이 나타나요. 웹·데스크탑은 녹음 컨트롤에, 모바일은 언어 설정 안에 있어요. 이 토글은 기록하는 도중 문장 단위로 뜨는 실시간 번역 표시를 켜고 끄는 스위치이고, 기본값은 꺼짐이에요. 새 노트를 시작하면 다시 꺼진 상태로 시작해요. **\[대화]** 언어와 **\[기록]** 언어가 같으면 **\[번역]** 토글이 나타나지 않아요. 먼저 두 언어를 다르게 설정한 다음 토글을 확인하세요. 토글이 꺼져 있어도, 두 언어가 다르면 각 문단이 완성될 때의 번역은 만들어져요. 토글이 끄는 것은 말하는 도중의 실시간 표시뿐이에요. ### 기록 도중과 기록 후에 번역 보기 **기록하는 도중**에는 토글을 켜 두면 각 문단의 원문과 번역문이 나란히 표시돼요. 토글을 꺼도 번역은 뒤에서 계속 만들어지고, 화면에 원문만 보일 뿐이에요. **기록을 마친 뒤**에도 번역은 노트에 그대로 남아요. 완성된 노트에서는 **\[원본]** 탭의 **\[스크립트]** 보기에서 어떤 언어로 볼지 직접 고르면 돼요. * **웹·데스크탑**: 노트를 열고 **\[원본]** 탭을 누른 다음, 그 안의 **\[스크립트]** 버튼을 눌러요. 그러면 바로 오른쪽에 언어 드롭다운이 나타나요. 열어서 원하는 항목을 고르면 스크립트가 그 언어로 바뀌어요. * **모바일 앱**: 노트를 열고 **\[원본]** 탭 → **\[스크립트]** 버튼 순서로 누르면, 위쪽 도구 막대에 지금 보고 있는 언어 이름이 적힌 드롭다운 버튼이 생겨요. 눌러서 목록에서 원하는 항목을 고르면 돼요. 드롭다운에 뜨는 항목은 노트의 언어 구성에 따라 달라져요. * **\[전체]** 항목: 원문과 번역을 함께 보여줘요. * 언어 이름이 붙은 항목(예: **\[영어]** 항목, **\[한국어]** 항목): 그 언어의 문장만 보여줘요. 대화 언어를 **\[다국어]** 옵션으로 두었다면 원문 쪽 항목의 이름이 **\[다국어]** 로 표시돼요. 이 드롭다운은 노트에 언어가 둘 이상일 때만 나타나요. 대화 언어와 기록 언어가 같아 번역이 없는 노트에는 보이지 않고, 같은 노트라도 **\[요약]** 보기에서는 보이지 않아요. ## 기록을 마치면 기록을 종료하면 세 가지 산출물이 만들어져요. * **한 페이지 문서**: 대화 전체를 핵심 주제별로 구조화한 요약이에요. 단순 시간순 요약이 아니라 주제 단위로 정리돼요. * **대화 기록**: 실시간으로 생성된 시간순 요약이에요. * **스크립트**: 대화 전체의 속기록이에요. "음", "어" 같은 군더더기 말이나 문법 오류는 자연스럽게 다듬어서 보존해요. 회의록, 인터뷰 정리 등 용도에 맞는 문서가 필요하면 [템플릿](/ko/guide/notes/templates)으로 맞춤 문서를 만들 수 있어요. ## 이럴 땐 다른 기록 방식을 추천해요 * **여러 언어가 섞인 대화**: 실시간 인식은 짧은 시간 안에 언어 판별과 받아쓰기를 동시에 처리해야 해서, 두 개 이상 언어를 오가는 자리에서는 정확도가 떨어질 수 있어요. [오프라인 녹음](/ko/guide/recording/offline)이나 [음성파일 업로드](/ko/guide/recording/upload)를 권장해요. * **네트워크가 불안정한 환경**: 실시간 기록은 인터넷 연결 상태의 영향을 받아요. 연결이 끊길 수 있는 환경에서는 오프라인 녹음이 안전해요. ## 자주 묻는 질문 ### 실시간 기록은 오프라인 녹음보다 정확도가 떨어지나요? 아니요, 한 가지 언어로 말하는 일반적인 상황에서는 같은 음성 인식 엔진을 사용해서 정확도가 동등해요. 차이는 정확도보다 안정성이에요. 실시간 기록은 네트워크 영향을 받으니, 화면으로 바로 확인할 필요가 없다면 오프라인 녹음을 권장해요. ### 한 노트에 최대 얼마나 기록할 수 있나요? 유료 플랜은 노트당 최대 5시간까지 기록할 수 있어요. 무료 체험 중에는 2시간까지 기록할 수 있지만 50분을 넘는 내용은 잠금 상태로 표시되고, 유료 플랜을 시작하면 잠금이 풀려요. 구독이 없는 상태에서는 노트당 60분까지 기록할 수 있어요. ### 화자 분리가 되나요? 네, Pro 플랜 이상에서 화자 분리를 지원해요. 실시간 기록은 기록하는 도중에는 화자가 갈리지 않지만, 기록을 종료하면 전체 음성을 자동으로 다시 분석해 스크립트에 화자 태그가 붙어요. 자세한 동작은 [화자 분리](/ko/guide/recording/diarization)를 참고하세요. ### 대화가 진행 중인데 파형이 움직이지 않아요. 음성 파형은 입력되는 소리 크기에 비례해 움직여요. 파형이 멈춰 있다면 마이크 입력 장치가 올바르게 선택되어 있는지 확인해 주세요. 데스크탑 앱에서 시스템 오디오(기기에서 재생되는 소리)까지 함께 녹음하려면 녹음 컨트롤의 **\[시스템 사운드]** 입력이 0%보다 크게 설정되어 있어야 해요. 자세한 내용은 [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio)을 참고하세요. ### 기록 언어는 몇 개 지원하나요? 한국어, 영어, 일본어, 중국어, 스페인어, 프랑스어, 독일어, 이탈리아어, 러시아어, 베트남어, 인도네시아어, 태국어, 말레이어, 스웨덴어, 힌디어까지 15개 언어와 **\[다국어]** 옵션을 지원해요. 대화 언어와 기록 언어를 자유롭게 교차 설정할 수 있어요. ### 청각장애로 직접 말하기 어려운데, 제 발언도 대화에 기록할 수 있나요? 네, **보이스패드**(Voicepad)라는 웹 도구로 가능해요. 입력한 문장을 브라우저 음성 합성으로 스피커에 재생하고, 그 소리를 티로 노트가 시스템 사운드로 함께 받아 적어요. 직접 말하지 않아도 내 발언이 다른 참석자의 음성과 같은 기록 안에 남아요. 청각장애가 있거나 목소리로 말하기 어려운 상황에서 회의·대화에 글로 참여하고, 그 내용을 기록으로 남기고 싶을 때 쓰는 도구예요. * 티로 노트에서 마이크의 **\[시스템 사운드]** 입력을 0%보다 크게 켜 두면, 보이스패드로 재생한 문장이 노트에 기록돼요. 데스크탑 스피커를 음소거해도 기록은 그대로 남아요. * 음성 합성을 지원하는 Chrome이나 Edge 브라우저에서 열어야 하고, 출력되는 음성 언어는 보이스패드 설정의 톱니바퀴 아이콘에서 바꿀 수 있어요. 보이스패드는 접근성 지원이 필요한 분께 링크를 따로 안내하고 있어요. 사용을 원하면 티로 앱이나 웹사이트의 **\[고객문의]** 버튼으로 알려 주세요. *** **관련 페이지**: [오프라인 녹음](/ko/guide/recording/offline) · [맥락](/ko/guide/recording/context) · [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio) # 오프라인 녹음 Source: https://docs.tiro.ooo/ko/guide/recording/offline 인터넷 연결 없이도 대화를 안전하게 기록해요. 녹음 파일은 기기에 먼저 저장되고, 연결이 되면 자동으로 업로드되어 노트로 변환돼요. ## 언제 오프라인 녹음을 쓰나요? 녹음 중에 네트워크나 실시간 변환에 의존하지 않아서 가장 안정적인 기록 방식이에요. 이런 상황에 권장해요. * 이동 중이거나 네트워크가 불안정한 곳에서 기록할 때 * 발표, 강의처럼 화면을 계속 볼 수 없는 자리 * 장시간 녹음이라 중간에 끊기면 안 될 때 기록되는 텍스트를 화면으로 바로 확인하고 싶다면 [실시간 대화기록](/ko/guide/recording/live)을 이용하세요. 오프라인 녹음은 모바일 앱과 데스크탑 앱에서 사용할 수 있어요. 웹 브라우저에서는 지원하지 않아요. ## 녹음 시작하기 * **모바일 앱**: 새 노트 화면에서 **\[오프라인 녹음]** 모드가 기본으로 선택되어 있어요. **\[녹음 시작]** 버튼을 누르면 바로 시작돼요. * **데스크탑 앱**: 새 노트에서 **\[오프라인 녹음 시작]** 버튼을 선택하세요. 녹음 전에 맥락을 입력해 두면 변환 정확도가 올라가고, 녹음 중에는 일시정지와 재개를 할 수 있어요. 데스크탑 앱 오른쪽 위 영역. 언어 설정과 실시간 기록 시작 버튼 아래로 실시간 기록 시작, 오프라인 녹음 시작, 파일 업로드 세 옵션 메뉴가 단축키와 함께 열려 있다 ## 녹음이 끝나면 이렇게 변환돼요 종료를 누르면 **\[기록 선택]** 화면이 나와요. 대화한 언어는 티로가 자동으로 인식하니, 기록에 사용할 언어만 선택하면 돼요. 인터넷이 연결되어 있으면 바로 서버로 전송되어 텍스트 변환이 시작돼요. 오프라인 상태라면 업로드가 예약되고, 인터넷이 연결되는 순간 자동으로 업로드돼요. 업로드가 실패했다는 안내가 뜨면 [오프라인 녹음이 업로드 안 될 때](/ko/guide/troubleshooting/upload-failed)를 참고하세요. 변환이 끝나면 스크립트와 요약 노트가 만들어져요. Pro 플랜 이상에서 화자 분리를 켜뒀다면 [화자 분리](/ko/guide/recording/diarization)도 함께 적용돼요. 사용량은 녹음하는 동안이 아니라 음성을 텍스트로 변환하는 시점에 차감돼요. 녹음만 해두고 변환을 미뤄도 사용량이 줄지 않아요. ## 녹음 중에 알아둘 것 * 화면이 잠겨 있거나 다른 앱을 사용해도 녹음은 계속돼요. * 녹음 파일은 곧바로 기기에 저장되어, 앱이 강제 종료되더라도 안전하게 보관돼요. * **전화가 오면 녹음이 자동으로 일시정지돼요.** 통화가 끝난 뒤 직접 재개 버튼을 눌러야 이어서 녹음돼요. 알람이나 짧은 알림 소리는 자동으로 재개돼요. ## 녹음 파일 관리하기 (모바일) 녹음된 음성 파일은 **\[오디오 파일 관리]** 화면에서 모아볼 수 있어요. * **\[파일 재생]** 버튼으로 들어보고, 필요 없는 파일은 삭제할 수 있어요. * 아직 변환하지 않은 녹음은 **\[노트로 만들기]** 버튼을 눌러 언제든 변환할 수 있어요. * 파일을 한 개 선택하면 텍스트 변환 없이 음성만 **\[공유]** 버튼으로 내보낼 수 있어요. 기기에 오디오가 저장되어 있는 경우에만 가능해요. * 기기에 저장된 음성 파일은 다른 앱에서 접근할 수 없도록 보호돼요. 노트를 삭제하면 기기에 저장된 오디오 파일도 함께 삭제돼요. 음성만 따로 남기고 싶다면 삭제 전에 공유로 내보내 주세요. ## 홈 화면 위젯으로 빠르게 시작하기 홈 화면에 위젯을 추가하면 앱을 열지 않고 한 번에 녹음을 시작할 수 있어요. Android는 오프라인 녹음, 실시간 기록, 캘린더 일정 위젯을 각각 제공하고, iOS는 소형·중형 위젯으로 바로 기록을 시작할 수 있어요. ## 자주 묻는 질문 ### 녹음만 해두고 변환하지 않으면 사용량이 차감되나요? 아니요. 사용량은 변환 시점에 차감돼요. 다만 변환 전 녹음은 기기에만 저장된 상태라서, 중요한 녹음은 너무 미루지 말고 업로드해 두는 게 안전해요. ### 한 대화에 여러 언어가 섞여 있어도 되나요? 네, 오프라인 녹음은 여러 언어가 섞인 대화도 자동으로 감지해서 변환해요. 다국어 대화라면 실시간 기록보다 오프라인 녹음을 권장해요. ### 화자 분리가 되나요? 네, Pro 플랜 이상에서 화자 분리를 지원해요. 설정에서 **\[화자 분리]** 토글을 켜두면 오프라인 녹음을 변환할 때 화자 분리가 적용돼요. 자세한 내용은 [화자 분리](/ko/guide/recording/diarization)를 참고하세요. ### 녹음 중에 전화를 받았더니 녹음이 멈춰 있어요. 전화나 통화 앱이 마이크를 가져가면 녹음이 자동으로 일시정지돼요. 통화가 끝나면 재개 버튼을 눌러 이어서 녹음해 주세요. *** **관련 페이지**: [실시간 대화기록](/ko/guide/recording/live) · [음성파일 관리](/ko/guide/notes/audio-manage) · [화자 분리](/ko/guide/recording/diarization) # 대화 참석자 관리 Source: https://docs.tiro.ooo/ko/guide/recording/participants 자주 만나는 사람의 이름과 이메일을 저장해두면 티로가 이름을 기억하고 더 정확하게 기록해요. ## 참석자를 등록하면 좋은 점 * 대화 기록에서 참석자 이름을 더 정확하게 인식해요. * 새 노트를 만들 때 저장해둔 이름으로 빠르게 검색해 추가할 수 있어요. * 노트를 참석자 기준으로 검색할 수 있어요. * [화자 분리](/ko/guide/recording/diarization)에서 화자 태그를 바꿀 때 등록된 참석자를 바로 선택할 수 있어요. * 기록이 끝난 뒤 노트에 참석자를 초대하기도 편해요. ## 참석자 등록하는 법 **\[설정]** → **\[내 계정]** → **\[대화 참석자 관리]** 메뉴로 들어가세요. 노트를 만들 때 입력했던 참석자들도 여기에 모여 있어요. 이름과 이메일을 입력하고 **\[참석자 추가]** 버튼을 누르세요. 자주 미팅하는 팀원부터 등록해두면 편해요. ## 노트에 참석자 추가하기 새 노트를 만들 때 **\[대화참석자]** 칸에 이름이나 이메일을 입력하면 저장해둔 참석자가 검색돼요. 선택만 하면 추가 완료예요. 등록되지 않은 사람은 그 자리에서 이름과 이메일을 입력해 추가할 수 있고, 그 정보도 대화 참석자 관리에 쌓여요. ## 자주 묻는 질문 ### 참석자로 추가하면 그 사람의 정보가 어디에 쓰이나요? 이름은 음성 인식과 화자 태그의 정확도를 높이는 데 쓰이고, 이메일은 노트를 초대·공유할 때 쓰여요. ### 화자 분리와는 어떻게 연결되나요? 스크립트에서 화자 태그(Speaker A 등)를 클릭하면 등록된 참석자 목록이 떠서 바로 선택할 수 있어요. 자세한 내용은 [화자 분리](/ko/guide/recording/diarization)를 참고하세요. *** **관련 페이지**: [화자 분리](/ko/guide/recording/diarization) · [실시간 대화기록](/ko/guide/recording/live) # 화상회의·영상 소리 녹음 (시스템 오디오) Source: https://docs.tiro.ooo/ko/guide/recording/system-audio Zoom·Google Meet·Teams 화상회의 상대방 목소리, 유튜브·강의 영상 소리처럼 컴퓨터에서 재생되는 소리를 내 목소리와 함께 녹음해요. 미팅에 봇이 참여하지 않고, 기록 중일 때만 작동해요. 시스템 오디오 녹음(컴퓨터 소리 녹음)은 데스크탑 앱(Windows·Mac) 전용 기능이에요. 웹 브라우저와 모바일 앱에서는 사용할 수 없어요. ## 어떻게 동작하나요? 티로는 회의에 봇을 들여보내는 대신, 내 컴퓨터에서 재생되는 소리를 직접 녹음해요. Zoom·Google Meet·Teams 같은 화상회의의 상대방 목소리, 재생 중인 유튜브·강의 영상이나 음성이 모두 포함돼요. * 마이크(내 목소리)와 시스템 오디오(컴퓨터 소리)는 별개의 경로로 녹음돼요. 입력 크기를 각각 조절할 수 있고, 한쪽 입력을 0%로 낮추면 그쪽 소리만 뺄 수도 있어요. * 회의 참가자에게는 아무것도 표시되지 않아요. 녹음은 내 컴퓨터에서만 이루어지고, 기록 중일 때만 작동해요. ## 시스템 오디오 켜는 방법 데스크탑 앱에서 시스템 오디오 녹음은 항상 켜져 있어서 별도 스위치가 없어요. 대신 기록 화면 컨트롤의 마이크 버튼을 누르면 열리는 장치 선택 메뉴에 **\[시스템 사운드]** 입력 슬라이더가 있어요. 이 값이 0%보다 커야 컴퓨터 소리가 녹음돼요(기본값 100%, 최대 200%). **0%로 두면 시스템 오디오가 녹음되지 않으니** 꼭 확인해 주세요. Mac에서 처음 사용할 때는 **시스템 오디오 녹음** 권한이 필요해요. macOS 14.2 이상에서는 권한 요청 창에서 허용하면 앱을 다시 시작하지 않아도 몇 초 안에 바로 적용돼요. macOS 14.1 이하는 화면 기록 권한을 사용해서, 허용하면 macOS가 앱을 다시 열도록 요구하는 게 정상이에요. 권한 요청 창을 한 번 거부했다면 macOS가 다시 묻지 않으니, **\[시스템 설정]** → **\[개인정보 보호 및 보안]** → **\[화면 및 시스템 오디오 녹음]** 메뉴에서 Tiro를 직접 허용해 주세요. Windows는 별도 권한이 필요 없어요. 이후는 [실시간 대화기록](/ko/guide/recording/live)과 동일해요. 상대방 발화도 스크립트에 함께 기록돼요. ## "시스템 사운드를 녹음하지 못했어요"가 떠요 내 목소리(마이크)는 기록되는데 상대방 목소리나 영상 소리만 안 잡히는 경우예요. 마이크가 정상이라면 권한 문제가 아니라, 대부분 컴퓨터의 출력(스피커·이어폰) 장치 상태 때문이에요. Windows는 시스템 사운드 녹음에 별도 권한이 필요하지 않아요. ### Windows에서 점검하기 1. **\[설정]** → **\[시스템]** → **\[소리]** 화면에서 기본 출력 장치가 정상 연결된 장치로 선택되어 있는지 확인하세요. 다른 장치로 바꿨다가 되돌리면 잡히는 경우가 많아요. 2. 그 출력 장치의 **\[속성]** → **\[고급]** 탭에서 "응용 프로그램이 이 장치를 단독으로 제어하도록 허용"을 체크 해제하세요. 3. 오디오를 점유할 수 있는 다른 앱(가상 오디오, 보이스체인저, 녹음·방송 앱 등)이 있으면 종료하세요. 4. 그래도 안 되면 녹음을 일시정지했다가 다시 시작하거나, 앱을 완전히 종료한 뒤 재실행해 주세요. ### Mac에서 점검하기 1. **\[시스템 설정]** → **\[개인정보 보호 및 보안]** → **\[화면 및 시스템 오디오 녹음]** 메뉴에서 Tiro가 허용되어 있는지 확인하세요. macOS 14.2 이상은 허용하면 몇 초 안에 자동 반영되고, 14.1 이하는 허용한 뒤 앱을 다시 열어야 해요. 2. 녹음 컨트롤의 **\[시스템 사운드]** 입력이 0%보다 큰지 확인하세요. 0%면 시스템 오디오가 녹음되지 않아요. ### 녹음 중에 "시스템 사운드 수음이 중단됐어요"가 떠요 녹음 도중 이어폰을 뽑는 등 출력 장치가 바뀌면 시스템 사운드 수음이 끊길 수 있어요. 이때도 마이크 녹음은 계속돼요. 녹음을 일시정지했다가 재개하면 새 장치로 다시 잡혀요. ## 자주 묻는 질문 ### 줌(Zoom)·구글밋(Google Meet)·팀즈(Teams) 회의도 녹음되나요? 네, 모두 녹음돼요. 티로는 특정 화상회의 프로그램과 연동하는 방식이 아니라 컴퓨터에서 재생되는 소리를 그대로 녹음하는 방식이라, 어떤 화상회의 툴을 쓰든 상대방 목소리까지 기록돼요. ### 유튜브·강의 영상 소리도 기록되나요? 네. 컴퓨터에서 재생되는 소리는 모두 기록할 수 있어요. 영상 소리만 담고 싶다면 장치 선택 메뉴에서 **\[마이크 감도]** 입력을 0%로 낮춰 주세요. ### 휴대폰으로 화상회의를 녹음할 수 있나요? 아니요. 휴대폰(iOS·Android)은 운영체제 정책상 다른 앱에서 나는 소리를 녹음할 수 없어요. 화상회의를 기록하려면 데스크탑 앱을 사용해 주세요. 데스크탑 앱을 쓸 수 없는 상황이라면, 회의 소리를 스피커로 틀고 모바일 티로로 녹음하는 방법도 있어요. ### 웹에서는 시스템 오디오 녹음이 안 되나요? 네, 브라우저 보안 제약 때문에 데스크탑 앱(Windows·Mac)에서만 지원해요. 웹에서 상대방 목소리까지 기록하려면 데스크탑 앱을 설치해 주세요. [앱 안내](/ko/guide/start/download)를 참고하세요. ### 데스크탑 앱을 설치할 수 없는데, 웹에서 상대방 목소리를 녹음할 방법이 없나요? 가상 오디오 케이블(VAC) 소프트웨어를 쓰면 가능해요. 다만 Tiro가 공식 지원하는 방식은 아니에요. 보안 정책 때문에 데스크탑 앱을 설치할 수 없고 티로 웹만 써야 하는 환경을 위한 고급 우회법이에요. 원리는 이래요. 티로 웹 녹음은 마이크 입력 장치 하나만 받아요. 그래서 BlackHole(Mac)이나 VB-CABLE(Windows) 같은 가상 오디오 케이블 소프트웨어를 설치해 컴퓨터에서 재생되는 소리(시스템 오디오)를 가상 입력 장치로 흘려보낸 뒤, 티로 웹의 입력 장치 선택에서 그 가상 장치를 고르면 화상회의 상대방 목소리나 영상 소리가 마이크처럼 녹음돼요. 이때 내 목소리도 함께 담으려면 OS에서 실제 마이크와 가상 오디오 케이블을 하나로 묶는 집합 장치(예: Mac의 "오디오 MIDI 설정")를 만들어 그 집합 장치를 선택해야 해요. 가상 케이블만 선택하면 컴퓨터에서 재생되는 소리만 녹음되고 내 목소리는 빠져요. 가상 오디오 케이블은 Tiro가 만들거나 지원하는 도구가 아니에요. 설치·설정·문제 해결은 BlackHole·VB-CABLE 등 각 도구의 공식 문서를 따라야 하고, 동작은 OS와 버전에 따라 달라질 수 있어요. 가능하면 [데스크탑 앱](/ko/guide/start/download)을 쓰는 게 가장 안정적이에요. ### 회의 상대방에게 녹음 중이라는 게 보이나요? 아니요, 티로는 회의에 봇으로 참여하지 않고 내 컴퓨터에서 재생되는 소리를 녹음하는 방식이라 상대방 화면에는 아무것도 표시되지 않아요. 녹음 사실 고지가 필요한 자리라면 직접 안내해 주세요. ### 시스템 오디오만 녹음하고 내 목소리는 빼고 싶어요. 마이크와 시스템 오디오는 입력을 따로 조절할 수 있어요. 장치 선택 메뉴에서 **\[마이크 감도]** 입력을 0%로 낮추고 **\[시스템 사운드]** 입력만 0%보다 크게 두면 컴퓨터 소리만 기록돼요. *** **관련 페이지**: [실시간 대화기록](/ko/guide/recording/live) · [실시간 기록이 안 될 때](/ko/guide/troubleshooting/recording) 문의가 필요하면 사용 중인 앱 버전, OS 종류, 출력 장치(스피커·이어폰·가상 오디오 여부)를 함께 알려주시면 빠르게 도와드릴 수 있어요. # 음성파일 업로드 Source: https://docs.tiro.ooo/ko/guide/recording/upload 이미 가지고 있는 음성·영상 파일을 올리면 정리된 텍스트 노트로 변환돼요. 파일 하나당 최대 1GB, 5시간까지 지원해요. ## 파일을 노트로 변환하기 플랫폼에 따라 진입 위치가 달라요. * **웹·데스크탑 앱**: 새 노트에서 **\[파일 업로드]** 메뉴를 선택하세요. * **모바일 앱**: 새 노트 화면에서 **\[음성파일]** 모드를 선택하세요. **\[파일 선택]** 버튼을 눌러 파일을 고르거나, 업로드 영역에 파일을 끌어다 놓으세요. 구글 드라이브 링크를 붙여넣어 업로드할 수도 있어요. 아래 [구글 드라이브 링크로 업로드하기](#구글-드라이브-링크로-업로드하기)를 참고하세요. 파일 업로드 화면. 업로드할 파일을 선택하라는 점선 영역과 파일 선택 버튼, 그 아래 구글 드라이브 링크 입력란이 표시된 화면 * **\[기록 언어]**: 스크립트와 요약이 만들어질 언어예요. 대화한 언어는 자동으로 인식해요. * **\[화자수 입력]**: 대화에 참여한 사람 수를 알면 입력하고, 모르면 자동 감지로 두세요. * **맥락**: 대화 상황과 고유명사를 알려주면 변환 정확도가 올라가요. 파일 선택 후 화면. 선택한 음성파일 정보 아래에 기록 언어, 화자수 입력, 맥락 추가 설정과 변환하기 버튼, 예상 처리 시간이 표시된 화면 **\[변환하기]** 버튼을 누르면 업로드와 변환이 시작돼요. 화면에 예상 처리 시간과 진행 단계가 표시되고, 완료되면 대화 기록과 스크립트, 한 페이지 문서가 생성돼요. ## 지원 형식과 제한 * **파일 형식**: MP3, MP4, M4A, AAC, WAV, FLAC, OGG, OPUS, WebM, MOV, MP2, PCM * **크기·길이**: 파일 하나당 최대 1GB, 5시간 이내 * 한 번에 한 개 파일씩 업로드할 수 있어요. 영상 파일(MP4, MOV 등)을 올리면 소리만 추출해서 변환해요. 회의 녹화본을 그대로 올려도 돼요. ## 구글 드라이브 링크로 업로드하기 `https://drive.google.com/file/d/...` 형식의 링크를 입력란에 붙여넣으면 파일을 가져와 변환해요. * 현재 링크 업로드는 구글 드라이브만 지원해요. * 링크로 접근할 수 있도록 파일의 공유 권한을 열어둔 상태여야 해요. 권한이 닫혀 있으면 가져오지 못해요. ## 업로드가 실패할 때 1. 파일이 1GB를 넘거나 5시간보다 길면 업로드되지 않아요. 파일을 나누거나 압축률이 높은 형식(MP3, M4A)으로 변환해서 다시 시도해 주세요. 2. 지원하지 않는 형식이라는 메시지가 뜨면 위 형식 목록을 확인하고, 가능하면 MP3로 변환해서 올려 주세요. 3. 회사 네트워크에서 업로드가 계속 실패하면 방화벽이 업로드를 차단했을 수 있어요. 모바일 핫스팟 등 다른 네트워크로 연결해서 다시 시도해 주세요. ## 자주 묻는 질문 ### 영상 파일도 변환되나요? 네, MP4·MOV 같은 영상 파일을 올리면 오디오를 추출해서 텍스트로 변환해요. ### 화자 분리가 되나요? 네, Pro 플랜 이상에서 화자 분리를 지원해요. 화자 수를 알고 있다면 **\[화자수 입력]** 칸에 지정하면 더 정확해져요. 자세한 내용은 [화자 분리](/ko/guide/recording/diarization)를 참고하세요. ### 변환에 시간이 얼마나 걸리나요? 파일 길이에 따라 달라요. 파일을 선택하면 화면에 예상 처리 시간이 표시되고, 변환 중에는 단계별 진행 상황을 보여드려요. ### 통화 녹음 파일도 올릴 수 있나요? 네, 형식과 용량 조건만 맞으면 어떤 녹음 파일이든 변환할 수 있어요. Android(갤럭시) 사용자라면 통화 녹음을 자동으로 감지해서 변환하는 [통화 녹음 변환](/ko/guide/recording/call-recording)이 더 편해요. *** **관련 페이지**: [통화 녹음 변환](/ko/guide/recording/call-recording) · [화자 분리](/ko/guide/recording/diarization) · [음성파일 관리](/ko/guide/notes/audio-manage) # Tiro Watch 앱: Apple Watch에서 녹음하기 Source: https://docs.tiro.ooo/ko/guide/recording/watch Apple Watch에서 바로 녹음을 시작하고, 페어링된 iPhone Tiro 앱으로 자동 전송해 노트로 변환해요. ## 시작 전 준비물 다음 조건이 모두 갖춰져야 Tiro Watch를 사용할 수 있어요. * **Apple Watch Series 6** 이상 * **watchOS 11.0** 이상 * 페어링된 iPhone에 **Tiro iOS 앱** 설치 Tiro Watch 앱은 iPhone Tiro 앱과 함께 자동으로 설치돼요. App Store에서 따로 받을 필요 없어요. ## Tiro Watch 앱으로 할 수 있는 일 * Apple Watch에서 바로 녹음을 시작해요 * 녹음 중 일시정지·재개·경과 시간 확인이 가능해요 * 녹음을 끝내면 iPhone Tiro 앱으로 자동 전송돼요 * 임시 저장된 녹음을 다시 이어서 쓸 수 있어요 * 컴플리케이션을 등록하면 한 번 탭으로 녹음을 시작해요 * 지원 모델에서는 **Double Tap**으로도 녹음을 시작해요 ## Apple Watch에서 녹음 시작하는 방법 ### 1. Tiro Watch 앱에서 시작하기 * Apple Watch에서 **Tiro Watch** 앱을 열어요. * 화면 가운데의 **빨간색 마이크 버튼**을 탭해요. * 처음 사용이라면 **마이크 권한 허용**을 눌러요. * 곧바로 녹음이 시작돼요. ### 2. 워치 페이스에 \[녹음] 컴플리케이션 추가하기 컴플리케이션을 등록해 두면 워치 페이스에서 **한 번 탭으로** 녹음을 시작할 수 있어요. 등록 방법은 아래 **컴플리케이션 등록하는 방법** 섹션을 참고해 주세요. ### 3. Siri로 시작하기 Siri에 **"Start Recording in Tiro"** 라고 말하면 Tiro Watch가 열리며 녹음이 시작돼요. ## 컴플리케이션 등록하는 방법 컴플리케이션은 워치 페이스에 붙여 두는 작은 바로가기예요. Tiro 컴플리케이션을 등록하면 앱 목록을 거치지 않고 바로 녹음을 시작할 수 있어요. ### Apple Watch에서 등록하기 * 워치 페이스를 **길게 눌러요**. * **\[편집]** 버튼을 눌러요. * 화면을 좌우로 넘겨 **컴플리케이션** 편집 화면으로 이동해요. * 바꾸고 싶은 위치를 눌러요. * 앱 목록에서 **Tiro**를 찾아 선택해요. * **Digital Crown**을 눌러 편집을 끝내요. * 워치 페이스에 Tiro 표시가 보이면 등록 완료예요. ### iPhone Watch 앱에서 등록하기 * iPhone에서 **Watch** 앱을 열어요. * **\[나의 시계]** 탭에서 현재 사용 중인 워치 페이스를 눌러요. * **\[컴플리케이션]** 영역을 찾아 원하는 위치를 눌러요. * 목록에서 **Tiro**를 선택해요. * 잠시 기다리면 Apple Watch 워치 페이스에 반영돼요. **\[Tiro]가 목록에 안 보일 때** 워치 페이스마다 지원하는 컴플리케이션 슬롯이 달라요. 다음을 확인해 주세요. * **Tiro Watch 앱**을 워치에서 한 번 실행해요. * iPhone과 워치가 페어링·블루투스 연결되어 있는지 확인해요. * 다른 워치 페이스나 다른 위치 슬롯을 선택해 보세요. ## Tiro Watch 앱 사용 방법 ### 녹음 중 사용할 수 있는 기능 녹음 화면에는 다음 세 가지 버튼이 있어요. * **\[녹음 일시정지]**: 잠시 멈춰요 * **\[녹음 재개]**: 일시정지한 녹음을 이어서 진행해요 * **\[녹음 완료]**: 녹음을 끝내고 iPhone으로 전송해요 화면 가운데에 **실시간 음성 파형**, 위쪽에 **경과 시간**이 표시돼요. ### 녹음 종료 후 iPhone으로 자동 전송돼요 녹음을 끝내면 페어링된 iPhone Tiro 앱으로 오디오가 자동 전송돼요. * 녹음 화면의 **\[녹음 완료]** 버튼을 탭해요. * 안내창에서 **\[종료하고 전송]** 버튼을 선택해요. * 전송이 끝나면 iPhone Tiro 앱에 새 노트로 나타나요. 원활한 전송을 위해 iPhone에서 **Tiro 앱을 켜 놓아주세요.** 백그라운드 상태에서는 전송이 지연될 수 있어요. Apple Watch와 iPhone을 가까이 두고 잠시 기다리시면 됩니다. ### 워치에 임시 저장된 녹음 다시 사용하기 녹음 중 연결이 끊기거나 화면을 나가도, 녹음은 워치 홈 화면에 **\[임시 저장된 녹음]** 행으로 남아요. * 홈 화면의 **\[임시 저장된 녹음]** 행을 탭하면 **\[재개]**: 이어서 녹음해요. * 행을 좌측으로 스와이프하면 **\[저장]**: 녹음을 종료해 iPhone으로 바로 전송해요. * **휴지통 아이콘**을 누르면 녹음을 삭제해요. ### Double Tap으로 더 빠르게 녹음 시작하기 지원 모델에서는 손가락을 두 번 맞대는 **Double Tap** 동작만으로 녹음을 시작할 수 있어요. * Apple Watch에서 **Tiro Watch** 앱을 열어요. * 홈 화면(빨간 마이크 버튼이 보이는 화면)에서 **엄지와 검지를 두 번 맞대요.** * 빨간 마이크 버튼을 직접 누른 것과 동일하게 녹음이 시작돼요. 지원 모델은 **Apple Watch Series 9 이상**, **Apple Watch Ultra 2 이상**과 기타 Double Tap 지원 모델이에요. 다음 상황에서는 Double Tap이 동작하지 않아요. Tiro 앱의 문제가 아니라 Apple Watch의 기본 동작이에요. * 저전력 모드가 켜져 있을 때 * 수면 집중 모드가 켜져 있을 때 * 손목을 내려 화면이 꺼져 있을 때 * Apple Watch가 잠겨 있을 때 * AssistiveTouch가 켜져 있을 때 * 가족 구성원용 Apple Watch로 설정된 경우 이럴 때는 화면의 빨간 마이크 버튼을 직접 누르거나, 컴플리케이션을 눌러 Tiro Watch를 여세요. ### AssistiveTouch로 손 제스처로 조작하기 화면을 누르기 어렵거나 손 제스처로 워치를 쓰고 싶다면 Apple Watch의 **AssistiveTouch** 기능을 이용할 수 있어요. AssistiveTouch는 Apple Watch 시스템 기능이라 Tiro Watch에서도 동일하게 작동해요. 켜는 방법은 두 가지예요. * 워치에서: **\[설정]** → **\[손쉬운 사용]** → **\[AssistiveTouch]** 켜기 → **\[손 제스처]** 켜기 * iPhone에서: **Watch** 앱 → **\[나의 시계]** → **\[손쉬운 사용]** → **\[AssistiveTouch]** 켜기 기본 손 제스처는 다음과 같아요. * **손가락 맞대기**: 다음 항목으로 이동 * **손가락 두 번 맞대기**: 이전 항목으로 이동 * **주먹 쥐기**: 선택 * **주먹 두 번 쥐기**: 동작 메뉴 열기 Tiro Watch에서는 손가락 맞대기로 **빨간 마이크 버튼**까지 이동한 뒤, **주먹 쥐기**로 선택하면 녹음이 시작돼요. AssistiveTouch를 켜면 일반 **Double Tap** 기능은 사용할 수 없어요. 손 제스처는 Apple Watch 설정에서 직접 변경할 수도 있어요. ### 자동으로 녹음이 저장될 때 다음 상황에서는 데이터 보호를 위해 녹음이 자동으로 저장돼요. * **저장공간 부족**: 워치 저장공간이 **50MB 미만**으로 떨어지면 녹음이 자동 저장되고 멈춰요. 녹음을 시작하려면 워치 저장공간이 **최소 150MB** 필요해요. 부족하면 시작 자체가 차단됩니다. * **배터리 부족**: 워치 배터리가 **25% 미만**으로 떨어지면 녹음이 자동 저장되고 멈춰요. 녹음을 시작하려면 배터리가 **25% 이상** 남아 있어야 해요. 자동 저장된 녹음은 홈 화면의 **\[임시 저장된 녹음]** 행에서 **\[저장]** 버튼을 눌러 iPhone으로 전송할 수 있어요. ## 자주 묻는 질문 ### 녹음이 시작되지 않아요. 마이크 권한, 배터리(25% 이상), 저장공간(150MB 이상)을 확인해 주세요. 권한을 거부했다면 워치의 **\[설정]** → **\[Tiro]** 메뉴에서 다시 켤 수 있어요. ### 컴플리케이션 목록에 \[Tiro]가 안 보여요. Tiro Watch 앱을 워치에서 한 번 실행한 뒤 다시 등록해 보세요. 워치 페이스마다 지원하는 컴플리케이션 종류가 달라서, 다른 워치 페이스나 슬롯을 선택해야 할 수도 있어요. ### 녹음을 완료했는데 iPhone에 노트가 안 떠요. 워치와 iPhone을 가까이 두고, iPhone에서 Tiro 앱을 켜 놓은 채 잠시 기다려 주세요. 그래도 안 오면 워치 홈 화면의 **\[임시 저장된 녹음]** 행에서 **\[저장]** 버튼을 다시 눌러 주세요. ### 녹음한 걸 워치에서 다시 들을 수 있나요? Tiro Watch에서는 녹음 재생과 편집은 지원하지 않아요. 전송이 완료된 노트는 iPhone Tiro 앱에서 재생·편집·확인할 수 있어요. ### 녹음 시간에 제한이 있나요? 녹음 시간 자체에는 별도 제한이 없어요. 저장공간과 배터리가 충분하면 길게 녹음할 수 있어요. 워치에 임시 저장된 녹음은 인터넷 없이도 만들 수 있고, iPhone으로의 전송은 Bluetooth/Wi-Fi 연결로 처리돼요. *** **관련 페이지**: [오프라인 녹음](/ko/guide/recording/offline) · [음성파일 관리](/ko/guide/notes/audio-manage) # 단어장 Source: https://docs.tiro.ooo/ko/guide/recording/wordbook 회사 이름, 동료 이름, 제품 이름처럼 자주 쓰는 고유명사를 등록해두면 티로가 모든 기록에서 정확하게 받아써요. ## 단어장은 두 종류예요 * **개인 단어장**: 내가 만든 노트 전체에 적용돼요. 어느 워크스페이스에서 노트를 만들든 따라오고, 다른 구성원에게는 보이지 않아요. **\[설정]** → **\[내 계정]** → **\[단어장 관리]** 메뉴에서 관리해요. * **워크스페이스 단어장**: 같은 워크스페이스 구성원 전체의 노트에 적용돼요. 워크스페이스마다 따로 관리되고, 구성원 누구나 단어를 추가·수정·삭제할 수 있어요. **\[설정]** → **\[워크스페이스]** → **\[워크스페이스 단어장 관리]** 메뉴에서 관리해요. 두 단어장은 함께 적용돼요. 한 노트를 기록할 때 노트를 만든 사람의 개인 단어장과 그 노트가 속한 워크스페이스의 단어장이 동시에 반영되니, 같은 단어를 양쪽에 중복 등록할 필요는 없어요. 팀이 공통으로 쓰는 단어는 워크스페이스 단어장에, 나만 쓰는 단어는 개인 단어장에 나눠 등록하면 좋아요. ## 단어 추가하는 법 개인 단어장과 워크스페이스 단어장의 사용법은 같아요. 상단의 **\[새 단어 추가]** 입력창에 단어를 입력하세요. 쉼표(,)로 구분하면 여러 단어를 한 번에 추가할 수 있어요. **\[파일 업로드]** 버튼을 누르면 문서·이미지·음성·영상 파일에서 핵심 단어를 한꺼번에 추출해요. 한 번에 최대 5개 파일, 파일당 20MB까지 올릴 수 있고, 파일당 최대 100개의 단어를 추출해줘요. 추출된 목록에서 등록할 단어만 골라 추가하면 돼요. * **\[일반 단어장]** 탭: 발음과 표기가 같은 단어를 등록해요. 영어 고유명사, 사람 이름, 회사명, 제품명에 좋아요. (예: Tiro, ChatGPT) * **\[발음+표기 단어장]** 탭: 일본어·중국어처럼 듣는 소리와 적는 글자가 다른 단어를 등록해요. (예: 발음 ひらがな / 표기 漢字, 발음 pinyin / 표기 汉字) 등록된 단어를 클릭하면 바로 수정할 수 있고, 단어 옆의 × 아이콘으로 삭제할 수 있어요. ## 자주 묻는 질문 ### 어떤 단어를 등록하면 효과가 좋은가요? 티로가 처음 들으면 헷갈릴 만한 단어일수록 효과가 커요. 회사·제품·서비스 이름, 동료 이름, 업계 약어처럼 일반 사전에 없는 고유명사를 등록하세요. ### 다른 구성원이 제 개인 단어장을 볼 수 있나요? 아니요, 개인 단어장은 본인만 볼 수 있고 다른 구성원의 노트에도 영향을 주지 않아요. 팀이 함께 쓸 단어는 워크스페이스 단어장에 등록하세요. ### 워크스페이스 단어장은 누가 관리하나요? 워크스페이스 구성원 누구나 단어를 추가·수정·삭제할 수 있어요. 별도 관리자 권한이 필요하지 않아요. ### 맥락과는 뭐가 다른가요? 단어장은 모든 노트에 상시 적용되는 고유명사 사전이고, [맥락](/ko/guide/recording/context)은 이번 대화 한 번에 적용되는 상황 설명이에요. 매번 나오는 단어는 단어장에, 이번 대화에만 해당하는 정보는 맥락에 넣으세요. *** **관련 페이지**: [맥락](/ko/guide/recording/context) · [화자 분리](/ko/guide/recording/diarization) · [워크스페이스](/ko/guide/workspace/overview) # 폴더 Source: https://docs.tiro.ooo/ko/guide/sharing/folders 노트를 폴더로 정리하고, 팀 폴더로 워크스페이스 구성원과 한 번에 공유하세요. 폴더 설명은 AI 답변의 맥락으로도 활용돼요. ## 폴더로 노트 정리하기 * **폴더 만들기**: 사이드바에서 새 폴더를 만들 수 있어요. 개인 폴더와 팀 폴더가 별도 섹션으로 나뉘어 표시돼요. * **노트에 폴더 지정**: 노트 제목 오른쪽에서 폴더를 지정해요. 한 노트를 여러 폴더에 중복으로 분류할 수도 있어요. * **폴더 정보 수정**: 폴더 옆 **\[⋯]** 버튼 → **\[폴더 수정]** 메뉴에서 색상, 이름, 설명을 바꿀 수 있어요. * **순서 바꾸기**: 폴더를 드래그해서 순서를 바꿔요. 폴더 설명은 단순 메모가 아니라 맥락 정보로 함께 참조돼요. 폴더의 용도와 주제를 자세히 적어두면 노트 작성 정확도와 Ask Tiro 답변 품질이 올라가요. ## 개인 폴더와 팀 폴더 | 구분 | 개인 폴더 | 팀 폴더 | | ------ | --------------------- | ----------------------------------- | | 누가 보나요 | 나만 볼 수 있어요 | 폴더 권한을 받은 워크스페이스 구성원 | | 공유 방식 | 폴더는 공유되지 않고, 노트별로만 초대 | 폴더에 권한을 주면 안의 노트가 일괄 공유 | | 관리자 접근 | 워크스페이스 관리자도 볼 수 없어요 | 관리자는 폴더 조회만 가능, 초대받지 않은 노트 내용은 못 봐요 | 노트를 공유해도 폴더 자체는 공유되지 않으니, 폴더 구조는 안심하고 자유롭게 정리하세요. ## 팀 폴더 만들기 사이드바의 **팀 폴더** 섹션에서 새 폴더를 만들고, 제목·설명과 함께 접근 권한을 고르세요. 공유 방식은 세 가지예요. * **\[팀 내의 모든 멤버에게 공유하기 (읽기 전용)]**: 구성원 전체가 폴더 안 노트를 읽을 수 있어요. 노트 추가·수정과 폴더 설정 변경은 할 수 없어요. * **\[팀 내의 모든 멤버에게 공유하기 (편집자)]**: 구성원 전체가 노트를 자유롭게 추가·편집하고 폴더 설정도 바꿀 수 있어요. * **\[팀 내의 특정 멤버들에게만 공유하기]**: 공유할 구성원을 직접 고르고, 구성원별로 읽기 전용/편집자 권한을 다르게 줄 수 있어요. 모두가 함께 채우는 공용 회의록 폴더라면 편집자 권한이, 정해진 사람이 정리한 자료를 전체가 보는 폴더라면 읽기 전용이 잘 맞아요. ## 폴더 권한 이해하기 팀 폴더의 구성원은 세 가지 역할 중 하나를 가져요. | 역할 | 할 수 있는 일 | | ------------------- | ------------------------------- | | **읽기 전용 (Viewer)** | 폴더 안의 노트를 읽기만 해요 | | **편집자 (Editor)** | 노트를 읽고 추가·수정하고, 폴더 설정을 바꿀 수 있어요 | | **만든 사람 (Creator)** | 모든 권한에 더해 폴더 삭제·이동까지 가능해요 | * 폴더에 권한이 있으면 그 안의 모든 노트에 접근할 수 있어요. 같은 폴더 안의 특정 노트만 가리는 건 지원하지 않으니, 따로 보여줄 노트는 별도 폴더로 나누세요. * 공유받지 못한 구성원에게는 폴더가 회색 아이콘과 **비공개 폴더** 라벨로 표시되고, 안의 노트와 설명은 볼 수 없어요. 다만 그 안에 자신이 공유받은 하위 폴더가 있다면 그 하위 폴더는 정상적으로 열 수 있어요. * 권한과 구성원은 폴더 옆 **\[⋯]** → **\[폴더 설정]** → **\[폴더 정보]** 탭에서 언제든 바꿀 수 있어요. ## 폴더에서 Ask Tiro 쓰기 폴더를 열고 Ask Tiro에 질문하면 그 폴더 안의 노트 전체를 대상으로 답해요. > \[고객 인터뷰 폴더] "이번 달 고객 인터뷰에서 가장 많이 나온 불편사항은 뭐야?" > \[팀 위클리 미팅 폴더] "지난주 미팅에서 결정된 주요 사항들을 요약해줘." 답변에는 참고한 노트가 함께 표시돼요. 자세한 사용법은 [Ask Tiro](/ko/guide/notes/ask-tiro)를 참고하세요. ## 자주 묻는 질문 ### 공유받은 노트와 팀 폴더는 뭐가 다른가요? 공유받은 노트는 누군가 내 계정에 노트를 직접 초대한 경우로, 어느 워크스페이스에서든 같은 위치에 보여요. 팀 폴더는 폴더 단위 권한이라 그 워크스페이스 안에서만 보이고, 워크스페이스를 떠나면 접근할 수 없어요. 직접 초대도 받고 팀 폴더 구성원이기도 하면 같은 노트가 양쪽에 보일 수 있어요. ### 공유받은 노트를 내 개인 폴더나 팀 폴더에 넣을 수 있나요? 공유받은 노트는 내 폴더에 넣을 수 없어요. 공유받은 노트는 노트를 만든 사람의 워크스페이스에 남아 있고, 내 폴더는 내 워크스페이스 안에 있어요. 내 폴더에 넣으려면 노트를 내 워크스페이스로 옮겨야 하는데, 노트를 다른 워크스페이스로 옮기는 건 노트를 만든 사람만 할 수 있어요. 그래서 편집자 권한으로 공유받았더라도 내 폴더로는 가져올 수 없어요. 편집자 권한은 노트 내용을 수정할 수 있다는 뜻이지, 노트를 내 워크스페이스로 옮길 수 있다는 뜻은 아니에요. ### 팀 폴더를 다른 워크스페이스로 옮길 수 있나요? 폴더 단위 이동은 지원하지 않아요. 본인이 만든 노트는 하나씩 다른 워크스페이스로 옮길 수 있고, 공유받은 노트는 만든 사람만 옮길 수 있어요. ### 워크스페이스 관리자는 내 개인 폴더를 볼 수 있나요? 아니요, 개인 폴더는 관리자를 포함해 본인 외에는 아무도 볼 수 없어요. *** **관련 페이지**: [공유](/ko/guide/sharing/overview) · [폴더 자동화](/ko/guide/automation/folders) · [워크스페이스](/ko/guide/workspace/overview) # 내보내기 Source: https://docs.tiro.ooo/ko/guide/sharing/integrations 노트를 PDF·Word·이메일로 내보내거나 Google Drive·Slack·Notion·Confluence·HubSpot·Salesforce로 바로 보낼 수 있어요. 협업툴은 한 번만 연동하면 돼요. 내보내기는 노트를 파일로 저장하거나 다른 협업툴로 보내는 기능이에요. PDF·Word·이메일로 내보내고, Google Drive·Slack·Notion·Confluence·HubSpot·Salesforce에는 한 번 연동해 두면 노트의 **\[공유하기]** 메뉴에서 바로 보낼 수 있어요. 협업툴 전송과 파일 내보내기는 기록이 끝난 노트에서 사용할 수 있어요. 기록 중에는 "대화 내용이 기록되고 나면 사용할 수 있어요"라고 표시돼요. Slack·Notion·Confluence 전송과 PDF·Word 내보내기는 웹·데스크탑 앱에서 제공돼요. Google Drive로 내보내기는 웹 앱에서 제공돼요. ## 파일로 내보내기 노트를 PDF·Word·이메일로 내보낼 수 있어요. **\[공유하기]** 메뉴의 PDF, Word, 이메일 항목에서 파일로 내보내요. 내보낼 내용은 직접 골라요. * 노트 요약, 스크립트·대화 기록, 생성해둔 템플릿 문서를 각각 체크해서 조합할 수 있어요. * 이메일은 받는 사람 주소를 입력하면 선택한 내용이 본문으로 발송돼요. 무엇을 보여줄지 고르는 방법은 [공유](/ko/guide/sharing/overview)를 참고하세요. 모바일 앱에서는 링크 공유와 이메일 보내기를 사용할 수 있고, PDF·Word 파일이 필요하면 웹이나 데스크탑 앱에서 내보내 주세요. ## 협업툴로 보내기 Google Drive·Slack·Notion·Confluence·HubSpot·Salesforce에 노트를 보낼 수 있어요. 협업툴을 연동하면 노트의 **\[공유하기]** 메뉴에서 바로 보낼 수 있어요. 연결이 만료된 서비스는 다시 연결해 주세요. ### 협업툴 연동하기 연동하는 방법은 두 가지예요. * **공유하면서 연동하기**: 노트의 **\[공유하기]** 메뉴에서 원하는 서비스를 선택하면 연동 화면이 열려요. 연동이 끝나면 자동으로 공유 화면으로 돌아와, 그대로 노트를 보낼 수 있어요. * **미리 연동하기**: **\[설정]** → **\[연동 관리]** 메뉴에서 서비스를 미리 연동하고 관리할 수 있어요. 모바일 앱에서는 **\[설정]** → **\[연결된 서비스]** 메뉴예요. ### Slack으로 보내기 **\[공유하기]** → Slack을 선택하고, 보낼 채널을 고른 뒤 함께 전달할 메시지를 입력해 전송하세요. 노트가 공유 링크와 함께 채널에 게시돼요. * 비공개 채널에 보내려면 그 채널에서 `/invite @Tiro`로 Tiro 봇을 먼저 초대해 주세요. * 기록이 끝날 때마다 자동으로 보내고 싶다면 [공유 자동화](/ko/guide/automation/sharing)를 설정하세요. ### Notion으로 보내기 **\[공유하기]** → Notion을 선택하고, 검색창에서 노트를 저장할 **페이지 또는 데이터베이스**를 고르세요. 페이지를 고르면 하위 페이지로, 데이터베이스를 고르면 새 항목으로 만들어져요. * 내보내기 대상을 바꾸고 싶으면 선택된 대상을 다시 클릭해 다른 페이지를 검색하면 돼요. 재연동은 필요 없어요. * 페이지가 검색되지 않는다면 데이터베이스를 대상으로 선택해 보세요. ### Confluence로 보내기 **\[공유하기]** → Confluence를 선택하고, 스페이스와 상위 페이지(선택), 포함할 내용을 골라 공유하세요. ### Google Drive에 Google Docs로 내보내기 웹 앱에서 **\[공유하기]** → Google Drive를 선택하면 노트를 Google Docs 문서로 내보낼 수 있어요. 처음 사용할 때 Google 계정을 연결하면 **\[Google Docs로 내보내기]** 화면으로 자동으로 돌아와요. 1. **\[폴더 선택]** 버튼으로 Google Drive 폴더를 고르세요. 2. 노트, 스크립트, 요약, 생성한 문서 중 Google Docs에 포함할 내용을 하나 이상 선택하세요. 3. **\[내보내기]** 버튼을 누르면 선택한 폴더에 새 Google Docs 문서가 만들어져요. 폴더를 고르지 않으면 이전에 기본값으로 저장한 폴더를 사용해요. 저장한 기본 폴더가 없으면 Google Drive의 **Tiro** 폴더로 내보내요. 새로 고른 폴더를 계속 사용하려면 **\[기본 폴더로 사용]** 옵션을 선택하세요. Google Drive 내보내기는 실행할 때마다 새 Google Docs 문서를 한 번 생성해요. 문서를 자동으로 동기화하거나 기록 종료 후 자동으로 내보내지는 않아요. ### HubSpot에 기록하기 HubSpot을 연결하면 공유 메뉴에 **\[HubSpot에 기록하기]** 항목이 나타나요. 노트를 CRM 레코드로 저장할 수 있고, 모바일 앱에서도 사용할 수 있어요. ### Salesforce에 기록하기 웹이나 데스크톱 앱에서 Salesforce를 연결한 뒤 **\[공유하기]** 메뉴에서 **\[Salesforce에 기록하기]** 항목을 선택하세요. 제목과 포함할 내용을 확인해 일정(Event)으로 기록해요. * 녹음 시간 주변의 기존 일정을 선택해 회의록을 추가하거나, 노트의 녹음 시작·종료 시각으로 새 일정을 만들 수 있어요. * 고객사(Account)나 영업 기회(Opportunity)를 고르고, 연락처(Contact) 한 명을 선택적으로 연결할 수 있어요. 잠재 고객(Lead)을 고르면 Salesforce 규칙에 따라 고객사·영업 기회 대신 잠재 고객에 일정이 연결돼요. * 제목과 포함할 내용은 기록하기 전에 확인하고 바꿀 수 있어요. * 자동 기록과 Salesforce 사용자 정의 필드 연결은 지원하지 않아요. * Salesforce 연결이 만료되면 **\[다시 연결하기]** 버튼을 선택해 연결해 주세요. ## 자동으로 내보내기 기록이 끝날 때마다 지원되는 협업툴로 자동 전송할 수 있어요. 조건과 대상은 [공유 자동화](/ko/guide/automation/sharing)에서 설정하세요. Google Drive와 Salesforce는 자동으로 내보내거나 기록하지 않아요. 공유 메뉴에서 직접 실행해 주세요. ## 자주 묻는 질문 ### Notion에서 페이지가 검색되지 않아요. 일부 환경에서 페이지 검색이 안 되는 경우가 있어요. 데이터베이스를 대상으로 선택하면 정상적으로 내보낼 수 있어요. ### 비공개 Slack 채널에도 보낼 수 있나요? 네, 보내려는 비공개 채널에서 `/invite @Tiro`를 입력해 Tiro 봇을 초대하면 채널 목록에 나타나요. ### 회의가 끝날 때마다 자동으로 Slack에 올라가게 할 수 있나요? 네, [공유 자동화](/ko/guide/automation/sharing)에서 조건을 설정하면 기록이 종료될 때 자동으로 채널에 게시돼요. *** **관련 페이지**: [공유](/ko/guide/sharing/overview) · [공유 자동화](/ko/guide/automation/sharing) # 공유 보안과 관리 Source: https://docs.tiro.ooo/ko/guide/sharing/link-security 관리자가 워크스페이스의 모든 공유 링크를 한곳에서 회수하고, 공개 범위 상한·유효기간·허용 도메인을 정책으로 강제할 수 있어요. 공유 링크 관리·회수는 모든 워크스페이스에서 쓸 수 있고, 워크스페이스 차원의 공유 정책은 엔터프라이즈 플랜에서 제공돼요. 노트별 공개 범위를 고르는 방법과, 구성원이 새 링크에 적용할 개인 기본 공개 범위(**\[설정]** → 일반 화면의 **\[링크 공유 기본값]**)를 정하는 방법은 [공유](/ko/guide/sharing/overview) 가이드에서 다뤄요. 이 페이지는 관리자가 공유를 통제하는 기능을 모았어요. 현재 웹과 데스크탑 앱에서 사용할 수 있고, 모바일 앱에는 순차적으로 적용될 예정이에요. ## 무엇을 할 수 있나요? 링크로 노트를 공유하는 편리함은 그대로 누리면서, 회사 밖으로는 내용이 새어 나가지 않게 관리자가 지킬 수 있어요. * **공유 링크 관리·회수**: 관리자가 워크스페이스에서 공유 중인 링크를 한곳에서 확인하고 바로 회수할 수 있어요. * **공개 범위 상한 강제** : 관리자가 구성원이 만드는 링크의 공개 범위 상한을 정해, 상한보다 넓은 공유를 막아요. 구성원이 노트별로 공개 범위를 고르는 방법은 [공유](/ko/guide/sharing/overview) 가이드를 참고하세요. * **워크스페이스 공유 정책** : 관리자가 공개 범위 상한, 최대 유효기간, 허용된 회사 도메인을 정해요. ## 공유받은 링크 열람하기 슬랙 DM이나 메일로 받은 **\[회사 구성원만]** 범위의 노트 링크는 회사 계정으로 로그인하면 바로 열람할 수 있어요. 티로에 따로 가입하지 않아도 돼요. 1. 링크를 클릭하면 "회사 계정으로 로그인이 필요해요" 화면이 나타나요. 이미 회사 계정으로 로그인한 상태라면 노트가 바로 열려요. 2. **\[회사 계정으로 로그인]** 버튼을 눌러 회사 Google 계정으로 로그인해요. 3. 로그인이 끝나면 노트 화면으로 자동으로 돌아와 내용을 볼 수 있어요. 회사 계정으로 로그인이 필요해요 안내 화면. 자물쇠 아이콘과 회사 계정으로 로그인 버튼이 표시됨 허용된 회사 도메인 계정으로 로그인해야 노트를 볼 수 있어요. 기본은 노트를 공유한 사람의 회사 도메인이고, 엔터프라이즈 플랜에서는 관리자가 허용 도메인 목록을 직접 관리해요. 티로 계정이 없어도 그 도메인 계정으로 인증만 되면 열람할 수 있고, 다른 도메인 계정으로 로그인하면 노트가 보이지 않아요. 슬랙 DM, 메일 등 어떤 경로로 링크를 클릭해도 동일하게 동작해요. ## 공유된 링크 확인하고 회수하기 워크스페이스 관리자는 지금 공유 중인 링크를 한곳에서 확인하고 바로 회수할 수 있어요. **\[설정]** → **\[워크스페이스]** 화면의 "공유된 링크" 섹션에 현재 공유 중인 링크 목록이 표시되고, 노트 제목과 공개범위, 공유일을 함께 확인할 수 있어요. 공유된 링크 목록. 노트 제목과 공개 범위, 공유일이 표시되고 각 행에 회수 버튼, 상단에 전체 회수 버튼이 있는 화면 * 특정 링크만 거두려면 해당 행의 **\[회수]** 버튼을 눌러요. * 여러 링크를 한꺼번에 거두려면 각 링크를 체크박스로 선택한 뒤 회수해요. * 모든 링크를 한 번에 거두려면 상단의 **\[전체 회수]** 버튼을 눌러요. 회수한 링크는 즉시 열 수 없게 되고, 노트는 비공개 상태로 돌아가요. 노트를 다시 공유하고 싶다면 노트에서 새 공유 링크를 만들면 돼요. 회수는 되돌릴 수 없어요. 같은 링크를 복구할 수 없고, 다시 공유하면 새 링크가 만들어져요. ## 워크스페이스 공유 정책 관리하기 워크스페이스 관리자에게만 보이는 설정이에요. 관리자라면 구성원이 만드는 공유 링크의 공개 범위와 유효기간, 허용된 회사 도메인을 워크스페이스 차원에서 정할 수 있어요. **\[설정]** → **\[워크스페이스]** 화면의 "공유 정책" 섹션에서 세 가지 정책을 설정해요. 공유 정책 섹션. 워크스페이스 공유 범위 상한이 회사 구성원만으로, 공유 링크 최대 유효기간이 90일로 설정된 화면 **\[워크스페이스 공유 범위 상한]** 옵션은 구성원이 만드는 공유 링크의 최대 공개 범위를 강제해요. 상한은 **\[링크가 있는 누구나]**, **\[회사 구성원만]**, **\[비공개(링크 공유 불가)]** 세 단계 중 하나로 정하고, 가장 강한 **\[비공개(링크 공유 불가)]** 옵션은 워크스페이스 전체에서 링크 공유 자체를 막아요. 상한은 기존 공유 노트에도 즉시 소급 적용돼요. 예를 들어 상한을 **\[회사 구성원만]** 옵션으로 설정하면, 기존에 **\[링크가 있는 모든 사용자]** 범위로 공유된 링크도 그 시점부터 회사 구성원만 열람할 수 있고, 링크를 다시 만들 필요가 없어요. 구성원이 노트를 새로 공유할 때 상한보다 넓은 범위를 고르면 자동으로 상한에 맞게 조정돼요. **\[공유 링크 최대 유효기간]** 옵션은 새로 만드는 공유 링크가 만료되기까지의 최대 일수를 정해요. 값을 비워 두면 만료 없이 무제한으로 유지돼요. 최대 유효기간은 설정한 뒤 새로 만드는 공유 링크부터 적용되고, 설정 이전에 만든 기존 링크는 만료되지 않아요. 허용된 회사 도메인 설정에서는 **\[회사 구성원만]** 범위의 링크를 열람할 수 있는 회사 도메인 목록을 관리해요. 등록된 도메인 계정으로 인증한 사람이라면 티로 계정이 없어도 링크를 열람할 수 있어요. ## 자주 묻는 질문 ### 정책을 설정하기 전에 공유해 둔 링크는 어떻게 되나요? 따로 손대지 않아도 공유 범위 상한에 맞춰 자동으로 보호돼요. 상한이 **\[회사 구성원만]** 옵션으로 설정되면, 예전에 **\[링크가 있는 모든 사용자]** 옵션으로 공유했던 노트도 그 시점부터 회사 구성원만 볼 수 있어요. 열어보는 시점에 정책이 적용되기 때문에 링크를 다시 만들 필요도 없고, 주소도 그대로예요. 다만 공유 링크 최대 유효기간은 다르게 동작해요. 유효기간은 정책 설정 이후 새로 만드는 공유 링크부터 적용되고, 그 전에 만든 링크는 만료되지 않아요. ### 회사 밖 사람(외부 파트너)에게 노트를 보여줘야 하면 어떻게 하나요? 예, 노트에 직접 초대하면 가능해요. 공유 링크는 워크스페이스 정책에 따라 허용된 회사 도메인 계정만 열 수 있지만, "노트 공유" 팝업의 초대 입력란에 그분의 티로 계정 이메일을 입력해 실명으로 초대하면 외부 분도 해당 노트를 볼 수 있어요. 익명 링크 공유로 워크스페이스 공개 제한을 넘어서는 방법은 제공되지 않아요. 누가 보는지 명확한 실명 초대 방식만 허용돼요. ### 링크를 받은 사람이 티로 계정이 없어도 볼 수 있나요? 예, 볼 수 있어요. 티로에 가입한 적이 없어도 괜찮아요. **\[회사 구성원만]** 옵션으로 공유된 링크를 열면 "회사 계정으로 로그인이 필요해요" 화면이 나오는데, 여기서 **\[회사 계정으로 로그인]** 버튼을 눌러 회사 Google 계정으로 로그인하면 바로 노트로 이동해요. 이때 로그인한 계정의 이메일 도메인이 허용된 회사 도메인과 일치해야 노트가 열려요. ### "회사 구성원만" 링크를 열었는데 노트를 찾을 수 없다고 나와요 대부분 아래 세 가지 중 하나예요. 순서대로 확인해 보세요. 1. **로그인 계정 확인**: 회사 계정이 아닌 개인 계정으로 로그인되어 있으면, 보안을 위해 노트가 없는 것처럼 표시돼요. 회사 도메인 이메일 계정으로 다시 로그인해 보세요. 2. **링크 만료 확인**: 워크스페이스에 공유 링크 최대 유효기간이 설정되어 있으면, 기간이 지난 링크는 같은 화면으로 차단돼요. 3. **회수 여부 확인**: 관리자가 해당 링크를 회수했을 수 있어요. 만료되었거나 회수된 링크로는 노트를 볼 수 없으니, 노트 소유자에게 새 공유 링크를 요청해 주세요. ### 실수로 공유한 링크를 바로 막을 수 있나요? 예, 가능해요. 워크스페이스 관리자가 워크스페이스 설정의 "공유된 링크" 목록에서 해당 노트의 **\[회수]** 버튼을 누르면 링크가 즉시 무효화돼요. 급한 경우 관리자에게 노트 제목과 함께 회수를 요청하면 돼요. ### 모바일 앱에서는 왜 공유 설정이 안 보이나요? 공유 보안·관리 옵션은 현재 웹과 데스크탑 앱에서 이용할 수 있어요. 모바일 앱에는 순차적으로 적용될 예정이에요. 모바일 앱에 적용되기 전까지는 웹 브라우저나 데스크탑 앱에서 공유 설정을 관리해 주세요. *** **관련 페이지**: [공유](/ko/guide/sharing/overview) · [내보내기](/ko/guide/sharing/integrations) · [폴더](/ko/guide/sharing/folders) · [개인정보 보호 및 보안](/ko/guide/privacy/overview) # 공유 Source: https://docs.tiro.ooo/ko/guide/sharing/overview 링크 하나로 누구에게나 노트를 보여주거나, 권한을 지정해 함께 편집할 사람을 초대하거나, 파일·협업툴로 내보낼 수 있어요. ## 공유하는 세 가지 방법 노트는 링크, 권한 초대, 내보내기 세 가지 방법으로 공유해요. 상황에 맞는 방법을 고르면 돼요. * **링크로 공유하기**: **\[링크 복사]** 버튼으로 공유 링크를 만들어 누구에게나 보내요. 받은 사람은 로그인 없이 바로 노트를 볼 수 있어요. * **권한 초대로 함께 작업하기**: 특정 사람에게 읽기 전용·편집자·소유자 역할을 주고 함께 작업해요. * **파일·협업툴로 내보내기**: 노트를 PDF·Word·이메일로 내보내거나 Slack·Notion·Confluence·HubSpot으로 보내요. 자세한 방법은 [내보내기](/ko/guide/sharing/integrations)를 참고하세요. 기록이 끝날 때마다 노트를 자동으로 보내려면 [공유 자동화](/ko/guide/automation/sharing)를 설정하세요. ## 노트 공유 시작하기 노트 화면 우측 상단의 **\[공유하기]** 버튼을 누르면 공유 메뉴가 열려요. 링크 공유와 초대는 기록이 진행 중일 때도 가능하고, 파일 내보내기와 협업툴 전송은 기록이 끝난 뒤에 사용할 수 있어요. 노트를 끝까지 열지 않고 목록에서 미리보기로 띄운 상태에서도 **\[공유하기]** 버튼으로 바로 링크를 공유할 수 있어요. 기록을 시작하기 전에 노트를 팀원에게 미리 공유해 두면, 기록되는 내용을 실시간으로 함께 볼 수 있어요. ## 링크로 공유하기 **\[링크 복사]** 버튼을 누르면 누구에게나 보낼 수 있는 공유 링크가 복사돼요. 링크를 받은 사람은 **티로 계정이나 로그인 없이** 바로 노트를 볼 수 있어요. 노트에서 공유 팝업을 열면 "노트 공유" 화면이 나타나요. "액세스 권한" 섹션 맨 아래에 현재 링크의 공개 범위가 표시되는데, 이 행을 누르면 "링크 접근" 화면으로 이동해요. 노트 공유 팝업. 액세스 권한 섹션에 소유자와 편집자 목록, 맨 아래에 회사 구성원만 행이 표시된 화면 ### 공개 범위 고르기 공유 링크의 공개 범위는 세 단계 중 하나예요. "링크 접근" 화면에서 **\[일반 사용 권한]** 드롭다운을 열어 선택해요. * **\[링크가 있는 모든 사용자]** 옵션: 링크를 받은 사람은 누구나 읽기 전용으로 볼 수 있어요. * **\[회사 구성원만]** 옵션: 회사 계정으로 로그인한 구성원만 볼 수 있어요. 기본으로 노트를 공유한 사람의 계정 도메인을 회사 도메인으로 인식하고, Gmail 같은 공용 메일 도메인은 자동으로 회사 도메인이 되지 않아요. 허용된 회사 도메인이 설정되어 있으면 이 옵션은 실제 도메인 이름으로 구체적으로 표시돼요. 예를 들어 도메인이 theplato.io 하나면 **\[theplato.io 구성원만]**, 여러 개면 **\[theplato.io 외 2개 도메인 구성원만]** 형태로 나타나요. * **\[초대된 사람만]** 옵션: 공유 링크가 꺼져요. 기존 링크로는 아무도 노트를 열 수 없고, 노트에 직접 초대된 사람만 접근할 수 있어요. 링크 접근 화면. 일반 사용 권한 드롭다운이 열려 링크가 있는 모든 사용자, 회사 구성원만, 초대된 사람만 세 옵션이 표시된 화면 **\[회사 구성원만]** 옵션을 고르면 받는 사람은 회사 계정으로 로그인해야 노트를 볼 수 있어요. 받는 사람의 열람 경험과 관리자가 공개 범위를 상한으로 강제하는 방법은 [공유 보안과 관리](/ko/guide/sharing/link-security)를 참고하세요. ### 비밀번호로 보호하기 링크에 비밀번호를 걸면 비밀번호를 아는 사람만 노트를 볼 수 있어요. 비밀번호는 안전한 값으로 자동 생성되고, **\[링크·비밀번호 복사]** 버튼으로 링크와 비밀번호를 함께 보낼 수 있어요. 모바일 앱에서는 공유 메뉴의 **\[링크]** 섹션에서 보내기·복사·설정을 할 수 있고, **\[비밀번호 생성]** 스위치로 보호를 켤 수 있어요. ### 링크 끄기 공유 링크를 끄려면 공개 범위를 **\[초대된 사람만]** 옵션으로 바꿔요. 기존 링크로는 더 이상 노트를 열 수 없고, 직접 초대한 사람만 접근할 수 있어요. ### 새 링크 기본 공개 범위 바꾸기 새로 만드는 공유 링크의 기본 공개 범위를 직접 정할 수 있어요. **\[설정]** → 일반 화면의 "공유 설정" 섹션에서 **\[링크 공유 기본값]** 옵션을 원하는 범위로 선택하면, 이후 만드는 공유 링크에 그 값이 기본으로 적용돼요. 워크스페이스 상한보다 넓은 범위를 기본값으로 설정해도, 실제 공유할 때는 상한으로 제한돼요. 자세한 내용은 [공유 보안과 관리](/ko/guide/sharing/link-security)를 참고하세요. ## 함께 작업할 사람 초대하기 링크 공유 대신 특정 사람에게 권한을 주고 싶다면 **\[권한 설정]** 메뉴에서 초대하세요. 이름이나 이메일로 검색하면 [등록해둔 참석자](/ko/guide/recording/participants)가 바로 떠요. 등록되지 않은 사람은 이메일 전체를 입력해 추가할 수 있어요. 초대받은 사람이 할 수 있는 일은 역할에 따라 달라요. | 역할 | 받은 사람이 할 수 있는 일 | | --------- | ----------------------------------------------------------------------------------------- | | **읽기 전용** | 노트를 읽고, Ask Tiro로 질문하고, PDF·Word로 내보낼 수 있어요. 내용·참석자 수정, 폴더 정리, 다른 사람 초대나 협업툴 재공유는 할 수 없어요 | | **편집자** | 읽기 전용이 할 수 있는 일에 더해, 노트 내용·제목·참석자 정보를 수정하고 공유 링크로 보낼 수 있어요 | | **소유자** | 모든 권한을 가져요. 다른 사람 초대, 공개 범위 관리, 노트 삭제는 소유자만 할 수 있어요 (노트를 만든 사람) | 읽기 전용으로 받은 노트에서는 우측 상단 버튼이 **\[내보내기]** 로 표시되고, PDF·Word 내보내기만 열려요. 화자 이름 바꾸기와 폴더 정리도 읽기 전용에서는 할 수 없어요. ## 무엇을 보여줄지 고르기 공유할 때 받는 사람에게 보여줄 내용을 골라서 조합할 수 있어요. 요약, 스크립트, 대화 기록, 생성한 문서 중 보여주고 싶은 것만 선택하세요. 받은 사람에게는 **공유 시점에 선택한 내용만** 보여요. 예를 들어 스크립트를 빼고 공유하면 상대는 스크립트를 볼 수 없어요. 같은 선택 방식이 파일·협업툴 [내보내기](/ko/guide/sharing/integrations)에도 그대로 적용돼서, 내보낼 때도 요약·스크립트·문서 중 원하는 것만 담을 수 있어요. ## 공유할 때 알아두기 워크스페이스 정책에 따라 링크 공유가 제한될 수 있어요. "이 팀에서는 링크 공유하기가 허용되지 않아요"라고 표시되면 워크스페이스 관리자에게 문의하세요. 정책으로 공개 범위가 어떻게 제한되는지는 [공유 보안과 관리](/ko/guide/sharing/link-security)에서 확인할 수 있어요. 폴더 단위로 여러 노트를 한 번에 공유하려면 [폴더](/ko/guide/sharing/folders)의 팀 폴더를 사용하세요. ## 자주 묻는 질문 ### 링크를 받은 사람도 티로에 가입해야 하나요? 아니요, 링크를 받은 사람은 로그인 없이 바로 노트를 볼 수 있어요. 비밀번호로 보호한 링크라면 비밀번호만 입력하면 돼요. ### 비밀번호를 직접 정할 수 있나요? 비밀번호는 안전한 값으로 자동 생성돼요. 링크 설정에서 보기·복사할 수 있고, **\[링크·비밀번호 복사]** 버튼으로 함께 전달하면 편해요. ### 기록 중에도 공유할 수 있나요? 네, 링크 공유와 초대는 기록 중에도 가능해요. 받은 사람은 기록되는 내용을 실시간으로 볼 수 있어요. PDF·Word·이메일 내보내기와 협업툴 전송은 기록이 끝난 뒤에 활성화돼요. 내보내기 방법은 [내보내기](/ko/guide/sharing/integrations)를 참고하세요. ### 공유를 그만하고 싶어요. 링크 공개 범위를 **\[초대된 사람만]** 옵션으로 바꾸면 기존 링크로 더 이상 접근할 수 없어요. 초대한 사람은 권한 설정에서 제외하면 돼요. 관리자가 워크스페이스에서 공유 링크를 회수하는 방법은 [공유 보안과 관리](/ko/guide/sharing/link-security)를 참고하세요. *** **관련 페이지**: [폴더](/ko/guide/sharing/folders) · [공유 보안과 관리](/ko/guide/sharing/link-security) · [내보내기](/ko/guide/sharing/integrations) · [공유 자동화](/ko/guide/automation/sharing) # 티로를 AI와 연결하기 Source: https://docs.tiro.ooo/ko/guide/start/ai-connect 티로에 쌓인 노트와 위키를 AI와 함께 쓰는 네 가지 방법이에요. 내장 AI 채팅부터 Claude 연결, API 자동화까지. 티로의 가치는 기록에서 끝나지 않아요. 쌓인 노트와 위키를 AI가 활용할 수 있게 연결하면, 우리 팀 맥락을 아는 AI를 갖게 돼요. 수준에 따라 네 가지 방법이 있어요. ## 1. Ask Tiro: 설정 없이 바로 티로 안에 내장된 AI 채팅이에요. 노트 하나에 대해 묻거나, 워크스페이스 전체 노트를 대상으로 "최근 2주간 미팅 요약해줘"처럼 질문할 수 있어요. 답변에는 근거 노트로 이동하는 출처 번호가 붙어요. 별도 설정 없이 지금 바로 쓸 수 있어요. → [Ask Tiro 사용법](/ko/guide/notes/ask-tiro) ## 2. 위키: AI가 쓸 지식 기반 만들기 노트가 쌓이면 위키가 사람·주제·결정을 자동으로 추출해 워크스페이스의 지식 그래프를 만들어요. 위키가 있으면 Ask Tiro와 외부 AI의 답변이 더 정확하고 빨라져요. Pro 플랜 이상에서 활성화할 수 있어요. → [위키 안내](/ko/guide/notes/wiki) ## 3. MCP: Claude 같은 AI 에이전트 연결 MCP(Model Context Protocol)를 지원하는 AI 에이전트(Claude Desktop, Claude Code 등)에 Tiro MCP를 연결하면, 에이전트가 내 노트와 위키를 직접 검색하고 읽으면서 일해요. "이번 주 회의에서 결제 시스템 얘기 어디서 나왔어?"라고 Claude에게 바로 물어볼 수 있어요. → 연결 방법은 [개발자 문서의 MCP 안내](/ko/developers/mcp/tools/wiki)를 참고하세요. ## 4. API·CLI: 자동화 워크플로우에 연결 노트 조회·검색, 웹훅, 위키 데이터까지 REST API로 제공돼요. 터미널이나 CI 환경에서는 Tiro CLI로 노트를 다룰 수 있어요. 모든 플랜에서 추가 과금 없이 사용할 수 있어요. → [API·MCP·CLI 안내](/ko/guide/notes/api-mcp-cli) · [개발자 문서](/ko/developers/fundamentals/api-overview) ## 데이터는 안전한가요? 어떤 연결 방식이든 본인이 접근할 수 있는 노트만 다룰 수 있고, 노트 권한 체계를 그대로 따라요. 고객 데이터는 AI 모델 학습에 일절 사용되지 않아요. 자세한 내용은 [개인정보 보호 및 보안](/ko/guide/privacy/overview)을 참고하세요. *** **관련 페이지**: [Ask Tiro](/ko/guide/notes/ask-tiro) · [위키](/ko/guide/notes/wiki) · [API·MCP·CLI 안내](/ko/guide/notes/api-mcp-cli) # 앱 안내 Source: https://docs.tiro.ooo/ko/guide/start/download 웹, 데스크탑(Windows·Mac), 모바일(iOS·Android), Apple Watch까지. 플랫폼별 특징과 다운로드 방법을 안내해요. 티로는 웹 브라우저, 데스크탑 앱, 모바일 앱에서 같은 계정으로 사용할 수 있어요. 노트는 서버에 동기화되어 어느 기기에서든 똑같이 보여요. 앱 다운로드는 [다운로드 페이지](https://tiro.ooo/download/app)에서 한 번에 할 수 있어요. ## 웹 브라우저(Chrome, Safari 등)에서 [tiro.ooo](https://tiro.ooo)에 접속하면 설치 없이 바로 사용할 수 있어요. 실시간 기록, 음성파일 업로드, 노트 관리 등 핵심 기능을 지원해요. 단, 브라우저 보안 정책상 시스템 오디오(컴퓨터 재생음) 녹음과 오프라인 녹음은 지원하지 않아요. ## 데스크탑 앱 (Windows·Mac) [다운로드 페이지](https://tiro.ooo/download/app)에서 설치할 수 있어요. Windows는 Windows 10 이상을 지원하고, Mac 설치 파일은 Intel·Apple Silicon 공용이에요. * **시스템 오디오 녹음**: Zoom·Google Meet 같은 화상회의 상대방 목소리, 영상·강의 소리까지 함께 기록해요. 자세한 내용은 [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio)을 참고하세요. * **오프라인 녹음**과 [음성파일 로컬 저장](/ko/guide/notes/local-audio)을 지원해요. * **미팅 알림**: [캘린더를 연동](/ko/guide/automation/calendar)하면 미팅 시작 10분 전에 알림을 받고 클릭 한 번으로 기록을 시작할 수 있어요. * **키보드 단축키**: 앱이 켜져 있을 때 `Cmd+O`(Mac)·`Ctrl+O`(Windows)로 오프라인 녹음을, `Cmd+N`·`Ctrl+N`로 실시간 기록을, `Cmd+U`·`Ctrl+U`로 음성파일 업로드를 바로 시작해요. * 앱은 자동으로 업데이트돼요. 버전 확인과 문제 해결은 [앱 업데이트](/ko/guide/troubleshooting/desktop-update)를 참고하세요. * 결제는 웹 브라우저에서 진행돼요. **\[설정]** → **\[플랜 관리]** 메뉴에서 구독을 시작하면 웹 결제 창이 열려요. ## 모바일 앱 (iOS·Android) [App Store](https://apps.apple.com/us/app/tiro-real-time-transcription/id6503079839)와 [Google Play](https://play.google.com/store/apps/details?id=io.plato.tiro)에서 설치할 수 있어요. * **인터넷 없이도 즉시 기록**: [오프라인 녹음](/ko/guide/recording/offline)이 기본 모드라 버튼 한 번으로 기록이 시작되고, 종료 후 네트워크가 연결되면 자동으로 노트로 변환돼요. * **언어 자동 인식**: 여러 언어가 섞인 대화도 자동으로 구분해 기록해요. * **백그라운드 녹음**: 화면을 잠그거나 다른 앱을 써도 녹음이 계속돼요. iOS는 Dynamic Island에서, Android는 푸시 알림에서 기록 상태를 확인할 수 있어요. * 새 노트 화면에서 **\[실시간 기록]** 모드를 선택하면 실시간 받아쓰기와 번역도 사용할 수 있어요. * Android(갤럭시)는 [통화 녹음 변환](/ko/guide/recording/call-recording)도 지원해요. * **홈 화면 위젯**: 실시간 기록·오프라인 녹음 위젯을 홈 화면이나 잠금 화면에 추가하면, 앱을 열지 않고 위젯을 눌러 바로 기록을 시작해요. iOS·Android 모두 지원해요. ## Apple Watch iPhone에 티로 앱을 설치하면 Apple Watch에도 Tiro Watch 앱이 자동으로 설치돼요. 워치에서 바로 녹음을 시작하고 iPhone으로 자동 전송할 수 있어요. 자세한 내용은 [Apple Watch 녹음](/ko/guide/recording/watch)을 참고하세요. ## 플랫폼별 기능 한눈에 보기 | 기능 | 웹 | 데스크탑 | 모바일 | | ---------- | ------ | ------ | -------------- | | 실시간 대화기록 | ✓ | ✓ | ✓ | | 시스템 오디오 녹음 | 지원 안 함 | ✓ | 지원 안 함 (OS 정책) | | 오프라인 녹음 | 지원 안 함 | ✓ | ✓ (기본 모드) | | 음성파일 업로드 | ✓ | ✓ | ✓ | | 컨퍼런스 모드 | ✓ | ✓ | 청중 참여만 | | 통화 녹음 변환 | 지원 안 함 | 지원 안 함 | Android만 | *** **관련 페이지**: [빠른 시작](/ko/guide/start/quickstart) · [여러 장치에서 사용](/ko/guide/account/multi-device) · [앱 업데이트](/ko/guide/troubleshooting/desktop-update) # 티로 서비스 소개 Source: https://docs.tiro.ooo/ko/guide/start/overview 티로는 회의·강의·통화를 자동으로 받아 적고 요약하는 AI 노트테이커예요. 기록이 쌓이면 조직의 지식이 되고, AI 에이전트가 그 지식으로 일해요. ## 티로가 하는 일 티로는 대화를 실시간으로 텍스트로 바꾸고, 끝나는 순간 정리된 노트를 만들어요. 회의 중 메모하느라 대화에 집중하지 못하거나, 회의가 끝난 뒤 내용을 따로 정리할 필요가 없어져요. 다른 AI 노트테이커와 비교되는 티로의 강점은 셋이에요: **말하는 즉시 화면에 뜨는 실시간 변환**, **한국어·일본어를 포함한 다국어 인식과 실시간 번역**, **녹음 원본을 서버에 보관하지 않고 기기에 두는 프라이버시 설계**. 비영어권 회의가 많은 팀일수록 차이가 커요. 티로는 세 단계로 대화를 자산으로 바꿔요. 1. **기록**: 회의·통화·강의를 녹음하면 자동으로 받아쓰기와 요약이 만들어져요. 2. **위키**: 기록에 흩어진 사람·주제·결정이 조직의 언어로 자동 정리돼요. 3. **에이전트**: Ask Tiro와 Claude 같은 AI가 그 지식을 바탕으로 우리 팀 맥락을 알고 일해요. ## 주요 특징 * **실시간 받아쓰기와 요약**: 말하는 동시에 화면에 기록되고, 놓친 내용을 그 자리에서 확인할 수 있어요. [실시간 대화기록](/ko/guide/recording/live) * **상황에 맞는 기록 방식**: 화면을 못 볼 땐 [오프라인 녹음](/ko/guide/recording/offline), 녹음 파일은 [업로드](/ko/guide/recording/upload), 행사장에선 [컨퍼런스 모드](/ko/guide/recording/conference)까지. * **다국어 지원**: 15개 언어를 인식하고, 대화 언어와 기록 언어를 다르게 설정하면 실시간 번역도 돼요. * **원하는 형식의 문서**: 기록이 끝나면 한 페이지 문서가 자동으로 만들어지고, [템플릿](/ko/guide/notes/templates)으로 회의록·인터뷰 형식을 정할 수 있어요. * **정확도를 높이는 도구들**: [화자 분리](/ko/guide/recording/diarization), [맥락](/ko/guide/recording/context), [단어장](/ko/guide/recording/wordbook)으로 우리 팀 고유명사까지 정확하게. * **팀과 함께**: [워크스페이스](/ko/guide/workspace/overview)에 구성원을 초대하고, [팀 폴더](/ko/guide/sharing/folders)로 노트를 자동 공유하고, [Slack 자동 공유](/ko/guide/automation/sharing)로 워크플로우에 연결해요. * **AI 활용**: [Ask Tiro](/ko/guide/notes/ask-tiro)에게 노트에 대해 묻고, [위키](/ko/guide/notes/wiki)로 지식을 쌓고, [API·MCP·CLI](/ko/guide/notes/api-mcp-cli)로 외부 AI 에이전트와 연결해요. ## 어디서 쓸 수 있나요? 웹, 데스크탑 앱(Windows·Mac), 모바일 앱(iOS·Android), Apple Watch에서 같은 계정으로 사용할 수 있어요. 플랫폼별 특징은 [앱 안내](/ko/guide/start/download)를 참고하세요. ## 바로 시작하기 가입하면 결제 수단 등록 없이 3주간 300분의 [무료 체험](/ko/guide/workspace/free-trial)이 시작돼요. [빠른 시작](/ko/guide/start/quickstart)에서 5분 만에 첫 노트를 만들어 보세요. *** **관련 페이지**: [빠른 시작](/ko/guide/start/quickstart) · [앱 안내](/ko/guide/start/download) · [티로를 AI와 연결하기](/ko/guide/start/ai-connect) # 빠른 시작 Source: https://docs.tiro.ooo/ko/guide/start/quickstart 가입부터 첫 노트까지 5분이면 충분해요. 기록을 시작하고, 자동으로 정리된 노트를 받아보고, 다음에 해볼 것까지 안내해요. ## 5분 만에 첫 노트 만들기 [tiro.ooo](https://tiro.ooo)에서 Google, Microsoft 계정으로 바로 시작할 수 있어요. 가입하면 3주간 사용할 수 있는 300분의 [무료 체험](/ko/guide/workspace/free-trial)이 자동으로 시작돼요. 결제 수단 등록은 필요 없어요. 노트 목록 화면의 **\[실시간 기록 시작]** 버튼을 누르면 새 노트가 만들어지면서 바로 기록할 수 있어요. 시작 전에 **\[맥락 입력]** 칸에 대화 주제와 고유명사를 적어두면 받아쓰기 정확도가 크게 올라가요. 자세한 내용은 [실시간 대화기록](/ko/guide/recording/live)을 참고하세요. 티로가 실시간으로 받아 적고 문단별로 요약해요. 잘못 인식된 부분은 **\[스크립트 보기]** 버튼으로 원문을 열어 바로 고칠 수 있고, 대화 중 나온 고유명사는 **\[맥락]** 버튼으로 그때그때 추가하면 돼요. 한 페이지 문서(주제별 구조화 요약), 대화 기록(시간순 요약), 스크립트(전체 원문)가 자동으로 만들어져요. 회의록·인터뷰 형식이 필요하면 **\[맞춤 문서 생성]** 버튼으로 [템플릿](/ko/guide/notes/templates)을 적용하세요. 자세한 내용은 [기본 노트](/ko/guide/notes/document)를 참고하세요. ## 상황에 맞는 기록 방식 고르기 * **회의 내용을 화면으로 보면서**: [실시간 대화기록](/ko/guide/recording/live) * **이동 중이거나 네트워크가 불안정할 때**: [오프라인 녹음](/ko/guide/recording/offline) * **이미 녹음된 파일이 있을 때**: [음성파일 업로드](/ko/guide/recording/upload) * **화상회의 상대방 목소리까지** (데스크탑): [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio) * **발표장 자막·청중 공유**: [컨퍼런스 모드](/ko/guide/recording/conference) ## 다음에 해보면 좋은 것 * [단어장](/ko/guide/recording/wordbook)에 회사·제품·동료 이름을 등록해 인식 정확도 높이기 * [캘린더 연동](/ko/guide/automation/calendar)으로 일정에서 클릭 한 번에 노트 만들기 * [공유](/ko/guide/sharing/overview)로 노트를 팀원에게 보내거나 [Slack에 자동 공유](/ko/guide/automation/sharing)하기 * [Ask Tiro](/ko/guide/notes/ask-tiro)에게 노트에 대해 무엇이든 물어보기 * 노트가 쌓이면 [위키](/ko/guide/notes/wiki)로 조직의 지식 지도 만들기 직접 안내받고 싶다면 [온보딩 미팅 예약](https://calendly.com/yuna-theplato/onboarding)으로 일정을 잡아주세요. 담당자가 화상으로 활용법을 안내해드려요. *** **관련 페이지**: [티로 서비스 소개](/ko/guide/start/overview) · [앱 안내](/ko/guide/start/download) · [실시간 대화기록](/ko/guide/recording/live) # 결제가 안 되거나 반영되지 않아요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/billing-not-applied 결제했는데 플랜이 안 보이거나, 데스크탑은 되는데 모바일만 안 되거나, 인앱결제가 엉뚱한 계정에 붙었을 때, 워크스페이스·계정 확인과 구독 복원으로 해결하는 방법을 안내해요. ## 먼저 시도해보세요 결제 처리에는 최대 10분 정도 걸릴 수 있어요. 잠시 기다린 뒤 아래를 차례로 시도해 주세요. 1. **새로고침**: 웹은 `Ctrl+R`(Mac은 `Cmd+R`), 모바일·데스크탑 앱은 완전히 종료한 뒤 다시 실행하세요. 모바일 앱은 다시 실행할 때 스토어 구독을 자동으로 다시 불러와서, 이 단계에서 해결되는 경우가 많아요. 2. **로그아웃 후 재로그인**: 설정에서 로그아웃했다가, 결제할 때 쓰던 티로 계정으로 다시 로그인하세요. 3. **결제 내역 확인**: 웹·데스크탑 카드결제는 **\[설정]** → **\[플랜 관리]** 메뉴와 결제 영수증 이메일에서, 인앱결제는 각 스토어의 구독 화면에서 결제 완료 여부를 확인하세요. 자세한 경로는 [구독 관리](/ko/guide/workspace/billing-guide)를 참고하세요. ## 데스크탑에선 되는데 모바일에서만 무료로 보여요 구독과 사용량은 **워크스페이스마다 따로** 관리돼요. 한 티로 계정이 여러 워크스페이스에 속할 수 있고, 각 워크스페이스는 저마다 독립된 플랜과 사용량을 가져요. 그래서 데스크탑에선 플랜이 있는 워크스페이스를 보고 있고, 모바일에선 플랜이 없는 다른 워크스페이스가 열려 있으면, 같은 계정인데도 모바일에서만 무료로(또는 남은 사용량이 없다고) 보일 수 있어요. 모바일 앱은 마지막에 열어둔 워크스페이스를 기억해요. 앱 오류가 아니라, 데스크탑과 모바일이 서로 다른 워크스페이스를 보고 있어서 생기는 차이예요. 플랜이 있는 워크스페이스로 전환하면 바로 표시돼요. ### 모바일에서 워크스페이스 전환하는 법 티로 앱을 열면 노트 목록 화면 맨 위에 지금 열려 있는 워크스페이스 이름과 그 옆에 위아래 화살표 아이콘이 보여요. 데스크탑에서 쓰던 워크스페이스와 이름이 다르면 다른 워크스페이스가 열려 있는 거예요. 워크스페이스 이름이 적힌 칸을 누르면 내가 속한 다른 워크스페이스 목록이 펼쳐져요. 데스크탑에서 플랜을 쓰던 워크스페이스를 선택하면 그 워크스페이스의 플랜과 남은 사용량이 바로 표시돼요. 워크스페이스는 노트·폴더·멤버·결제가 각각 분리된 공간이에요. 어느 워크스페이스에 있느냐에 따라 보이는 노트와 플랜이 달라져요. 워크스페이스가 무엇인지 자세히 알고 싶으면 [워크스페이스 개요](/ko/guide/workspace/overview)를 참고하세요. ## 인앱결제 구독은 어느 계정에 연결되나요? 모바일 인앱결제 구독은 티로 계정이 아니라, **결제하던 순간 그 기기에 로그인돼 있던 스토어 계정**(Apple ID 또는 Google 계정)에 연결돼요. 어느 티로 계정에 플랜을 반영할지도 결제 시점의 스토어 계정을 기준으로 정해져요. 이건 App Store와 Google Play 공통의 결제 구조예요. 스토어가 "이 스토어 계정에 활성 구독이 있다"고 알려줘야 티로가 플랜을 반영할 수 있고, 티로는 결제가 일어나는 시점에 어느 계정에 붙일지 개입하거나 바꿀 수 없어요. 그래서 다음과 같은 경우 구독이 의도치 않은 계정에 붙을 수 있어요. * 기기에 평소와 다른 Apple ID·Google 계정이 로그인돼 있으면, 구독이 그 스토어 계정에 붙어요. * 가족 공유 기기, 회사·학교 계정이 섞여 있는 기기에서 특히 자주 생겨요. * 한 기기에서 여러 티로 계정을 오가며 인앱결제를 하면, 결제가 실패하거나 이전 티로 계정에 붙기도 해요. 인앱결제 구독은 스토어 계정에 묶여 있어서, 티로 고객센터에서는 결제에 쓰인 Apple ID·Google 계정 이메일을 조회하거나 구독을 임의로 다른 계정으로 옮겨 드릴 수 없어요. 어느 계정에 붙었는지는 아래 방법으로 직접 확인하는 게 가장 빨라요. ## 스토어엔 구독이 있는데 앱에서 무료로 보여요 대부분 **구독 복원**으로 해결돼요. 구독 복원은 스토어에 있는 활성 구독을 앱이 다시 불러와 현재 티로 계정에 반영하는 기능이에요. 앱을 재설치했거나, 로그아웃 후 다시 로그인했거나, 기기를 바꾼 뒤에 플랜이 안 보일 때 쓰면 돼요. ### 이럴 때 구독 복원으로 해결돼요 * 앱을 삭제했다가 다시 설치한 뒤 무료로 보일 때 * 로그아웃 후 다시 로그인했더니 플랜이 사라졌을 때 * 새 기기나 다른 기기에서 같은 티로 계정으로 로그인했을 때 * 스토어 구독 화면에는 **Tiro**가 활성으로 보이는데 앱만 무료로 보일 때 공통 조건은 **결제할 때 쓴 스토어 계정과 티로 계정이, 지금 쓰는 계정과 같다**는 거예요. ### 이럴 땐 구독 복원으로 안 돼요 * 구독이 **다른 스토어 계정**(Apple ID·Google 계정)에 붙어 있을 때예요. 그 계정으로 스토어를 전환한 뒤 복원해야 해요. * 구독이 **다른 티로 계정**에 반영돼 있을 때예요. 아래 "결제가 다른 계정에 적용된 것 같아요"를 참고하세요. * 스토어 구독 화면에도 **Tiro**가 안 보일 때예요. 아직 결제가 완료되지 않았거나, 다른 스토어 계정으로 결제된 거예요. ### 모바일에서 구독 복원하는 법 iPhone은 **\[설정]** → 맨 위 사용자 이름 → **\[미디어 및 구입 항목]** 화면에서 Apple ID를, 안드로이드는 **\[Google Play]** 앱 우측 상단 프로필에서 Google 계정을 확인하세요. 결제할 때 쓴 계정과 다르면 그 계정으로 전환하세요. 티로 앱에 결제 당시 쓰던 티로 계정으로 로그인돼 있는지 확인하세요. 다른 이메일로 로그인돼 있으면 로그아웃 후 결제에 쓴 계정으로 다시 로그인하세요. 앱을 다시 실행하면 스토어 구독을 자동으로 다시 불러와요. 대부분 이 단계에서 플랜이 돌아와요. 티로 앱 **\[설정]** → **\[플랜]** 섹션 → **\[결제 관리]** 버튼을 누르면 스토어 구독 관리 화면이 열려요. 화면 안내에 따라 구매를 복원하세요. **\[결제 관리]** 버튼은 결제한 스토어와 지금 쓰는 기기가 같을 때 보여요. 예를 들어 안드로이드(Google Play)로 결제했는데 iPhone에서 열면 "Google Play에서 관리할 수 있어요"라는 안내가 떠요. 결제한 스토어와 같은 기기에서 진행하세요. 팀 플랜 구독은 모바일에서 관리·복원할 수 없고, 웹이나 데스크탑 앱에서 다뤄요. ## 결제가 다른 계정에 적용된 것 같아요 결제는 됐는데 지금 로그인한 티로 계정엔 안 보인다면, 플랜이 **다른 티로 계정**에 반영됐을 수 있어요. 평소 여러 티로 계정(예: 회사 이메일과 개인 이메일)을 쓰던 기기에서 결제하면, 결제 시점에 로그인돼 있던 티로 계정에 플랜이 붙어요. 먼저 다른 이메일의 티로 계정으로 로그인해서 플랜이 거기 적용돼 있는지 확인해 보세요. 그 계정을 그대로 쓰시면 가장 간단해요. 꼭 원래 계정으로 옮겨야 한다면 고객문의로 연락 주시면 함께 확인하고 정리를 도와드려요. ## \[Android] 인앱결제 오류가 발생해요 "The device or user is not allowed to make the purchase" 같은 오류는 대부분 Google 계정이나 결제 권한 문제예요. 어떤 케이스인지 먼저 확인해 보세요. ### 케이스 1: 학교·회사 Google 계정으로 결제가 시도되고 있어요 학교·회사에서 발급한 계정(이름@학교.ac.kr 등)은 기관 정책으로 인앱결제가 차단된 경우가 많아요. 인앱결제는 "앱에 로그인한 티로 이메일"이 아니라 "**Play 스토어에 연결된 Google 계정**"으로 처리되니, Play 스토어 프로필에서 현재 계정을 확인하고 개인 Gmail 계정으로 전환한 뒤 다시 시도하세요. 계정이 여러 개라 전환이 안 되면 티로 앱을 삭제하고, 휴대폰 설정에서 학교·회사 계정을 로그아웃한 뒤(완전 삭제는 불필요), 개인 계정만 남은 상태로 재설치해서 결제해 보세요. 티로 계정과 결제 계정은 별개라서 재설치 후 같은 티로 계정으로 로그인하면 노트는 그대로예요. ### 케이스 2: 그 Google 계정 자체가 결제 불가 상태예요 웹 브라우저에서 payments.google.com 에 해당 계정으로 접속해 보세요. 결제수단 관리 화면이 안 열리고 오류가 나면 그 계정으로는 결제할 수 없어요. 개인 Gmail 계정으로 결제하거나, 기관 IT팀에 결제 권한을 문의하세요. 상단에 보안 경고가 있다면 안내에 따라 인증 정보를 제출한 뒤 다시 시도하세요. ### 케이스 3: 다른 앱에서도 결제가 안 돼요 Play 스토어 자체 문제예요. 결제 수단이 유효한지(**Play 스토어 → 프로필 → 결제 및 정기 결제**), 보호자 관리(자녀 보호)의 인앱구매 제한이 켜져 있지 않은지, 계정 국가 설정이 맞는지, Google Play 스토어·서비스가 최신인지 확인하고 기기를 재시작해 보세요. 계속되면 [Google Play 고객센터](https://support.google.com/googleplay/answer/4646404)에 문의하세요. ## \[iPhone] "구입을 완료할 수 없음" 오류가 떠요 이 팝업은 티로가 아니라 **App Store(Apple)에서 결제 승인이 진행되지 못했을 때** 표시되는 iOS 시스템 알림이에요. 아래 순서로 확인해 보세요. **\[설정]** → 맨 위 사용자 이름(Apple ID) → **\[미디어 및 구입 항목]** → **\[구입 내역]** 화면에서 티로(Tiro) 결제가 이미 있는지 확인하세요. 이전에 결제한 구독이 있으면(다른 티로 계정에 반영된 경우 포함) 새 구독 결제가 막히면서 이 오류가 뜰 수 있어요. 결제 내역이 있다면 다시 결제하지 말고, 위의 "스토어엔 구독이 있는데 앱에서 무료로 보여요"와 "결제가 다른 계정에 적용된 것 같아요"를 따라 주세요. 기존 결제가 없다면 **\[설정]** → Apple ID → **\[결제 및 배송]** 메뉴에서 카드 만료·잔액 부족 등 결제 수단 문제가 없는지, 미납된 결제 대금이 없는지 확인하세요. 같은 오류가 반복되면 웹(tiro.ooo)에서 카드로 결제하는 방법도 있어요. 구입 내역에 이미 결제가 있는 상태라면 중복 결제가 되지 않도록, 먼저 고객문의로 연락해 주세요. 이 오류가 떴다고 해서 이전 결제까지 없던 일이 되는 건 아니에요. 결제 여부는 App Store 구입 내역이 기준이에요. 인앱결제 환불이 필요하면 [결제 FAQ의 환불 정책](/ko/guide/workspace/billing-faq)을 참고하세요. ## 결제일이 갱신일보다 하루 일찍 잡혀요 인앱결제(Google Play·App Store)는 구독 갱신 직전(최대 48시간 전)에 결제수단 승인을 미리 잡아둬요. 그래서 카드 알림의 결제 시점과 앱의 사용량 갱신 시점이 하루 정도 달라 보일 수 있어요. 정상 동작이고, 요금을 더 내거나 이용이 막히는 것이 아니에요. 결제 시점은 스토어가 관리해서 티로가 조정할 수 없어요. 웹·데스크탑 카드결제(Stripe)는 결제와 갱신 시점이 같아 이 현상이 없어요. ## 그래도 해결되지 않으면 고객문의로 연락해 주세요. 아래 정보를 함께 보내주시면 빠르게 확인할 수 있어요. * 결제 시간 (예: 2026-06-12 오후 3시) * 결제 방법 (웹 카드결제 / Android 인앱 / iOS 인앱) * 인앱결제라면 결제에 쓴 스토어 계정 (Apple ID·Google 계정 이메일) * 구매한 플랜 (라이트 / 프로 / 맥스 / 팀) * 현재 플랜 상태 스크린샷 *** **관련 페이지**: [구독 관리](/ko/guide/workspace/billing-guide) · [결제 FAQ](/ko/guide/workspace/billing-faq) # 노트를 실수로 삭제했어요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/deleted-note 삭제한 노트는 휴지통(삭제된 노트)에 30일 동안 보관돼서 언제든 복구할 수 있어요. 휴지통 복구부터, 보관 기간이 지났을 때의 방법까지 안내해요. 휴지통 화면은 웹과 데스크탑 앱에서 제공돼요. 모바일 앱에서 삭제한 노트도 휴지통에 보관되니, 웹이나 데스크탑 앱에서 복구할 수 있어요. ## 휴지통에서 복구하기 노트를 삭제하면 바로 지워지지 않고 사이드바의 **\[삭제된 노트]** 폴더로 이동해요. 삭제한 노트는 기본 30일 동안 보관되고, 그동안 언제든 복구할 수 있어요. 사이드바의 **\[공유받은 노트]** 바로 아래에 있는 **\[삭제된 노트]** 폴더를 열어 주세요. 이 폴더는 휴지통에 노트가 있을 때만 표시돼요. 지금 어떤 워크스페이스를 보고 있든, 모든 워크스페이스에서 삭제한 노트가 이 한 곳에 모여요. 목록에서 되살릴 노트를 찾아 **\[복구]** 버튼을 눌러 주세요. 노트가 원래 상태로 돌아와요. 각 노트에는 소속돼 있던 워크스페이스 이름과 삭제일, "며칠 후 영구 삭제"가 함께 표시되니, 남은 기간을 여기서 확인할 수 있어요. **\[영구 삭제]** 버튼과 휴지통 전체 비우기는 되돌릴 수 없어요. 보관 기간이 지나 자동으로 영구 삭제된 노트도 복구할 수 없어요. 복구와 영구 삭제는 노트를 만든 본인만 할 수 있어요. 공유받은 노트는 목록에 보이지 않아요. 엔터프라이즈 워크스페이스는 보관 기간이 30일과 다르게 설정되어 있을 수 있으니, 목록에 표시되는 영구 삭제 예정일을 기준으로 확인하세요. ## 보관 기간이 지났다면 음성 파일로 다시 만들기 휴지통에서 사라진 노트라도, 녹음 당시의 음성 파일이 내 컴퓨터에 남아 있다면 그 파일을 업로드해서 대화 기록을 다시 만들 수 있어요. 다음 두 경우에는 음성 파일이 데스크탑 앱(Windows·Mac)에 자동으로 저장돼 있어요. * **오프라인 모드로 녹음한 노트**: 녹음할 때 음성 파일이 항상 컴퓨터에 저장돼요. * **실시간 기록으로 녹음한 노트**: 녹음 전에 **\[설정]** → **\[기본 설정]** 메뉴의 **\[음성 파일 로컬 저장]** 토글이 켜져 있었다면 저장돼요. 파일 탐색기(Windows) 또는 Finder(Mac)에서 **내 문서 폴더의 `Tiro/recordings`** 폴더를 열어 주세요. 파일은 WAV 형식으로 저장되니, 만든 날짜를 기준으로 삭제한 노트를 녹음했던 시간대의 파일을 찾아 주세요. 노트 목록 상단의 **\[기록]** 버튼 옆 화살표를 눌러 **\[파일 업로드]** 메뉴를 선택하고, 찾은 WAV 파일을 업로드하세요. 업로드가 끝나면 대화 기록과 문서가 새 노트로 만들어져요. 로컬 저장 파일은 최근에 기록된 파일부터 일정 개수까지만 보관되고, 오래된 파일은 자동으로 정리돼요. 파일을 찾았다면 복구 전에 다른 폴더로 복사해 두는 것을 추천해요. 업로드로 만든 노트는 새 노트라서, 원래 노트에 직접 입력했던 메모나 수정 내용은 포함되지 않아요. 녹음된 대화 내용이 다시 기록돼요. ## 음성 파일도 없다면 아래 경우에는 음성 파일이 컴퓨터에 남아 있지 않아요. * 실시간 기록 녹음 당시 **\[음성 파일 로컬 저장]** 토글이 꺼져 있던 경우 * 웹 브라우저에서 녹음한 경우 * 오래된 파일이라 자동 정리로 삭제된 경우 이 경우에도 방법이 있을 수 있으니, 티로 앱이나 웹사이트의 **고객문의** 버튼으로 연락해 주세요. 삭제한 노트의 제목, 녹음 시각, 삭제한 시각, 사용 환경(웹/Windows/Mac/Android/iOS)을 함께 알려주시면 확인해 드려요. ## 자주 묻는 질문 ### 삭제한 노트는 얼마나 보관되나요? 기본 30일이에요. 보관 기간이 지나면 자동으로 영구 삭제되고, 그 뒤에는 복구할 수 없어요. 남은 기간은 **\[삭제된 노트]** 목록의 각 노트에 표시돼요. ### 모바일 앱에서 삭제한 노트도 복구할 수 있나요? 복구할 수 있어요. 모바일 앱에서 삭제한 노트도 휴지통에 보관되는데, 휴지통 화면은 아직 웹과 데스크탑 앱에만 있어요. 웹이나 데스크탑 앱에 로그인해서 **\[삭제된 노트]** 폴더에서 복구해 주세요. ### 휴지통에 있는 노트는 다른 사람에게 보이나요? 보이지 않아요. 휴지통에 있는 동안에는 노트 열람과 공유 링크 접근이 모두 막히고, 검색 결과에도 나오지 않아요. 복구하면 다시 원래대로 보여요. ### 앞으로를 위해 무엇을 켜두면 좋나요? 데스크탑 앱에서 **\[음성 파일 로컬 저장]** 토글을 켜두면, 실시간 기록의 원본 음성이 항상 내 컴퓨터에 남아요. 자세한 내용은 [음성파일 로컬 저장](/ko/guide/notes/local-audio)을 참고하세요. *** **관련 페이지**: [음성파일 로컬 저장](/ko/guide/notes/local-audio) · [음성파일 관리](/ko/guide/notes/audio-manage) · [자주 묻는 질문](/ko/guide/troubleshooting/overview) # 데스크탑 앱 업데이트하기 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/desktop-update 데스크탑 앱은 자동으로 업데이트돼요. 버전 확인 방법과 업데이트가 안 될 때 해결하는 방법을 안내해요. ## 앱은 자동으로 업데이트돼요 데스크탑 앱은 백그라운드에서 새 버전을 주기적으로 확인하고 자동으로 받아둬요. * 작은 업데이트는 조용히 적용되고, 큰 업데이트는 안내 토스트가 떠요. * 안내에서 **\[나중에]** 버튼을 선택해도 다음에 앱을 완전히 종료하면 적용돼요. * 바로 적용하려면 안내의 업데이트 버튼을 누르세요. 잠시 후 앱이 재시작되며 적용돼요. ## 지금 바로 업데이트 확인하기 앱 메뉴의 **\[Check for Updates...]** 항목을 누르면 최신 버전을 직접 확인하고 받을 수 있어요. v4.5.0부터 들어간 기능이에요. * **Mac**: 화면 맨 위 메뉴 막대의 **\[Tiro]** 메뉴 → **\[About Tiro]** 바로 아래 **\[Check for Updates...]** * **Windows**: 창 왼쪽 위 메뉴 아이콘(☰) → **\[파일]** → **\[업데이트 확인...]** 누르면 서버의 최신 버전을 바로 확인해요. 최신이면 "최신 버전을 사용 중이에요"가 뜨고 현재 버전도 같이 보여줘요. 새 버전이 있으면 백그라운드에서 받기 시작하고, 다 받으면 같은 자리의 메뉴가 **\[Restart to Apply Update]**(Windows는 **\[재시작하여 업데이트 적용]**)로 바뀌어요. 이 항목을 누르면 앱이 재시작되며 새 버전으로 전환돼요. ## 업데이트가 안 될 때 받아둔 업데이트는 앱이 완전히 종료될 때 적용돼요. **Mac과 Windows 모두 창을 닫는 X 버튼이 종료가 아니에요.** 앱이 트레이에 남아 있으니, Mac은 `Cmd+Q` 또는 메뉴 막대의 Tiro → 종료로 완전히 종료하세요. Windows는 작업 표시줄 우측 트레이의 Tiro 아이콘을 우클릭해 **\[Quit Tiro Completely]** 메뉴를 선택하면 완전히 종료돼요. 종료한 뒤 다시 실행하세요. 앱 메뉴에서 업데이트를 직접 확인하세요. **Mac**은 메뉴 막대의 **\[Tiro]** 메뉴 → **\[Check for Updates...]**, **Windows**는 메뉴 아이콘(☰) → **\[파일]** → **\[업데이트 확인...]** 항목을 누르면 돼요. 새 버전이 있으면 받은 뒤 **\[Restart to Apply Update]**(Windows는 **\[재시작하여 업데이트 적용]**)로 적용돼요. 드물게 앱 내 업데이트로 최신 버전이 받아지지 않는 경우가 있어요. 이때는 기존 앱을 삭제하고 [다운로드 페이지](https://tiro.ooo/download/app)에서 최신 버전을 새로 설치하는 것이 가장 확실해요. 노트는 모두 서버에 저장되어 있어서 재설치해도 사라지지 않아요. Windows에서 설치 파일 실행 시 SmartScreen 경고가 뜨면 **\[추가 정보]** → **\[실행]** 버튼을 누르면 돼요. Mac 설치 파일은 Intel·Apple Silicon 공용(universal)이라 기종 구분 없이 받으면 돼요. ## 자주 묻는 질문 ### 업데이트하면 노트가 사라지나요? 아니요, 노트는 서버에 저장되어 있어서 업데이트나 재설치 후 로그인하면 그대로 보여요. 단, [음성파일 로컬 저장](/ko/guide/notes/local-audio)으로 기기에 저장한 음성 파일은 앱 삭제 시 함께 지워질 수 있으니 필요하면 미리 백업하세요. ### 로그인이 갑자기 안 되는데 앱 버전 때문일 수 있나요? 네, 구버전에서 로그인 문제가 생기는 경우가 있어요. 위 순서대로 업데이트하고, 그래도 안 되면 삭제 후 새로 설치해 주세요. ### 자동 업데이트를 끌 수 있나요? 자동 업데이트는 보안과 안정성을 위해 항상 켜져 있어요. 적용 시점은 앱을 종료할 때라서 작업 중에 갑자기 재시작되지는 않아요. *** **관련 페이지**: [앱 안내](/ko/guide/start/download) · [실시간 기록이 안 될 때](/ko/guide/troubleshooting/recording) # 받아야 할 메일이 안 와요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/email 티로 메일이 스팸함이나 프로모션 탭으로 분류되는 경우가 많아요. 메일 종류별로 확인하는 방법을 안내해요. 티로에서는 가입 인증 코드, 팀 초대, 노트 공유, 트라이얼 안내 등 다양한 메일을 자동으로 발송합니다. 메일이 도착하지 않을 때 직접 확인할 수 있는 방법을 안내드립니다. ## 먼저 확인할 곳 티로 메일이 받은편지함이 아닌 다른 위치로 분류되는 경우가 많습니다. 아래 다섯 곳을 순서대로 확인해보세요. * **스팸 / 정크 메일함** * **Gmail '프로모션' 또는 '업데이트' 탭** * 메일함 검색창에 **'Tiro'** 또는 [noreply@send.tiro.ooo](mailto:noreply@send.tiro.ooo) 로 검색 * 가입에 사용한 이메일 주소가 정확한지 한 번 더 확인 * 회사 메일을 사용 중이시면 IT 담당자께 send.tiro.ooo 도메인 허용을 요청 ## 메일 종류별 안내 ### 팀 초대 메일 팀에 초대받았는데 메일이 안 보인다면, 가입에 사용한 이메일과 초대받은 이메일이 다른 워크스페이스로 전달되었을 수 있습니다. 발신자 [noreply@send.tiro.ooo](mailto:noreply@send.tiro.ooo) 로 메일함 전체를 검색해보시고, 그래도 없으면 초대한 분께 재발송을 요청해주세요. ### 노트 / 폴더 초대 알림 공유 알림 메일을 받지 못해도, 티로에 로그인하시면 사이드바에서 공유받은 노트와 스레드를 바로 확인할 수 있어요. ### 결제 영수증 결제 영수증은 결제 서비스 Stripe에서 직접 발송합니다. 받지 못하셨다면 발신자 [receipts@stripe.com](mailto:receipts@stripe.com) 로 메일함을 검색해보세요. 그래도 안 보이면 [hello@theplato.io](mailto:hello@theplato.io) 로 문의주시면 확인하여 안내드리겠습니다. 결제 영수증은 티로 계정 메일 주소가 아닌, stripe에 직접 입력하신 메일 주소로 전송될 수 있어요. ## 그래도 메일이 안 보이면 위 안내를 따라도 메일을 찾지 못하셨다면 [hello@theplato.io](mailto:hello@theplato.io) 로 회신 부탁드립니다. 어떤 메일을 언제 발송된 건지 알려주시면 발송 기록을 확인하여 빠르게 안내드리겠습니다. # 로그인이 안 되거나 인증에 막혀요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/login Google 로그인 중 계정 복구·인증 화면에 막히거나, 회사 Microsoft 계정으로 로그인이 안 될 때 해결하는 방법을 로그인 방식별로 안내해요. 로그인이 막힐 때는 사용하시는 로그인 방식에 따라 해결 방법이 달라요. 아래에서 해당하는 방식을 찾아 진행해 주세요. ## Google 로그인 중 계정 복구·인증 화면에 막혀요 모바일 앱에서 **Google로 계속하기**를 눌렀을 때 아래 화면에 막혀 앱에 들어가지 못하는 경우예요. * **계정 복구** 안내가 뜨면서 복구 코드를 입력하라고 해요. * 문자로 `G-`로 시작하는 인증 코드(본인인증 코드)를 보냈다는데 아무것도 오지 않아요. * 예전에는 되던 기기인데 어느 날부터 위 화면이 반복돼요. ### 왜 이런 화면이 뜨나요? 이 화면은 티로가 아니라 **Google의 보안 화면**이에요. Google이 로그인을 평소와 다른 접근으로 판단하면, 본인 확인을 위해 계정 복구 코드나 문자 인증(G-코드)을 요구해요. 코드가 오지 않는 가장 흔한 원인은 **Google 계정에 등록된 복구 전화번호나 이메일이 지금 쓰는 것과 다르기** 때문이에요. 이 코드는 티로가 보내는 것이 아니라서, 티로에서 다시 보내거나 건너뛸 수는 없어요. 대신 아래 방법으로 직접 풀 수 있어요. ### 1. Google 계정 복구 정보를 최신으로 맞추기 휴대폰이 아닌 **PC나 다른 기기의 브라우저**에서 진행하면 더 편해요. 1. [Google 계정 보안 페이지](https://myaccount.google.com/security)에 접속해 해당 Google 계정으로 로그인합니다. 2. **복구 전화번호**와 **복구 이메일**이 지금 사용하는 것과 같은지 확인하고, 다르면 현재 정보로 업데이트합니다. 3. **2단계 인증**을 켜 두셨다면, 지금 받을 수 있는 방법(현재 휴대폰 번호, 인증 앱 등)으로 설정돼 있는지 확인합니다. 4. Google 계정이 정상적으로 열리는 것을 확인한 뒤, 티로 앱에서 다시 **Google로 계속하기**를 눌러 로그인합니다. ### 2. 급할 때는 웹에서 먼저 접속하기 당장 티로를 써야 한다면, 휴대폰이나 PC의 **브라우저에서 [tiro.ooo](https://tiro.ooo)** 에 접속해 같은 Google 계정으로 로그인해 보세요. 웹 로그인은 앱과 로그인 방식이 조금 달라서, 앱에서 막히던 경우에도 접속되는 경우가 있어요. 카카오톡·인스타그램 같은 앱의 인앱 브라우저에서는 Google 로그인이 막힐 수 있어요. 링크를 **기본 브라우저(Chrome·Safari 등)로 열기**로 접속해 주세요. ### 그래도 안 될 때 Google 계정 자체에 접근이 어려워 위 방법으로 해결되지 않으면, 기존 티로 계정에 **다른 로그인 수단(이메일 등)을 연결**해 드릴 수 있어요. 그동안 만드신 노트, 폴더, 구독은 그대로 유지돼요. 티로 앱이나 웹사이트의 **고객문의**로 사용 중인 이메일 주소를 알려주세요. 연결 방법은 [계정 FAQ의 계정 통합 안내](/ko/guide/account/faq)도 참고하실 수 있어요. ## 회사·학교 Microsoft 계정으로 로그인이 안 돼요 Microsoft 365 / Entra 환경에서는 외부 앱이 조직 계정에 접근하려면 **관리자의 사전 승인**(Admin Consent)이 필요해요. 승인 전에는 조직 내 사용자가 Tiro에 로그인할 수 없어요. 아래 내용을 보안팀 또는 IT 관리자에게 전달해 주세요. Microsoft Entra 관리자 계정이 필요해요. 일반 사용자 계정으로는 진행할 수 없어요. ### 방법 1. Admin Consent 링크로 승인 (권장) 1. 다음 링크를 엽니다: [Admin Consent URL](https://login.microsoftonline.com/common/adminconsent?client_id=d9eb8e0b-ca82-45f7-b2b5-cb697ae94639\&redirect_uri=https://tiro.ooo) 2. Microsoft Entra 관리자 계정으로 로그인합니다. 3. 요청 권한 목록을 확인하고 **수락(Accept)** 버튼을 클릭합니다. | 권한 | 용도 | | ---------------------- | -------------- | | openid, profile, email | 계정 인증 및 기본 정보 | | User.Read | 사용자 프로필 읽기 | | offline\_access | 세션 유지 | | Calendars.Read | 캘린더 연동 (선택 기능) | ### 방법 2. Azure Portal에서 직접 승인 1. [Azure Portal](https://portal.azure.com/)에 관리자 계정으로 로그인합니다. 2. **Azure Active Directory → Enterprise applications**로 이동합니다. 3. 검색창에 Tiro 또는 Application ID `d9eb8e0b-ca82-45f7-b2b5-cb697ae94639`를 입력합니다. 4. 앱 선택 → **Permissions** → **Grant admin consent**를 클릭합니다. ### 승인 후 확인 **Entra → Enterprise applications → Tiro 앱 선택 → Users and groups**에서 조직 사용자들이 Tiro 앱을 사용할 수 있는 상태인지 확인하세요. ### 자주 발생하는 Microsoft 오류 | 오류 | 원인 | 해결 | | ------------------ | ----------------------------------------- | ------------------------------ | | AADSTS650052 | 앱이 해당 테넌트에 등록되지 않음 | 관리자 동의 진행 | | AADSTS700016 | Application ID를 찾을 수 없거나 Redirect URI 불일치 | Admin Consent URL을 그대로 복사해 사용 | | 로그인은 되지만 정보를 못 가져옴 | API 권한 승인 미완료 | 관리자 동의 재진행 또는 Permissions 탭 확인 | ### Tiro Enterprise App 정보 | 항목 | 값 | | -------------------------- | -------------------------------------- | | 앱 이름 | Tiro | | Application ID (Client ID) | `d9eb8e0b-ca82-45f7-b2b5-cb697ae94639` | | Redirect URI | [https://tiro.ooo](https://tiro.ooo) | 참고: [Microsoft Admin consent 설정 가이드](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/configure-admin-consent-workflow) *** **관련 페이지**: [계정 FAQ](/ko/guide/account/faq) · [자주 묻는 질문](/ko/guide/troubleshooting/overview) # 자주 묻는 질문 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/overview 녹음 파일 다운로드, 로그인 문제, 해외 사용 등 자주 들어오는 질문을 모았어요. 증상별 상세 가이드 링크도 함께 안내해요. ## 증상별 해결 가이드 바로가기 * 녹음이 안 되거나 일부만 기록돼요 → [실시간 기록이 안 될 때](/ko/guide/troubleshooting/recording) * 오프라인 녹음 업로드가 실패하거나 멈춰요 → [오프라인 녹음이 업로드 안 될 때](/ko/guide/troubleshooting/upload-failed) * 노트를 실수로 삭제했어요 → [삭제한 노트 복구](/ko/guide/troubleshooting/deleted-note) * 결제했는데 플랜이 적용되지 않아요 → [결제했는데 플랜 적용이 안 될 때](/ko/guide/troubleshooting/billing-not-applied) * 로그인이 안 돼요 (Google 계정 복구·인증 화면, 회사 Microsoft 계정) → [로그인이 안 될 때](/ko/guide/troubleshooting/login) * 데스크탑 앱이 업데이트되지 않아요 → [앱 업데이트가 안 될 때](/ko/guide/troubleshooting/desktop-update) * 받아야 할 메일이 안 와요 → [메일 안내](/ko/guide/troubleshooting/email) ## 녹음한 음성 파일을 다운로드할 수 있나요? 사용 환경에 따라 달라요. * **웹**: 녹음 파일 다운로드가 지원되지 않아요. * **데스크탑 앱(Windows·Mac)**: 가능해요. 단, 녹음하기 전에 **\[설정]** → **\[기본 설정]** 메뉴에서 **\[음성 파일 로컬 저장]** 토글을 켜야 하고, 켠 뒤에 새로 녹음한 노트만 다운로드할 수 있어요. 파일이 저장된 노트는 상단에 **\[음성파일 다운로드]** 버튼이 표시돼요. 자세한 내용은 [음성파일 로컬 저장](/ko/guide/notes/local-audio)을 참고하세요. * **모바일 앱**: 노트를 길게 눌러 **\[오디오 다운로드]** 메뉴를 쓰거나, 노트 화면의 **\[⋯]** → **\[오디오 공유]** 메뉴로 내보낼 수 있어요. 자세한 내용은 [음성파일 관리](/ko/guide/notes/audio-manage)를 참고하세요. 녹음 파일은 보안을 위해 서버가 아닌 기기에 저장돼요. 그래서 녹음한 기기가 아니면 다운로드할 수 없고, 앱을 삭제하면 녹음 파일도 함께 삭제될 수 있어요. ## 카카오톡으로 받은 링크에서 로그인이 안 돼요 카카오톡, 인스타그램 같은 앱의 인앱 브라우저에서는 Google·Microsoft 소셜 로그인이 정상적으로 동작하지 않을 수 있어요. 링크를 길게 누르거나 공유 메뉴에서 **기본 브라우저(Chrome, Safari 등)로 열기**를 선택해 접속해 주세요. ## 중국에서도 사용할 수 있나요? 네, 사용할 수 있어요. 다만 중국 네트워크 환경에서는 Google 로그인 등 일부 연결이 차단될 수 있어서 VPN 사용을 권장해요. Android는 푸시 알림(FCM)이 동작하지 않을 수 있어요. ## 접근성 지원 프로그램이 있나요? 네, 청각 등 접근성 지원이 필요한 분들을 위한 할인 프로그램을 운영하고 있어요. [신청 폼](https://forms.gle/gCz9YBHE5NsBsN2A8)으로 신청하시면 안내드려요. ## 여기에 없는 문제가 있어요 티로 앱이나 웹사이트의 **고객문의** 버튼으로 연락해 주세요. 문제가 발생한 시간대, 사용 환경(웹/Windows/Mac/Android/iOS), 해당 노트의 생성 시간을 함께 알려주시면 빠르게 도와드릴 수 있어요. *** **관련 페이지**: [실시간 기록이 안 될 때](/ko/guide/troubleshooting/recording) · [결제했는데 플랜 적용이 안 될 때](/ko/guide/troubleshooting/billing-not-applied) · [계정 FAQ](/ko/guide/account/faq) # 실시간 기록이 안 되거나 소리가 일부만 기록돼요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/recording 녹음이 안 되거나 일부만 기록될 때, 사용 환경(웹·데스크탑·모바일)별로 증상에 맞는 해결 방법을 안내해요. 녹음했는데 **노트가 비어 있거나 소리가 안 들어갔다면**, 대부분 마이크·시스템 사운드 권한이나 입력 설정 문제예요. 그리고 정확한 해결 방법은 **티로를 어디서 쓰는지(웹·데스크탑·모바일)에 따라 달라요.** 웹과 데스크탑 앱은 소리를 잡는 방식이 다르거든요. 아래에서 본인 환경을 먼저 고르면 증상에 맞는 해결 단계로 바로 안내해드려요. ## 화상회의·유튜브 소리를 녹음하고 싶다면 문제가 아니라 방법을 찾고 있다면 여기예요. Zoom·Google Meet·Teams 화상회의의 상대방 목소리와 유튜브·강의 영상 소리는 **데스크탑 앱(Windows·Mac)의 시스템 오디오 녹음**으로 기록해요. 웹 브라우저와 모바일 앱에서는 컴퓨터 소리를 녹음할 수 없어요. 자세한 방법은 [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio) 가이드를 참고하세요. ## 나의 사용환경 확인하기 티로는 웹 브라우저, 데스크탑 앱(Windows/Mac), 모바일 앱(iOS/Android)에서 사용하실 수 있어요. 특히 웹과 데스크탑 앱은 다른 프로그램이니 확인해주세요! * **웹**: 브라우저(Chrome, Safari 등)에서 tiro.ooo 접속하는 경우 * **데스크탑 앱**: PC에 설치한 전용 프로그램 ## 웹 브라우저에서 기록이 되지 않는 경우 ### 1) 녹음은 시작했는데 일부만 기록돼요 **증상**: 내 목소리는 기록되는데, 시스템 사운드/컴퓨터 소리(영상, 음악 등)가 녹음되지 않아요. **원인**: 웹 브라우저 자체의 보안 정책으로 시스템 사운드 녹음이 지원되지 않습니다. 이는 티로가 아닌 브라우저의 제한 사항이에요. **해결 방법**: * 데스크탑 앱을 설치하시면 시스템 사운드까지 모두 녹음하실 수 있어요 * Windows는 설치 후 별다른 권한 없이 바로 시스템 사운드가 녹음되고, Mac은 화면 및 시스템 오디오 녹음 권한을 한 번 허용하면 돼요 * [티로 데스크탑 앱 다운로드](https://tiro.ooo/download/app) 회사 보안 정책 등으로 데스크탑 앱을 설치할 수 없다면, 가상 오디오 케이블로 웹에서도 시스템 사운드를 녹음하는 고급 우회법이 있어요. [화상회의·영상 소리 녹음](/ko/guide/recording/system-audio) 가이드의 FAQ를 참고하세요. **시스템 사운드란?** 시스템 사운드는 컴퓨터에서 재생되는 모든 소리를 말해요. 마이크로 입력되는 내 목소리와 달리, 컴퓨터 스피커나 이어폰으로 나오는 소리입니다. **예시**: * **화상 회의**: Zoom, Google Meet, Teams에서 상대방 목소리 * **미디어 재생**: 유튜브, 동영상, 팟캐스트, 음성 파일 등 ### 2) 녹음 버튼은 눌렸는데 파형이 움직이지 않아요 **증상**: 녹음이 시작된 것 같은데 음성 파형이 표시되지 않아요. **원인**: 마이크 권한이 허용되지 않았거나 팝업이 차단되었을 수 있어요. **해결 방법**: #### 2-1) 크롬 브라우저에서 마이크 권한 확인하기 * 브라우저 우상단의 점 3개 줄임표 선택 > 설정 > 개인 정보 보호 및 보안 > 사이트 설정 접속 * \[권한] 섹션 아래 “마이크” 선택 (혹은 다음 링크를 복사하여 크롬 주소창에 입력하여 접속 가능 - chrome://settings/content/microphone) 크롬 사이트 설정 화면. 권한 섹션에 위치·카메라·마이크 등 항목이 나열된 모습 * 마이크 설정 페이지에서 ‘마이크 사용이 허용되지 않음’ / ‘마이크 사용이 허용됨’ 서비스 목록 중 tiro.ooo가 어디에 있는지 확인 정상적으로 음성을 인식하기 위해서는 위와 같이 ‘허용됨’ 아래에 티로가 있어야 합니다. 만약 '마이크 사용이 허용되지 않음' 아래에 tiro.ooo가 있다면, 아래 방법으로 설정을 변경해야 합니다. 크롬 마이크 설정 페이지. '마이크 사용이 허용됨'과 '허용되지 않음' 목록에 사이트가 분류된 모습 #### 2-2) 크롬 브라우저에서 마이크 권한 허용하기 > [tiro.ooo](http://tiro.ooo)가 ‘허용되지 않음’ 아래에 있다면 어떻게 설정을 바꾸나요? * [Tiro.ooo](http://Tiro.ooo) 옆의 삭제 버튼(휴지통 아이콘)을 클릭하여 권한 차단을 해제합니다. * 티로에서 새 노트를 생성하면 Chrome이 마이크 권한을 다시 요청합니다 * **허용**을 클릭하면 정상적으로 음성이 인식됩니다 매번 요청받고 싶지 않다면 **사이트에 있는 동안 허용**을 선택하세요 크롬 마이크 권한 요청 팝업. tiro.ooo에서 마이크 사용 요청, '사이트에 있는 동안 허용'·'이번에만 허용'·'허용 안 함' 버튼 * 설정 변경 후 페이지를 새로고침(Ctrl+R 또는 F5)한 뒤 다시 시도해보세요. ### 3) 녹음이 시작되지 않아요 다음과 같은 증상이 나타난다면 고객문의가 필요해요. **증상**: * 녹음 버튼을 눌렀는데 계속 빙글빙글 로딩만 돌아요 * 녹음 버튼이 눌렸다가 바로 원래 상태로 돌아와요 **먼저 시도해보세요**: * 페이지를 새로고침(Ctrl+R 또는 F5)해보세요 * 브라우저를 완전히 종료한 후 다시 열어보세요 그래도 해결되지 않으면 아래 **고객문의 방법**을 확인해주세요. ## 데스크탑 앱에서 기록이 되지 않는 경우 ### 내 목소리는 되는데 컴퓨터 소리(시스템 사운드)만 안 들어가요 **증상**: 마이크(내 목소리)는 잘 녹음되는데 영상·음악·상대방 목소리 같은 컴퓨터 소리만 녹음되지 않아요. "시스템 사운드를 수음할 수 없어요" 안내가 뜨기도 해요. **먼저 알아두실 점**: 이 증상은 대부분 **권한 문제가 아니에요.** 안내에 "권한을 확인해 주세요"라고 나와도, 마이크가 정상 녹음되고 있다면 권한은 정상이에요. 실제로는 컴퓨터의 출력(스피커·이어폰) 장치를 티로가 가져오지 못해서 생겨요. 앱을 최신 버전으로 업데이트해도 이 증상은 사라지지 않을 수 있어요. 앱 버전이 아니라 **컴퓨터의 오디오 장치 상태** 때문에 생기기 때문이에요. #### Windows * 녹음 화면에서 **\[시스템 사운드]** 감도가 0%가 아닌지 먼저 확인해 주세요. * **설정 > 시스템 > 소리**에서 기본 출력(재생) 장치가 정상 연결된 장치로 선택돼 있는지 확인해 주세요. 다른 장치로 바꿨다가 되돌리면 다시 잡히는 경우가 많아요. * 그 출력 장치의 **속성 > 고급**에서 **"응용 프로그램이 이 장치를 단독으로 제어하도록 허용"** 체크를 해제해 주세요. * 오디오를 차지할 수 있는 다른 앱(가상 오디오·보이스체인저, 녹음·방송 앱 등)이 켜져 있으면 종료해 주세요. * 그래도 안 되면 녹음을 일시정지했다가 다시 시작하거나, 앱을 완전히 종료한 뒤 다시 실행해 주세요. #### Mac Mac은 시스템 사운드 녹음에 OS 권한이 필요해요. * **시스템 설정 > 개인정보 보호 및 보안 > 화면 및 시스템 오디오 녹음**에서 **Tiro** 토글을 켜 주세요. * macOS 14.2 이상은 권한을 허용하면 몇 초 안에 자동으로 반영돼요. 14.1 이하는 권한을 바꾼 뒤 앱을 다시 실행해야 적용돼요. * 녹음 화면에서 **\[시스템 사운드]** 감도가 0%가 아닌지 확인해 주세요. 위 방법으로도 안 되면 고객문의로 사용 중인 스피커·이어폰 종류와 녹음 화면 스크린샷을 보내주시면 더 정확히 도와드려요. ### 스크립트에 내가 말하지 않은 내용이 섞여 적혀요 **증상**: 녹음 중 보지도 않은 영상이나 강의 내용이 스크립트에 함께 적혀 있어요. 받아쓰기 오류처럼 보여요. **원인**: 데스크탑 앱은 시스템 오디오(컴퓨터에서 재생되는 소리)를 함께 녹음하기 때문에, 백그라운드에서 재생 중인 영상·음악 소리도 함께 전사돼요. 받아쓰기 버그가 아니라 컴퓨터 재생음이 같이 녹음된 거예요. **해결 방법**: * 내 목소리만 기록하고 싶다면 녹음 컨트롤에서 **\[시스템 사운드]** 입력을 0%로 낮춰 주세요. * 화상회의 상대방 목소리는 담되 다른 재생음은 빼고 싶다면, 녹음 중에는 다른 영상·음악 재생을 멈춰 주세요. ### 2) 녹음은 시작했지만 마이크 소리가 기록되지 않아요 **증상**: 녹음은 시작되었는데 마이크 음성 파형이 움직이지 않아요. **원인:** 시스템에서 마이크가 음소거되어 있거나, 마이크 권한이 허용되지 않은 경우 **해결 방법**: 사용 중인 운영체제에 맞게 마이크 설정을 확인하세요. #### 2-1) Windows 11에서 마이크 설정 확인하기 * **윈도우 설정** > **시스템** > **소리** > \[입력] 섹션에서 **마이크** 선택 * \[입력 설정] 섹션에서 마이크 아이콘에 빗금선이 있는지 확인하세요 빗금선이 있다면 음소거 상태입니다 * 아이콘을 클릭하여 음소거를 해제하세요 (빗금선 해제) * **마이크 테스트** > **테스트 시작**을 눌러 마이크가 올바르게 작동하는지 확인하세요 Windows 11 마이크 속성 화면. 입력 볼륨 슬라이더와 음소거 아이콘, 마이크 테스트 버튼이 있는 모습 #### 2-2) Windows 10에서 마이크 설정 확인하기 * 화면 우측 하단 트레이 영역의 **스피커 아이콘**에서 마우스 우클릭 > **소리 설정 열기** 선택 * **녹음** 탭 선택 > **마이크** 위에서 우클릭 > **속성** 선택 * **수준** 탭에서 마이크 볼륨이 적절히 설정되어 있는지 확인하세요 Windows 10 소리 설정 화면. 녹음 탭의 마이크 장치 목록과 속성 화면 > **잠깐!** Windows 노트북에는 마이크 음소거 단축키가 있는 경우가 있어요. (예: Lenovo Thinkpad의 F4 버튼) 실수로 단축키가 눌리지 않았는지 확인해주세요. #### 2-3) Mac에서 마이크 권한 확인하기 Mac에서 마이크가 녹음되지 않으면 마이크 권한을 확인해 주세요. * **시스템 설정 > 개인정보 보호 및 보안 > 마이크**에서 **Tiro** 토글을 켜 주세요. * 권한을 바꾼 뒤에는 앱을 다시 실행해 주세요. macOS 시스템 설정 마이크 권한 화면. 앱 목록에서 Tiro 토글이 켜진 모습 > 컴퓨터 소리(시스템 사운드)가 녹음되지 않는 경우는 위 **"내 목소리는 되는데 컴퓨터 소리만 안 들어가요"** 항목을 참고해 주세요. ### 3) 녹음이 시작되지 않아요 **증상**: * 녹음 버튼을 눌렀는데 계속 빙글빙글 로딩만 돌아요 * 녹음 버튼이 눌렸다가 바로 원래 상태로 돌아와요 **먼저 시도해보세요**: * 앱 새로고침: **Ctrl + R** (Windows) / **Cmd + R** (Mac), 또는 앱 우측 상단 **새로고침 버튼** 클릭 * 앱을 완전히 종료한 후 다시 실행해보세요 그래도 해결되지 않으면 아래 **고객문의 방법**을 확인해주세요. ### 4) 녹음 중에 기록이 중단돼요 **증상**: 녹음이 시작되었는데 중간에 자동으로 중단됩니다. **가능한 원인**: * 네트워크 연결이 불안정할 수 있어요 * 앱이 최소화 모드로 동작하고 있을 수 있어요 **해결 방법**: * Wi-Fi나 유선 인터넷 연결 상태를 확인해주세요 * 앱이 최소화되어 있지 않은지 확인해주세요 **최소화 모드**: 앱 창을 작게 줄이거나 트레이로 최소화한 상태 * 녹음 중에는 앱을 켜둔 상태로 유지해주세요 * 그래도 문제가 계속되면 아래 **고객문의 방법**을 확인해주세요 > **참고** 안정적인 녹음을 위해 네트워크 환경이 좋은 곳에서 사용하시고, 녹음 중에는 앱을 켜둔 상태로 유지해주세요. ## 모바일 앱에서 기록이 되지 않는 경우 ### 1) 오프라인 기록하기 (홈 화면 기록하기 버튼) #### 1-1) 음성 파형 변화가 없어요 * **증상:** 음성 파형이 전혀 움직이지 않아요 이 경우 티로가 소리를 인식하지 못하고 있어요. * **원인 및 해결 방법:** **① 시스템 오디오를 녹음하려는 경우** 모바일에서는 시스템 소리(앱에서 재생되는 다른 앱의 소리)를 바로 녹음할 수 없어요. **② 블루투스 마이크 사용 중인 경우** * 현재는 **블루투스 마이크 녹음 기능을 지원하지 않아요.** * 휴대폰 내장 마이크를 가까이 두고 다시 시도해 주세요. ### 2) 실시간 기록하기 #### 2-1) 음성 파형 변화가 없어요 * **증상:** 파형이 나타나지 않아요. 휴대폰이 소리를 잘 받고 있지 않은 상태예요. * **원인 및 해결 방법:** **① 통화·미디어 재생 등 오디오 간섭이 감지된 경우** 통화(전화·인터넷 통화)나 다른 앱의 미디어 재생 등이 감지되면 기록이 **자동으로 잠시 멈춰요.** * 알림·알람·Siri 같은 **짧은 간섭**은 끝나면 **자동으로 다시 시작**돼요. * 통화·미디어 재생 같은 간섭은 끝난 뒤 화면의 **재개 안내를 눌러** 다시 시작할 수 있어요. * 이 동작은 **설정 > \[오디오 간섭 감지]** 토글에서 끌 수 있는데, 끄면 간섭이 있어도 **알림 없이 기록이 끊길 수 있어요.** **② 블루투스 마이크** * 블루투스 마이크는 **곧 지원할 예정**이에요. 지금은 휴대폰 내장 마이크를 가까이 두고 다시 시도해 주세요. #### 2-2) 음성 파형 변화는 있지만, 텍스트로 변환되지 않아요 * **증상:** 음성은 들어오는데 텍스트가 생성되지 않아요. * **원인 및 해결 방법:** **① 언어 설정이 맞지 않는 경우** 실제 대화 언어와 설정된 음성 언어가 일치하는지 확인해 주세요. **② 네트워크 연결이 불안정한 경우** * 실시간 기록은 인터넷이 필요해요. * 화면을 끄고 실시간 대화를 진행하면 중간에 기록이 유실될 수 있어요. ✔ 이런 경우에는 **오프라인 기록 기능**을 사용하는 것을 권장합니다. **③ 계속해서 문제가 발생하면** * 네트워크 변경이 있었는지 확인 후 고객문의로 문의해 주세요. ### 3) 기타 상황 * **시스템 사운드 녹음을 시도하는 경우**→ 모바일에서는 OS 정책상 시스템 사운드 녹음이 지원되지 않아요. * **휴대폰 외 입력 기기를 사용하는 경우**→ 현재는 모바일 내장 마이크 녹음만을 기준으로 하고 있어요. ## 위 방법으로도 해결되지 않는다면 고객문의로 연락해주세요. **문의 시 아래 내용을 꼭 포함해주세요**: * 문제가 발생한 **정확한 시간대** * 사용 중인 **환경** 웹 브라우저(chrome 등) * Windows 앱 * Mac 앱 * android 앱 * iOS 앱 * 문제를 겪은 노트의 **생성 시간** 노트 상세화면 상단에서 확인하실 수 있어요 **고객문의 연락 방법**: * 티로 앱 또는 웹사이트 좌측 상단의 설정에서 **고객문의** 버튼을 클릭하세요 * 챗봇에게 위 정보를 전달해주세요 * 순차적으로 상담원과 연결됩니다 # 오프라인 녹음이 업로드되지 않거나 멈춰요 Source: https://docs.tiro.ooo/ko/guide/troubleshooting/upload-failed 오프라인 녹음 종료 후 업로드 실패(Upload Failed)로 멈췄을 때, 녹음 파일을 잃지 않고 직접 복구하는 방법을 안내해요. 오프라인 녹음 종료 후 **업로드 실패**(Upload Failed) 안내가 뜨거나 업로드가 계속 멈춰 있어도, 녹음 파일은 기기에 그대로 남아 있어요. 아래 순서대로 진행하면 녹음을 잃지 않고 복구할 수 있어요. ## 먼저 다시 시도해 보세요 업로드 실패 안내 메시지의 **\[다시 시도]** 버튼을 눌러 보세요. 네트워크가 잠시 불안정했던 경우라면 대부분 다시 업로드돼요. 다시 시도해도 계속 실패한다면 아래 방법으로 직접 복구할 수 있어요. ## 데스크탑 앱에서 직접 복구하기 문서(Documents) 폴더 안의 **Tiro > recordings** 폴더를 열면 `note-`로 시작하는 녹음 파일이 있어요. 이번 녹음에 해당하는 가장 최근 파일을 바탕화면 등 다른 위치로 복사해 두세요. 녹음 종료가 정상 처리되지 않았다면 파일이 `.wav`가 아니라 `.tmp` 확장자로 남아 있을 수 있어요. 복사한 파일의 확장자를 `.wav`로 바꾸면 그대로 사용할 수 있어요. 티로 앱을 완전히 종료한 뒤 최신 버전으로 업데이트하세요. 앱 메뉴의 **\[업데이트 확인...]** 항목을 누르거나 [다운로드 페이지](https://tiro.ooo/download/app)에서 최신 버전을 설치하면 돼요. 자세한 방법은 [데스크탑 앱 업데이트하기](/ko/guide/troubleshooting/desktop-update)를 참고하세요. 앱을 다시 실행한 뒤, 백업해 둔 파일을 [음성파일 업로드](/ko/guide/recording/upload)로 올리면 텍스트 변환이 진행돼요. 기기에 저장된 녹음 파일은 최근 녹음 위주로 일정 개수까지만 보관돼요. 복구가 필요한 파일은 미루지 말고 바로 백업해 두세요. ## 모바일 앱에서 다시 변환하기 모바일에서는 녹음 파일이 앱 안에 보관돼요. **\[오디오 파일 관리]** 화면에서 해당 녹음을 찾아 **\[노트로 만들기]** 버튼을 누르면 다시 변환을 시도할 수 있어요. ## 위 방법으로도 해결되지 않는다면 티로 앱이나 웹사이트의 **고객문의** 버튼으로 연락해 주세요. 아래 내용을 함께 알려주시면 빠르게 도와드릴 수 있어요. * 문제가 발생한 **정확한 시간대** * 사용 중인 **환경** (Windows 앱 / Mac 앱 / Android 앱 / iOS 앱) * 문제를 겪은 노트의 **생성 시간** *** **관련 페이지**: [오프라인 녹음](/ko/guide/recording/offline) · [음성파일 업로드](/ko/guide/recording/upload) · [앱 업데이트](/ko/guide/troubleshooting/desktop-update) # 결제 FAQ Source: https://docs.tiro.ooo/ko/guide/workspace/billing-faq 영수증·인보이스 확인, 환불 기준, 결제 관련 자주 묻는 질문을 모았어요. ## 영수증·인보이스·견적서 확인 방법 영수증은 **결제하신 곳에서** 발급받아요. 웹사이트·데스크탑 앱 결제는 Stripe, 아이폰 앱은 App Store, 안드로이드 앱은 Google Play예요. 아래에서 본인 결제 수단을 골라 주세요. 웹사이트나 데스크탑 앱(Mac / Windows)에서 결제하신 경우예요. 1. 티로 웹사이트나 데스크탑 앱에 로그인해 주세요. 2. 좌측 상단 **\[프로필]** → **\[플랜 관리]** 메뉴를 클릭해 주세요. 3. **\[결제 관리]** 버튼을 클릭해 주세요. 4. 맨 아래 **\[청구서 내역]** 목록에서 원하는 청구서를 클릭해 주세요. 5. **\[영수증]** 또는 **\[청구서]** 파일을 다운로드해 주세요. 팀플랜은 Stripe를 통해 결제되며, **팀 어드민만** 청구서를 확인할 수 있어요. 청구서에 tax 항목이 없는 경우, 사업자 정보가 등록되어 VAT가 면제되었음을 뜻해요. 아이폰 앱에서 결제하신 경우, 영수증은 Apple(App Store)에서 발급해요. * 결제 직후 Apple이 보낸 영수증 이메일에서 바로 확인하실 수 있어요. * 지난 구입 내역은 아이폰 **\[설정]** → 맨 위 **\[사용자 이름]** → **\[미디어 및 구입 항목]** → **\[계정 보기]** → **\[구입 내역]** 화면에서 확인하실 수 있어요. 안드로이드 앱에서 결제하신 경우, 영수증은 Google Play에서 발급해요. * 결제 직후 Google Play가 보낸 영수증 이메일에서 바로 확인하실 수 있어요. * 지난 결제 내역은 **\[Google Play]** 앱 → 우측 상단 프로필 아이콘 → **\[결제 및 정기 결제]** → **\[예산 및 주문 내역]** 화면에서 확인하실 수 있어요. App Store와 Google Play 영수증은 각 스토어에서 발급해요. 티로에서는 인앱결제 영수증을 직접 발급하거나 다시 보내 드릴 수 없어요. 영수증 이메일이 보이지 않으면 스팸함도 확인해 주세요. 견적서가 필요하시거나 추가 문의 사항이 있다면 [partners@theplato.io](mailto:partners@theplato.io) 로 연락 부탁드립니다. ## 환불 정책 티로는 결제 방식과 이용 시점에 따라 환불 가능 여부가 달라요. 본인 상황에 맞는 항목을 펼쳐 확인해 주세요. (전체 기준은 [티로 서비스 이용약관](https://tiro.ooo/terms-of-service)을 따라요.) * **결제일로부터 7일 이내**에 취소 요청하신 경우, 사용 여부와 관계없이 **전액 환불**됩니다. * **서비스를 전혀 이용하지 않은 경우**, 결제일로부터 **14일 이내**에 취소 요청 시 **전액 환불**이 가능합니다. * 위 조건을 초과한 경우에는 원칙적으로 환불이 불가하며, 관련 법령에서 정한 예외적인 경우에 한해 제한적으로 제공될 수 있습니다. 연간 결제의 경우, **사용 기간에 따라 일할 계산**하여 환불됩니다. (자세한 기준은 고객센터를 통해 별도 안내드립니다.) * 환불 후 실제 입금까지는 카드사 영업일 기준 5–10일 정도 소요될 수 있습니다. * 환불이 완료되는 즉시 구독이 종료됩니다. 구독이 만료되더라도 **기존에 생성된 노트는 열람 및 수정이 가능**하지만, **새로운 노트 생성은 불가능**합니다. * 결제일로부터 **15일 이상 경과한 경우**, 서비스 이용 여부와 관계없이 환불이 불가합니다. 결제처에 따라 달라요. * **iOS(App Store):** Apple만 환불 권한이 있어 **티로에서 직접 환불해드릴 수 없어요.** App Store의 환불 정책에 따라 직접 신청해 주셔야 해요. * **안드로이드(Google Play):** 위 환불 조건에 부합하면 **고객센터를 통해 환불을 도와드릴 수 있어요.** 결제 후 48시간 이내라면 Google Play에서 직접 환불을 신청하실 수도 있어요. * **안드로이드 신청 방법:** [결제·구독 가이드의 안드로이드(Google Play) 섹션](/ko/guide/workspace/billing-guide) * **iOS 신청 방법:** [결제·구독 가이드의 iOS(App Store) 섹션](/ko/guide/workspace/billing-guide) *궁금한 점이 있다면, 서비스 내 메신저(실시간 문의, 고객문의)로 연락주세요.* # 구독 관리·취소·환불 Source: https://docs.tiro.ooo/ko/guide/workspace/billing-guide 구독 취소·환불·해지 방법은 결제한 플랫폼(웹·iOS·Android)마다 달라요. 내 결제사를 먼저 확인하고, 플랫폼별 취소·환불 절차를 단계별로 안내해드려요. **티로 구독 취소·환불은 결제한 플랫폼에서 직접 해요.** 웹·데스크탑 앱(Stripe)은 **\[플랜 관리]** 화면에서, iOS는 App Store, 안드로이드는 Google Play에서 취소합니다. 구독 취소(다음 결제 중단)와 환불(이미 낸 돈 돌려받기)은 별개라서, 취소해도 자동으로 환불되지 않아요. 그래서 내가 먼저 어디서 결제했는지 확인하세요. 티로는 사용자가 **어디에서 결제를 진행했는지**에 따라 결제사가 달라집니다. 결제사에 따라 **결제 관리 방법, 환불 처리 방식, 문의 경로**가 달라질 수 있어요. 이 가이드는 티로의 결제사 종류를 이해하고, 내가 어떤 결제사를 사용 중인지 빠르게 확인할 수 있도록 돕기 위한 안내입니다. ## 결제사 개요 ### 티로 결제사 종류 한눈에 보기 어디서 결제를 진행했는지에 따라 결제사가 정해집니다. | 결제 환경 | 결제사 | | ----------- | ----------------- | | 웹 또는 데스크탑 앱 | Stripe | | iOS 모바일 앱 | App Store | | 안드로이드 모바일 앱 | Google Play Store | ### 나의 결제사 확인하는 법 **1) 결제했던 환경을 떠올려보세요** 아래 질문에 답해보면 빠르게 확인할 수 있어요. * PC 웹사이트 또는 데스크탑 앱에서 결제했다 → Stripe * 아이폰 앱에서 결제했다 → App Store * 안드로이드 앱에서 결제했다 → Google Play Store 본인의 결제사가 기억나지 않는 경우, 결제한 기기와 환경을 먼저 확인해 주세요. **2) [티로 웹](https://tiro.ooo)에서 플랜 관리 화면으로 확인하기** 웹 또는 데스크탑 앱을 사용 중이라면, \[플랜 관리] 화면에서도 확인할 수 있어요. ### 알아두면 좋은 점 * 결제사는 **중간에 자동으로 변경되지 않습니다.** * 같은 이메일/계정을 사용하더라도, 결제 환경이 다르면 결제사는 달라질 수 있어요. * 환불, 결제 오류, 인보이스 관련 처리는 결제사 정책에 따라 진행됩니다. ## 데스크탑(Stripe) 구독 시작·확인·취소 웹 또는 데스크탑 앱(Mac / Windows)에서 결제한 경우 결제사는 Stripe입니다. ### 플랜 구독 시작하기 **0) 결제 페이지 접속하기** * 티로 웹사이트([https://tiro.ooo/](https://tiro.ooo/)) 또는 데스크탑 앱(Mac / Windows)에 로그인합니다. * 좌측 하단 프로필을 클릭한 뒤 **\[플랜 관리]** 또는 **설정 > 플랜 관리**로 이동합니다. * 이 페이지에서 유료 플랜 선택과 결제를 진행할 수 있습니다. > **연결제 안내** > > 연결제(연간 결제)를 선택하시면 2개월 무료 혜택을 받으실 수 있어요. 10개월치의 월간 요금만 결제하고 12개월간 사용해보세요! **1) 개인 플랜 결제하기** * 티로 서비스에 로그인 후 **\[설정]** → **\[플랜 관리]** 메뉴에서 원하는 플랜을 선택한 뒤 **시작하기**를 클릭합니다. * 아래와 같은 결제 창에서 **플랜, 결제 주기(월간/연간), 결제 금액**을 확인하세요. * **프로모션 코드**가 있다면, 좌측 영역의 입력창을 눌러 코드를 등록하세요. 티로는 현재 카드결제(Stripe)를 지원하고 있습니다. 해외 결제가 가능한 신용카드 또는 체크카드를 사용해 주세요. Stripe 결제 창. 왼쪽에 플랜·금액·소계와 'Add promotion code' 버튼이, 오른쪽에 이메일·카드 정보·국가 입력란과 Subscribe 버튼이 있는 모습 **2) 팀 플랜 결제하기** * 웹 또는 데스크탑 앱에서 로그인 후 **\[설정]** → **\[플랜 관리]** 메뉴로 이동합니다. * 결제 주기(월간/연간)를 선택한 뒤 **\[팀 플랜 시작하기]** 버튼을 클릭합니다. 모바일 앱에서는 팀 플랜 결제가 지원되지 않습니다. 꼭 **웹 또는 데스크탑 앱**에서 진행해 주세요. 팀플랜 결제창에서 결제 정보를 입력하세요. * **팀 플랜의 경우**, 좌측 영역에서 **팀원 수에 맞게 계정 수를 설정**해 주세요. * **비즈니스 사용자**라면, 우측 영역의 '비즈니스 목적으로 사용'을 체크한 뒤 **사업자등록번호**를 입력하시면 **VAT 10% 면제**로 청구됩니다. 결제 정보 입력 후 **\[멤버]** 메뉴에서 함께 사용할 팀원을 초대하고 팀 플랜의 협업 기능을 자유롭게 사용해 보세요! ### 결제 통화 고르기 (원화·엔화·달러) 달러 외에 **원화나 엔화로도 결제할 수 있어요.** 웹 또는 데스크탑 앱에서 **\[설정]** → **\[플랜 관리]** 화면을 열고, 요금표 위쪽 오른편의 **\[결제 통화]** 드롭다운에서 통화를 고르세요. 고른 순간 요금표와 결제 창 금액이 그 통화로 바뀌고, 화면에 표시된 금액 그대로 청구됩니다. **결제 통화는 유료 구독을 시작하기 전에만 고를 수 있어요.** 결제가 완료되면 그 구독에 통화가 고정돼서 **\[결제 통화]** 드롭다운이 사라지고, 나중에 다른 통화로 바꿀 수 없어요. 무료 체험 중이라면 아직 유료 결제 전이라 통화를 고를 수 있어요. 결제 통화 선택은 웹·데스크탑 앱 결제에만 있어요. iOS·안드로이드 앱 안에서 결제하면 통화를 고르는 화면이 없고, 스토어 수수료 때문에 웹·데스크탑 앱보다 요금이 비싸요. 결제를 원하시는 통화가 목록에 보이지 않거나, 고른 통화와 다른 통화로 결제 창이 열리면 서비스 내 메신저(고객문의)로 연락 주세요. ### 구독 중인 플랜 확인하기 현재 사용 중인 플랜은 아래 두 가지 방법으로 확인할 수 있습니다. * 좌측 하단 **프로필 클릭 > 플랜 정보**에서 간단히 확인 * **프로필 클릭 > 플랜 관리**에서 더 자세한 구독 정보 확인 플랜 관리 페이지에서는 다음 정보를 확인할 수 있습니다. * 현재 구독 중인 플랜 * 다음 결제 예정일 * 결제를 진행한 플랫폼 정보 * 플랜 변경 및 관리 옵션 ### 다가오는 정기구독 취소하기 정기 결제 예정인 플랜은 **플랜 관리 페이지**에서 언제든지 취소할 수 있습니다. 취소하더라도 이미 결제된 이용 기간이 끝날 때까지는 정상적으로 사용할 수 있습니다. > **잠깐!** > > 웹이나 데스크탑 앱으로 진행한 정기구독만 웹/데스크탑 앱에서 취소가 가능합니다. 다른 플랫폼에서 결제한 정기구독은 해당 플랫폼에서 취소해야 합니다. 자세한 내용은 해당 가이드 문서를 참고해주세요. > > 절차는 이 페이지 아래의 **iOS(App Store) 구독 시작·확인·취소** / **안드로이드(Google Play) 구독 시작·확인·취소** 섹션을 참고해주세요. ## iOS(App Store) 구독 시작·확인·취소 iOS 인앱결제는 애플 앱스토어를 통해 기존 구독을 관리할 수 있어요. ### iOS 앱에서 플랜 구독 시작하기 * 메인 화면 왼쪽 상단의 **줄 세 개**를 클릭합니다. * 계정 이름 옆 **톱니바퀴**를 클릭합니다. * "**플랜 관리**"라고 적혀 있는 부분을 클릭합니다. * 이후 원하는 플랜을 선택하여 결제를 진행합니다. ### 구독 중인 플랜 확인하기 * 앱스토어 > 계정 > 구독 순서로 선택합니다. * 구독 중인 항목에서 **Tiro**를 찾아주세요. * 현재 구독 중인 플랜과 다음 결제(갱신) 예정일을 바로 확인하실 수 있습니다. 아래 화면에서는 **'라이트 플랜'이 매달 11일 결제되며, 다음 결제일은 6월 11일**입니다. iOS App Store 구독 화면 3단계. 검색 화면 우상단 프로필, 계정 메뉴의 '구독', 구독 목록의 Tiro 라이트 항목과 6월 11일 갱신 예정 표시 ### 다가오는 정기구독 취소하기 * '구독 중인 플랜 확인하기' 단계에서 **Tiro**를 선택합니다. * **구독 취소**를 선택하면, 정기 구독이 취소되며 다가오는 결제일부터 결제가 되지 않습니다. 구독 취소를 선택하셔도 다음 결제일까지 원활히 티로를 사용하실 수 있습니다. > **구독 취소하면 환불이 되나요?** > > 구독 취소와 환불은 다릅니다. 구독 취소는 다가오는 결제일에 결제가 되지 않는 **정기 구독 취소**를 뜻합니다. **환불**은 이전에 지불한 결제금액을 돌려받는 것으로, 아래 환불 가이드를 통해 진행하실 수 있습니다. ## 안드로이드(Google Play) 구독 시작·확인·취소 안드로이드 인앱결제는 구글 플레이스토어를 통해 기존 구독을 관리할 수 있어요. ### 티로 앱에서 플랜 구독 시작하기 * 노트 목록 화면 우상단의 동그란 **프로필 아이콘**을 눌러 **설정** 화면에 들어갑니다. * **플랜** 섹션에서 **플랜 업그레이드**를 누릅니다. * 원하는 플랜을 선택한 뒤 **구매하기**를 눌러 결제를 진행합니다. ### 티로 앱에서 구독 중인 플랜 확인하기 * 노트 목록 화면 우상단의 동그란 **프로필 아이콘**을 눌러 **설정** 화면에 들어갑니다. * **플랜** 섹션 상단의 구독 상태 카드에서 현재 이용 중인 플랜, 사용량, 다음 결제일을 확인하실 수 있어요. * 결제 수단을 변경하거나 구독을 취소하시려면 같은 섹션의 **결제 관리**를 눌러 주세요. #### 티로 앱 안에서 \[결제 관리]를 눌렀는데 '구독을 찾을 수 없다'고 나와요 티로 앱의 \[설정] → \[플랜] → \[결제 관리]는 **현재 기기 Play Store에 로그인된 Google 계정**의 구독 정보를 불러옵니다. 결제하실 때 사용한 Google 계정과 현재 Play Store에 로그인된 계정이 다르면 '구독을 찾을 수 없다'고 표시될 수 있어요. **결제한 Google 계정 확인하는 방법** * 스마트폰에서 **\[Google Play]** 앱을 열어 주세요. * 우측 상단 프로필 아이콘 → **\[결제 및 정기 결제]** → **\[정기 결제]** 탭으로 이동해 주세요. * 활성 구독 목록에서 **\[Tiro]** 항목이 보이는 계정이 결제에 사용된 Google 계정이에요. (만약 활성 구독 목록에 Tiro가 보이지 않는다면 다른 구글 플레이 스토어 계정의 활성 구독 목록도 확인해주세요) * 그 계정으로 Play Store에 로그인하신 뒤, 티로 앱에서 다시 \[결제 관리]를 눌러 주세요. 티로 고객센터에서는 결제 시 사용된 Google 계정 이메일을 확인해 드릴 수 없어요. 위 방법 또는 결제 후 받은 영수증 이메일에서 직접 확인 부탁드립니다. ### 구글 플레이스토어에서 구독 중인 플랜 확인하기 * **구글 플레이스토어 > 계정 > 결제 및 정기 결제 > 정기 결제** 순서로 선택합니다. * **활성**(활성화된 구독)에서 Tiro를 찾아주세요. * 구독 중인 플랜과 다음 결제 예정일을 바로 확인하실 수 있습니다. 아래 화면에서는 **'라이트 플랜'이 매달 30일 결제되며, 다음 결제일은 7월 30일**입니다. 안드로이드 Google Play 정기 결제 화면. 프로필 메뉴의 '결제 및 정기 결제', '정기 결제' 탭, 활성 구독 목록의 Tiro 월간 플랜과 7월 30일 ₩9,900 결제 예정 표시 **구독 목록에서 티로가 보이지 않아요** **플레이스토어에 로그인된 계정이 결제에 사용된 계정인지** 확인해 주세요. 여러 Google 계정을 사용 중이라면, **구독 당시 로그인했던 계정**인지 꼭 확인하셔야 합니다. 결제 후 받은 **플레이스토어 영수증 이메일**에서 어떤 계정으로 결제되었는지 바로 확인하실 수 있어요. 플레이스토어에서 **로그인 계정을 전환하려면**, 앱 우측 상단 프로필 아이콘을 선택한 후 **계정 전환 메뉴**에서 원하는 계정을 선택하세요. 이후 다시 구독 페이지로 돌아가 확인하실 수 있습니다. ### 다가오는 정기구독 취소하기 > **구독 취소하면 환불이 되나요?** > > 구독 취소와 환불은 다릅니다. 구독 취소는 다가오는 결제일에 결제가 되지 않는 **정기 구독 취소**를 뜻합니다. **환불**은 이전에 지불한 결제금액을 돌려받는 것으로, 아래 환불 가이드를 통해 진행하실 수 있습니다. **플레이스토어에서 정기구독 취소하는 법** * '구독 중인 플랜 확인하기' 단계에 따라 내 구독 상태를 먼저 확인해 주세요. * 해지하고 싶은 구독을 선택합니다. * **정기 결제 취소 > (취소 사유 입력) > 정기 결제 취소**를 차례로 눌러 해지할 수 있습니다. 아래 화면에서는 **7월 30일 결제 예정 건**이 취소됩니다. 안드로이드 Google Play 정기 결제 취소 4단계. 활성 구독 목록의 Tiro, 정기 결제 관리의 '정기 결제 취소' 버튼, 취소 사유 선택, 취소 완료 화면 **데스크탑에서 정기구독 취소하는 법** 만일 플레이스토어에 직접 접속하기 어려운 상황이라면 [정기구독 취소 링크](https://support.google.com/googleplay/answer/7018481?hl=ko\&co=GENIE.Platform%3DAndroid)를 통해 다가오는 구독을 취소(해지)할 수 있습니다. **링크 접속 > 정기 결제 취소 > 계정 확인 > 정기 결제 선택 > 정기 결제 취소**를 통해 해지할 수 있습니다. 이때, 결제한 계정과 해지할 계정이 일치하는지 꼭 확인해주세요. ## 결제 수단(카드) 변경·삭제 등록한 카드는 언제든 바꿀 수 있어요. 웹·데스크탑 앱에서 카드로 결제(Stripe)하신 경우 티로 안에서 결제 관리 페이지로 바로 넘어가 카드를 추가·변경·삭제할 수 있고, 인앱결제나 계좌이체로 결제하신 경우는 방법이 조금 달라요. ### Stripe(웹/데스크탑) 카드 변경 웹 또는 데스크탑 앱에서 카드로 결제하셨다면 아래 순서로 카드를 관리하세요. * 티로 웹사이트 또는 데스크탑 앱에 로그인한 뒤 **설정** → **\[플랜 관리]** 로 이동합니다. * **\[구독/결제 관리]** 버튼을 누르면 Stripe 결제 관리 페이지로 이동합니다. (티로는 카드 입력 화면을 자체로 두지 않고, 안전한 Stripe 결제 페이지로 연결해요.) * 결제 관리 페이지의 **결제 수단(Payment methods)** 영역에서 카드를 관리할 수 있어요. * **카드 추가**: **결제 수단 추가(Add payment method)** 를 눌러 새 카드 정보를 입력하고 저장합니다. * **기본 카드 변경**: 카드 옆 메뉴에서 **기본으로 설정(Make default)** 을 누르면 다음 결제부터 이 카드로 청구돼요. * **카드 삭제**: 카드 옆 메뉴에서 **삭제(Delete)** 를 누릅니다. > **카드를 바꾸실 땐 새 카드를 먼저 등록하세요** > > 이용 중인 구독에 연결된 기본 카드는 곧바로 삭제되지 않아요. 다음 결제에 쓸 카드가 최소 한 장은 남아 있어야 해서, 기본 카드의 삭제 버튼이 회색으로 비활성화됩니다. > > 그래서 카드를 교체하실 때는 **① 새 카드 추가 → ② 새 카드를 기본으로 설정 → ③ 기존 카드 삭제** 순서로 진행해 주세요. 구독을 해지한 뒤에는 카드를 자유롭게 삭제하실 수 있어요. 팀 플랜은 **워크스페이스 관리자(Admin)** 만 결제 관리 페이지에 들어갈 수 있어요. 일반 구성원에게는 결제 관리 버튼이 활성화되지 않습니다. ### 인앱결제(App Store / Google Play) 카드 변경 iOS 앱(App Store)이나 안드로이드 앱(Google Play)에서 결제하신 경우, 카드 변경은 티로가 아니라 **각 스토어의 구독 설정**에서 하셔야 해요. * **iOS**: App Store → 계정 → 결제 정보에서 카드를 변경합니다. * **안드로이드**: Google Play → 결제 및 정기 결제 → 결제 수단에서 카드를 변경합니다. 앞으로는 웹 카드결제(Stripe)로 옮겨서 티로 안에서 직접 관리하고 싶으시면, 서비스 내 메신저(고객문의)로 문의해 주세요. ### 계좌이체로 결제한 경우 계좌이체로 결제 중이시라면 결제 수단 변경은 서비스 내 메신저(고객문의)로 문의해 주시면 도와드려요. > **잠깐!** 구독이 완전히 만료돼 무료 플랜으로 돌아간 상태에서는 앱 안에 결제 관리 진입 버튼이 나타나지 않아요. 이때 카드를 정리하고 싶으시면 서비스 내 메신저(고객문의)로 연락 주시면 정리해 드릴게요. ## 플랜 변경 (업그레이드 / 다운그레이드) 월간 구독을 사용 중이신가요? 연간 구독으로 변경하면 최대 30%까지 할인된 가격으로 이용하실 수 있어요. 티로 플랜을 업그레이드하시면 더 많은 녹음 시간과 추가 기능을 사용하실 수 있습니다. 업그레이드 방법은 결제하신 플랫폼에 따라 다르니, 본인의 결제 플랫폼에 맞는 가이드를 확인해주세요. ### 플랜 업그레이드란? 티로의 플랜 업그레이드는 다음 두 가지를 의미합니다. **1) 더 많은 사용량의 플랜으로 변경** 예를 들어, 라이트 플랜에서 프로 플랜(구 스타터 플랜)으로 변경하는 경우를 의미합니다. **2) 월간 플랜에서 연간 플랜으로 변경** 예를 들어, 월간 라이트 플랜에서 연간 라이트 플랜으로 변경하는 경우를 의미합니다. > **잠깐!** 업그레이드 방법은 결제하신 플랫폼에 따라 다르니, 본인의 결제 플랫폼에 맞는 가이드를 확인해주세요. ### Stripe(웹/데스크탑) 플랜 변경 **업그레이드 방법 (데스크탑에서 접속하는 경우)** * 티로 앱 또는 웹사이트에서 **설정 > 플랜 관리** 선택 * 원하는 플랜의 **업그레이드** 버튼 클릭 * Stripe 플랜 관리 화면에서 **구독 업데이트** 버튼 클릭 * 업데이트 하고 싶은 플랜을 선택 후 **계속** 버튼 클릭 (플랜 종류 선택 가능, 월간/연간 선택 가능) * 업데이트 확인 화면에서 **확인** 클릭 결제사에 이미 등록된 카드로 자동 결제되므로, 카드 정보를 다시 입력할 필요가 없습니다! **업그레이드 방법 (모바일 앱에서 접속하는 경우)** * 티로 앱에서 **내 구독** 메뉴 접근 * **구독 관리 바로가기** 버튼 클릭 * Stripe 구독 관리 포털로 이동 * 이후 단계는 데스크탑과 동일 **월간 → 연간으로 변경(웹/데스크탑에서 카드로 결제한 경우)** * 티로 로그인 후 좌측 상단 설정 > 플랜 관리로 이동하세요 * 원하는 연간 플랜의 "시작하기" 버튼을 클릭하세요 * 월간/연간 결제 주기를 선택하는 화면에서 "연간"을 선택하세요 * 남은 월간 구독 기간은 자동으로 일할 계산되어 차감됩니다 > **잠깐!** 월간 구독의 남은 기간만큼 차액이 자동 계산되니 안심하세요. 손해 없이 연간으로 전환하실 수 있어요! #### Stripe 업그레이드 원칙 Stripe 기반 정기 구독은 **업그레이드 시점에 아래 원칙**으로 적용됩니다. **1) 업그레이드는 즉시 적용됩니다** * 업그레이드 결제 후, 상위 플랜의 혜택 및 사용량이 즉시 활성화됩니다. * 현재 플랜을 '취소하고 새로 시작'하는 개념이 아니라, 현재 사이클을 유지한 채 차액 결제가 붙는 구조입니다. **2) 결제 금액은 남은 기간만큼 일할 계산(prorate)됩니다** Stripe는 업그레이드를 '일할 계산된 차액 청구'로 처리합니다. * 기존 플랜에서 아직 쓰지 않은 잔여 기간은 크레딧으로 돌려주고 * 새 플랜의 남은 기간분을 청구한 뒤, 그 차액만 즉시 결제합니다. 따라서 즉시 청구되는 차액은 다음 결제일까지 남은 기간에 따라 달라집니다. 결제 주기 초반에 업그레이드하면 차액이 크고, 다음 결제일에 가까울수록 차액이 작아집니다. 예시: 라이트 \$7 → 스타터/프로 \$13 으로 결제 주기가 막 시작된 시점에 업그레이드하면 즉시 결제 금액은 약 **\$6**, 주기 절반이 지난 시점이라면 약 **\$3**만 청구됩니다. **3) 사용량 한도는 즉시 새 플랜 기준으로 바뀝니다** 업그레이드하면 그 즉시 새 플랜의 월 사용량 한도가 적용됩니다. * 별도로 '차액만큼 충전'되는 것이 아니라, 이번 결제 주기에 이미 사용한 분을 새 플랜 한도에서 차감한 만큼 바로 더 사용할 수 있습니다. * 사용 가능량은 "새 플랜 한도 − 이번 주기에 이미 사용한 분"으로 계산됩니다. (결제 주기는 그대로 유지되므로 사용량이 0으로 초기화되지는 않습니다.) 예시: 라이트(월 300분)에서 100분을 사용한 뒤 프로(월 1000분)로 업그레이드하면, 남은 사용 가능량은 1000 − 100 = **900분**입니다. (아직 사용 전이라면 1000분 전부 사용 가능) **4) 결제 주기는 변경되지 않습니다** * 업그레이드해도 기존 결제일은 그대로 유지 * 다음 결제일이 되면 상위 플랜 금액이 정상 청구됨 예시: * 업그레이드 즉시 → \$6 결제 * 다음 청구일 → \$13(프로, 구 스타터) 정기 결제 > **참고** 플랜을 낮추는 경우의 적용 시점과 차액 처리는 변경 시 결제 화면에 표시되는 안내에서 확인할 수 있어요. 궁금한 점은 고객문의로 연락주세요. ### App Store(iOS) 플랜 변경 * '구독 중인 플랜 확인하기' 단계에서 **Tiro**를 선택합니다. * **모든 요금제 보기** 메뉴를 누르면 이용 가능한 플랜을 모두 확인할 수 있습니다. * 변경하고 싶은 플랜을 선택하면, **즉시 플랜을 변경**할 수 있습니다. **플랜을 업그레이드 하는 경우** 사용자가 현재 구독보다 더 높은 수준의 서비스를 제공하는 구독을 구매합니다. **즉시 업그레이드**되고 **기존 구독 금액의 일할 계산된 금액이 환불**됩니다. **플랜을 다운그레이드 하는 경우** 사용자가 현재 구독보다 낮은 수준의 서비스를 제공하는 구독을 선택하는 경우입니다. **기존 구독은 다음 갱신일까지 유지**되다가, 이후 결제 갱신일에 맞추어 더 낮은 수준과 가격으로 갱신됩니다. ### Google Play(안드로이드) 플랜 변경 * Tiro 메인 화면 좌측 상단의 **☰** 버튼을 클릭합니다. * **설정**(톱니바퀴 아이콘)을 선택합니다. * 사용량 표시 밑에 **\[플랜 관리]** 버튼을 클릭합니다. * 변경하고 싶은 플랜을 선택한 뒤 **\[구매하기]** 버튼을 눌러주세요. > 플랜 변경은 언제든지 가능하며, 몇 번의 클릭만으로 바로 적용됩니다. **플랜을 업그레이드 하는 경우** 현재 이용 중인 플랜보다 **더 많은 기능과 사용량을 제공하는 플랜으로 변경**하는 것을 의미합니다. * 업그레이드는 **결제 즉시 적용**됩니다. * 추가된 기능과 사용량은 **바로 사용 가능**합니다. * 남은 기간에 대한 차액이 **즉시 청구**되며, 결제일(갱신일)은 기존과 동일하게 유지됩니다. **플랜을 다운그레이드 하는 경우** 현재 이용 중인 플랜보다 **기능과 사용량이 적은 플랜으로 변경**하는 경우입니다. * 현재 결제 주기가 끝날 때까지는 지금 플랜을 그대로 사용하시고, **다음 갱신일부터** 선택하신 하위 플랜으로 전환됩니다. * 이미 결제된 이용 기간에 대한 **부분 환불은 제공되지 않습니다.** 이는 구글 플레이스토어 결제 정책에 따른 제한 사항으로, 양해 부탁드립니다. ### 인앱 결제 사용자의 구독 주기 변경(월간 → 연간) 인앱 결제 정책상, 구독 주기 변경(월간→연간)은 현재 구독이 만료된 후에만 웹/데스크탑 결제를 통해 가능합니다. **진행 방법** * 현재 월간 구독을 해지하세요 (즉시 사용 중단되지 않고 만료일까지 사용 가능) * 해지 방법은 아래 "인앱결제(iOS / 안드로이드) 환불" 섹션과 각 스토어의 구독 관리 화면을 참고하세요 * 구독 만료 후, 앱에서 연간 플랜으로 새로 구독하세요 이렇게 사용해보세요! 연간 구독은 월간 대비 2개월 무료 혜택이 있어요. 10개월치만 결제하고 12개월간 사용하실 수 있습니다. ### 연간 구독 혜택 * 2개월 무료 (10개월 요금으로 12개월 사용) * 동일한 모든 기능 사용 가능 궁금한 점이 있다면, 서비스 내 메신저(고객문의)로 연락주세요. ## 환불 환불이 필요한 경우, 결제 시점과 이용 여부에 따라 환불 가능 여부가 달라질 수 있습니다. ### Stripe(웹/데스크탑) 환불 웹/데스크탑(Stripe)으로 결제하신 경우, 고객 문의를 통해 환불을 요청해 주세요. 환불 기준은 다음과 같아요. * **월 결제**: 결제 후 7일 이내에는 전액 환불돼요. 7일이 지났더라도 14일 이내이고 결제 후 서비스를 전혀 사용하지 않았다면 전액 환불할 수 있어요. 15일 이상 경과한 경우에는 환불이 어려워요. * **연 결제**: 사용한 기간을 일할 계산한 뒤 남은 금액을 환불해드려요. 구체적인 산식은 고객센터에서 개별 안내드려요. * 환불 금액은 카드사에 따라 영업일 기준 5\~10일 안에 입금돼요. 환불 즉시 구독이 종료되고, 기존 노트는 계속 열람·수정할 수 있지만 새 노트는 만들 수 없어요. ### 인앱결제(iOS / 안드로이드) 환불 인앱결제 환불은 결제처에 따라 방법이 달라요. * \*\*iOS(App Store)\*\*는 Apple만 환불 권한이 있어 **티로가 직접 환불을 도와드릴 수 없어요.** 앱스토어를 통해 직접 신청해 주셔야 해요. * \*\*안드로이드(Google Play)\*\*는 위 환불 조건에 부합하면 **고객센터를 통해 환불을 도와드릴 수 있어요.** 결제 후 48시간 이내라면 구글 플레이스토어에서 바로 환불을 신청하실 수도 있어요. 아래 안내에 따라 진행해 주세요. **안드로이드(Google Play) 환불 신청** 1. [구글 플레이스토어 환불 신청 링크](https://support.google.com/googleplay/answer/15574897?sjid=970613294466412321-NC) 접속하기 잠깐! * **플레이스토어에 로그인된 계정**이 티로 결제에 사용된 계정인지 확인해 주세요. * 여러 Google 계정을 사용 중이라면, **구독 당시 로그인했던 계정**인지 반드시 확인하세요. * 영수증(플레이스토어에서 발송)을 이메일에서 확인하면, 어떤 계정으로 구독이 이루어졌는지 바로 알 수 있어요. * 플레이스토어 앱 우측 상단 **프로필 아이콘 → 계정 전환** 메뉴에서 다른 계정으로 전환 후 다시 구독 페이지를 확인해 보세요. 안드로이드 Google Play 환불 요청 진입 화면. '환불 요청하기' 안내와 환불 요청 버튼, 로그인 화면, 결제 계정 본인 인증 화면 2. 환불요청 > 결제를 진행한 계정 입력 > 구매한 내역 중 티로 결제 건 확인 > '실수로 구매함' 선택하기 안드로이드 Google Play 환불 5단계. 환불 정책, 계정 확인, 구매 내역에서 Tiro 월간 플랜 선택, 환불 사유 '실수로 구매함', 환불 선택사항 검토 화면 결제 후 48시간이 지났거나 직접 신청이 어려우시면, 서비스 내 메신저(고객문의)로 요청해 주세요. 환불 조건에 부합하면 저희가 직접 환불을 도와드려요. **iOS(App Store) 환불 신청** * [앱스토어 환불링크](https://reportaproblem.apple.com) 접속하기 * 결제가 이루어진 애플 계정(앱스토어 계정)으로 로그인하기 * 문제 선택: 환불 요청 * 세부 내용 선택: 이 항목을 구입하려던 것이 아닙니다 * 티로 결제 건 선택 * 항목을 모두 선택하신 뒤 제출을 선택하시면 정상적으로 환불 요청이 완료됩니다. 실제 환불처리된 금액 입금까지는 1-2일 가량 소요될 수 있습니다. iOS 환불 신청 화면 reportaproblem.apple.com. 문제 선택 드롭다운의 '환불 요청', 세부 내용의 '이 항목을 구입하려던 것이 아닙니다', 티로 라이트 결제 건 선택 후 제출 화면 > **잠깐!** 결제일자를 꼭 확인해주세요! 잘못된 결제 건을 선택하실 경우, 환불처리가 어렵습니다. ## 역할별 권한과 과금 티로의 워크스페이스는 4가지 역할로 구성되어 있으며, **역할에 따라 팀 플랜에서의 과금 여부가 달라요**. ### 과금되는 역할 #### Admin **권한** 관리자는 티로의 모든 기능과 워크스페이스 관리 기능을 모두 사용할 수 있는 역할입니다. 녹음, 편집, 요약, 문서 생성부터 구성원 관리, 설정 변경까지 모든 권한을 가집니다. 워크스페이스를 생성한 유저에게는 자동으로 Admin 역할이 부여됩니다. **과금** 관리자는 팀 플랜 시트 1개를 사용하며, 월 \$29가 과금됩니다. #### Member **권한** Member는 노트 열람에 더해 티로의 모든 기능을 사용할 수 있습니다. 녹음 시작, 노트 편집, 요약 및 문서 생성이 가능하지만, 구성원 초대나 역할 변경과 같은 워크스페이스 관리 기능은 사용할 수 없습니다. **과금** Member는 팀 플랜 시트 1개를 사용하며, 월 \$29가 과금됩니다. ### 과금되지 않는 역할 #### Unpaid Admin **권한** 무료 관리자는 노트 열람에 더해 워크스페이스 관리 기능을 사용할 수 있습니다. 구성원 초대 및 삭제, 역할 변경, 설정 관리, 초대 받은 노트 열람이 가능합니다. 다만 티로의 핵심 기능인 녹음, 요약, 문서 생성은 사용할 수 없습니다. **과금** 무료 관리자는 팀 플랜 시트를 사용하지 않으며, 과금되지 않습니다. #### Viewer **권한** 뷰어는 워크스페이스의 노트를 열람만 할 수 있는 역할입니다. 녹음, 편집, 워크스페이스 관리 기능은 사용할 수 없습니다. **과금** 뷰어는 팀 플랜 시트를 사용하지 않으며, 과금되지 않습니다. ### 과금 예시 Admin과 Member는 각각 월 \$29의 유료 시트를 사용합니다. Unpaid Admin과 Viewer는 과금되지 않습니다. 예를 들어, Admin 2명, Member 3명, Unpaid Admin 1명, Viewer 5명으로 구성된 팀의 경우 유료 시트는 총 5개(Admin 2 + Member 3)이며, 월 요금은 \$145(5 × \$29)입니다. ### 역할 변경 워크스페이스의 Admin 또는 Unpaid Admin이 설정에서 구성원의 역할을 변경할 수 있습니다. **역할 변경 방법** \[설정창 > 워크스페이스 설정 > 멤버 > 멤버 목록] **역할 변경 시 과금 처리** 무료 역할(Viewer, Unpaid Admin)에서 유료 역할(Member, Admin)로 변경하면 사용 기간에 따라 일할 계산되어 즉시 청구됩니다. 반대로 유료 역할에서 무료 역할로 변경하면 남은 기간만큼 일할 계산되어 다음 결제 금액에서 차감됩니다. > **계산 방법** > > 청구 또는 환불 금액 = \$29 × (다음 결제일까지 남은 일수 ÷ 결제 주기 일수) 유료 역할 간 변경(Admin ↔ Member)이나 무료 역할 간 변경(Viewer ↔ Unpaid Admin)은 과금에 영향을 주지 않습니다. ## 팀원 추가·내보내기 ### 팀플랜 기본 과금 방식 팀플랜은 **계정 수(시트)를 기준**으로 요금이 책정됩니다. 팀에 속한 사용자 수만큼 요금이 부과되며, 모든 팀원이 동일한 기능을 사용할 수 있습니다. **요금 체계** * **기본 요금**: 계정당 \$29/월 * **무제한 이용 시간** * **모든 협업 기능 포함** 예시: 팀 인원이 **10명**인 경우 월 **\$290 (10 × \$29)** 이 청구됩니다. **통합 청구** 팀 전체가 하나의 인보이스로 청구됩니다. * 팀 오너의 결제 수단으로 결제 * 팀원별 개별 결제 불필요 * 하나의 인보이스 발급 ### 팀원 추가하기 **초대 방법** 관리자 권한이 있어야 팀원을 초대할 수 있습니다. * 좌상단 프로필 > **팀 관리** 클릭 * **멤버 추가** 버튼 클릭 * 이메일 주소 입력 (필수) * 메모 추가 (선택사항: 소속 팀, 직무 등) * 초대 발송 **초대 프로세스** * 초대가 완료되면 해당 이메일로 초대장 발송 * 초대를 수락하면 바로 팀 구성원으로 등록 **추가 시 과금 방식** 팀원이 초대를 수락한 시점부터 남은 기간에 대해 **일할 계산되어 즉시 결제**됩니다. 과금 공식: 즉시 청구 금액 = (\$29 ÷ 해당 월 일수) × 남은 일수 **예시 1: 월간 플랜** | 항목 | 내용 | | ------ | -------------------------- | | 현재 팀원 | 3명 (\$87/월) | | 추가 인원 | 1명 | | 수락일 | 1월 15일 | | 남은 기간 | 16일 | | 즉시 과금 | \$14.97 (\$29 ÷ 31일 × 16일) | | 다음 결제일 | 4명 × \$29 = **\$116** | **예시 2: 연간 플랜** | 항목 | 내용 | | ------ | ------------------------------- | | 현재 팀원 | 3명 (\$348/년/인) | | 추가 인원 | 2명 | | 수락일 | 7월 1일 | | 남은 기간 | 6개월 | | 즉시 과금 | \$348 (\$348 ÷ 12개월 × 6개월 × 2명) | | 다음 결제일 | 5명 × \$348 = **\$1,740** | > **참고** 팀원을 추가로 초대하면, 초대를 수락한 시점부터 사용 일수에 따라 요금이 계산되어 즉시 청구됩니다. ### 팀원 내보내기 **내보내기 방법** * 좌상단 프로필 > **팀 관리** 클릭 * 내보낼 팀원 선택 * **팀에서 내보내기** 클릭 * 확인 후 즉시 제외 **내보내기 후 발생하는 일** 즉시 효과: * 해당 구성원은 즉시 팀 플랜에서 제외됨 * 팀 단어장 같은 팀 공용 기능에 접근할 수 없음 * 팀 구독 혜택을 적용받을 수 없음 비용 처리: * 해당 팀원에 대한 구독 비용이 더 이상 청구되지 않음 * 남은 기간에 대한 비용은 일할계산되어 **다음 결제 청구 시 차감**됨 **삭제 시 과금 예시** 상황: * 현재: 5명 팀, 월간 플랜 (\$145/월) * 결제일: 매월 1일 (1월 1일 결제 완료) * 팀원 내보내기: 1월 15일 (16일 남음) * 삭제 인원: 1명 과금 내역: | 결제 시점 | 계산 | 금액 | | ------------- | ------------------------------------------------------- | -------- | | 1월 결제 (이미 완료) | 5명 × \$29 | \$145 | | 2월 1일 결제 | 4명 × \$29 = \$116, 남은 기간 차감: \$29 ÷ 31일 × 16일 = \$14.97 | \$101.03 | | 3월 1일 이후 결제 | 4명 × \$29 | \$116 | > **중요** 즉시 환불되지는 않지만, 남은 기간에 대한 비용이 다음 결제 시 자동으로 차감됩니다. ### 팀플랜 정기 구독 취소하기 팀플랜 정기 구독을 중단하고 싶은 경우, 개인 플랜 구독 취소와 동일한 방법으로 진행하실 수 있습니다. **구독 취소 방법** * 티로 웹사이트 또는 데스크탑 앱 로그인 * 설정 > **플랜 관리**로 이동 * **결제 관리** 버튼 클릭 * **구독 취소** 선택 후 확인 **구독 취소 후 변화** 계속 사용 가능: * 현재 결제 주기가 끝날 때까지 팀플랜의 모든 기능 사용 가능 * 기존 팀 구조와 데이터는 그대로 유지 결제 주기 종료 후: * 새로운 노트 생성 불가 * 기존 노트는 계속 조회 및 수정 가능 > **참고** 구독을 취소하더라도 팀 자체는 삭제되지 않으며, 언제든 다시 구독하실 수 있습니다. ## 팀 ↔ 개인 전환, 팀에서 나가기 ### 개인 플랜에서 팀플랜으로 전환하는 경우 **전환 방법** 개인 플랜 사용 중에도 언제든 팀플랜으로 전환하실 수 있습니다. * 설정 > 플랜 관리로 이동 * **팀 플랜 시작하기** 클릭 * 팀원 수 설정 및 결제 진행 **안내사항** **1) 전환 시 정산** 개인 플랜에서 팀 플랜으로 전환하면 전환 시점에 일할 계산(proration)으로 정산돼요. **2) 기존 노트 유지** 개인 플랜에서 생성한 모든 노트는 그대로 유지되며, 팀플랜으로 전환해도 여전히 접근 가능합니다. **3) 인앱결제 사용자는 팀플랜 시작 불가** iPhone이나 Android 앱에서 결제하신 경우, 팀플랜을 바로 시작하실 수 없습니다. 모바일 인앱결제는 App Store나 Google Play의 정책에 따라 해당 플랫폼의 결제 시스템을 사용해야 하는데, 이 결제 시스템에서는 팀플랜을 지원하지 않기 때문입니다. 팀플랜을 사용하시려면 웹사이트나 데스크탑 앱에서 Stripe라는 결제 서비스로 전환하셔야 합니다. > **잠깐!** 인앱결제 구독을 먼저 취소하고, 구독 기간이 끝날 때까지 기다린 후 팀플랜을 시작하실 수 있습니다. 바로 전환하고 싶으시다면 고객문의 통해서 상담사 연결 요청해주시면 도와드릴 수 있습니다. 전환 방법: * 현재 인앱결제 구독 취소 (App Store 또는 Google Play에서). 자세한 내용은 위의 구독 취소 섹션을 참고하세요. * 구독 만료일까지 대기하거나, 고객문의를 통해 조기 종료 요청 * 티로 웹사이트([https://tiro.ooo/](https://tiro.ooo/)) 또는 데스크탑 앱 로그인 * 설정 > 플랜 관리에서 팀플랜 시작 ### 팀플랜에서 개인 플랜으로 전환하는 경우 개인 유료 플랜을 시작하기 전, 먼저 팀을 탈퇴해주셔야 합니다. 팀 탈퇴 절차는 바로 아래 **팀에서 나가기** 섹션을 참고해주세요. 궁금한 점이 있다면, 서비스 내 메신저(고객문의)로 연락주세요. ### 팀에서 나가기 개인 플랜을 구독하고 싶거나 팀에서 나가고 싶을 때 직접 탈퇴하실 수 있습니다. **팀 나가기 방법** * 설정 > 팀 관리로 이동 * **팀 나가기** 버튼 클릭 * 확인 후 탈퇴 완료 > **Q:** 팀 나가기 버튼이 보이지 않아요 > > **A:** 팀에 활성화된 구독이 남아있으면 팀 나가기 버튼이 보이지 않습니다. 팀원인 경우 팀 관리자에게 팀에서 제외해달라고 요청하세요. 팀 관리자인 경우, 고객문의로 연락주세요. **탈퇴 후 변화** 계속 사용 가능: * 개인적으로 생성한 모든 노트 조회 및 수정 * 개인 플랜으로 전환 가능 (원하는 플랜 구독) 사용 불가능: * 팀 폴더 접근 * 팀 템플릿 사용 * 팀 단어장 이용 * 팀 내에서 생성했던 노트 열람 (팀에 남게 됨) > **참고** 팀을 나가더라도 개인적으로 생성한 노트는 그대로 유지됩니다. 다만 팀 폴더에 저장했던 노트는 팀에 남게 되어 접근할 수 없습니다. **탈퇴가 제한되는 경우** 팀 플랜 구독이 활성화 되어있는 경우, 임의로 팀을 탈퇴하는 것이 제한됩니다. 해결 방법: * 팀원인 경우: 팀 관리자가 "내보내기" 처리 필요 * 관리자인 경우: 아래 두 가지 방법 중 선택 * 팀 플랜 구독 만료를 기다린 후 탈퇴 * 고객센터 문의: 팀 플랜 구독을 만료시키지 않은 채 관리자 탈퇴가 필요한 경우 또는 구독 조기 종료를 원하는 경우 ## 기타 FAQ ### 법인 카드 결제 가능한가요? 네, 해외 결제가 가능한 신용/체크카드라면 법인 카드로도 결제할 수 있어요. 결제 시 '비즈니스 목적으로 구매합니다'를 체크하고 사업자등록번호를 입력하면 VAT 10% 면제로 청구돼요. ### 세금 포함 되나요? 비즈니스 사용자가 결제 시 사업자등록번호를 입력하면 VAT 10% 면제로 청구돼요. 청구서의 세금 항목은 결제 내역(청구서)에서 확인할 수 있어요. ### 원화(KRW)로 결제할 수 있나요? 네, 됩니다. 웹 또는 데스크탑 앱의 **\[설정]** → **\[플랜 관리]** 화면에서 요금표 위쪽 오른편의 **\[결제 통화]** 드롭다운을 **\[원화 (KRW)]** 옵션으로 바꾸고 결제하면 원화로 청구돼요. 엔화(JPY) 결제도 같은 자리에서 고를 수 있어요. 단, 통화는 유료 구독을 시작하기 전에만 고를 수 있고 결제 후에는 바꿀 수 없어요. iOS·안드로이드 앱 안에서 결제할 때는 통화를 고르는 화면이 없어요. ### 결제 통화를 고르는 드롭다운이 안 보여요 이미 유료 구독 중이면 그 구독에 통화가 고정돼서 드롭다운이 사라져요. 이때는 통화를 바꿀 수 없어요. 아직 구독 전인데 원하시는 통화가 보이지 않는다면 서비스 내 메신저(고객문의)로 연락 주세요. # 크레딧 Source: https://docs.tiro.ooo/ko/guide/workspace/credits 크레딧은 플랜과 별개로 쓸 수 있는 녹음 시간이에요. 1크레딧 = 1분이고, 받은 날로부터 1년간 사용할 수 있어요. ## 크레딧이란? 크레딧은 **플랜과 별개로 사용할 수 있는 녹음 시간**이에요. 1크레딧은 1분의 녹음 시간에 해당하고, 유료 플랜이 없거나 무료 체험이 종료된 경우에도 사용할 수 있어요. * 1크레딧 = 1분의 녹음 시간 * 유효기간: 받은 날로부터 1년 (기간이 지나면 남은 크레딧은 소멸돼요) * 무료 체험 종료 후에도 사용 가능 * 플랜 변경과 관계없이 유지 ## 크레딧은 이렇게 차감돼요 * 플랜의 월간 제공 시간을 먼저 사용하고, 그걸 다 쓴 뒤에 크레딧이 차감돼요. 사용량이 무제한인 플랜에서는 크레딧이 차감되지 않아요. * 크레딧이 여러 건이라면 **만료가 가까운 크레딧부터** 자동으로 차감돼요. * 크레딧은 별도 화면 없이 잔여 사용량에 합산되어 표시돼요. 예를 들어 라이트 플랜(월 300분)에 크레딧 50분이 있으면 잔여 사용량이 350분으로 보여요. 유료 플랜 없이 크레딧만으로도 티로를 쓸 수 있어요. 무료 체험이 끝났더라도 크레딧이 남아 있다면 계속 기록할 수 있어요. ## 티로 선물하기 친구에게 티로를 선물하면 친구는 첫 구독 결제에서 할인을 받고, 나는 결제 금액에서 차감되는 리워드를 적립해요. **\[설정]** → **\[티로 선물하기]** 메뉴에서 내 초대 링크를 보낼 수 있어요. * **초대받은 친구**: 초대 링크로 가입하면 프로 플랜 1개월 할인을 한 번 받아요. 첫 구독 결제에 적용되는 할인이라, 구독을 시작해야 혜택을 받을 수 있어요. 무료 체험 기간을 늘려주는 혜택은 아니에요. * **초대한 나**: 친구가 첫 10분 이상 녹음을 마치면 \$3, 첫 유료 결제 7일 뒤에 \$5를 적립해요. 한 사람당 최대 \$8까지 받을 수 있고, 초대할 수 있는 인원에는 제한이 없어요. 선물하기 리워드는 크레딧(녹음 시간)과는 완전히 다른 혜택이에요. 리워드는 녹음 시간이 아니라 **결제 금액에서 차감되는 잔액**이라, 다음 결제부터 내 웹(Stripe) 결제에 자동으로 적용돼요. 앱스토어·플레이스토어에서 결제 중인 구독에는 적용되지 않고, 웹 결제로 바꾸려면 고객지원에 문의해야 해요. 초대받은 친구의 가입 리워드는 지급일부터 7일, 초대한 사람의 적립 리워드는 적립일부터 1년 동안 사용할 수 있고, 오래된 것부터 먼저 사용돼요. 정책이 시작되기 전에 초대한 분들은 예전 방식대로 크레딧(사용 시간 100분)으로 보상을 받았기 때문에 리워드가 새로 적립되지는 않아요. 다만 초대로 가입한 인원 수에는 그대로 포함돼요. 전체 조건은 [티로 선물하기 리워드 이용 조건](https://tiro.ooo/referral-rewards-terms)에서 확인할 수 있어요. ## 자주 묻는 질문 ### 보유한 크레딧만 따로 볼 수 있나요? 크레딧만 별도로 확인하는 화면은 제공되지 않고, 전체 잔여 사용량에 합산되어 표시돼요. ### 플랜을 바꾸면 크레딧이 사라지나요? 아니요, 크레딧은 플랜과 별개로 관리되어 플랜을 바꾸거나 해지해도 유효기간 안에는 그대로 유지돼요. ### 월간 사용량을 다 썼는데 더 기록하고 싶어요. 크레딧이 있다면 자동으로 크레딧에서 차감되며 계속 기록할 수 있어요. 크레딧도 없다면 플랜 업그레이드를 고려해 보세요. [티로 요금제](/ko/guide/workspace/plans)를 참고하세요. *** **관련 페이지**: [티로 요금제](/ko/guide/workspace/plans) · [무료 체험](/ko/guide/workspace/free-trial) · [구독 관리](/ko/guide/workspace/billing-guide) # 엔터프라이즈 플랜 Source: https://docs.tiro.ooo/ko/guide/workspace/enterprise SSO·SCIM·접근 IP 제한부터 감사 로그·데이터 보존·전용 클라우드까지. 엔터프라이즈 플랜이 제공하는 보안·조직 관리·연동 기능을 한곳에서 살펴보세요. 엔터프라이즈 플랜에서 제공하는 기능이에요. 엔터프라이즈 플랜은 팀 플랜의 모든 기능에, 기업이 요구하는 **보안·조직 관리·연동**을 더한 맞춤형 플랜이에요. 사내 인증 체계와 통합하고, 여러 워크스페이스를 한곳에서 통제하고, 사내 시스템과 연동하는 옵션을 골라 쓸 수 있어요. 아래에서 무엇이 가능한지 한눈에 살펴보고, 자세한 설정은 각 상세 페이지로 이어가세요. 엔터프라이즈는 상담 기반 플랜이에요. 조직의 요구사항을 확인하고 맞춤 구성을 함께 설계하니, 필요한 기능이 보이면 [도입 문의](https://relate.so/forms/yr14ayb1s9zdkuru)를 남겨 주세요. ## 사내 계정으로 로그인 통합하기 SAML 2.0 기반 SSO로 사내 인증 체계와 로그인을 통합해요. Okta, Azure AD(Microsoft Entra ID), Google Workspace 같은 IdP와 연동하면 구성원이 회사 계정 하나로 티로에 로그인해요. * **SSO (SAML 2.0)**: 회사 계정으로 통합 로그인하고, IdP 정책에 맞춰 권한이 동기화돼요. SSO 전용 운영으로 다른 로그인 방법을 차단할 수도 있어요. * **SCIM 프로비저닝**: IdP와 사용자를 자동 동기화해요. 입·퇴사가 반영되면 티로 계정도 자동으로 생성·정리돼요. * **MFA(다중 인증)**: OTP·인증 앱·하드웨어 키로 계정 보안을 강화해요. 설정 방법과 폐쇄망 지원은 [조직 보안 설정](/ko/guide/privacy/enterprise-security)을 참고하세요. ## 접근을 통제하기 조직 정책에 맞춰 누가, 어디서, 어떤 기기로 접근하는지 제한해요. * **접근 IP 제한**: 허용한 IP 대역에서만 접근할 수 있어요. 사무실이나 VPN을 거친 접속만 허용하는 구성이에요. * **세션·디바이스 통제**: 세션 만료 시간, 동시 접속 제한, 디바이스 등록 제한을 정책으로 설정해요. * **모바일 캡처 방지**: 모바일 앱에서 화면 캡처를 차단하고 시도 기록을 남겨요. ## 공유와 개인정보를 보호하기 노트가 조직 밖으로 새지 않도록 공유 범위와 개인정보를 정책으로 관리해요. * **외부 공유 제한**: 허용한 회사 도메인으로만 공유를 열 수 있고, 공유 범위 상한과 유효기간을 정책으로 정해요. 공유 중인 링크는 한곳에서 회수해요. 자세한 동작은 [링크 공유 보안](/ko/guide/sharing/link-security)을 참고하세요. * **개인정보 마스킹**: 새로 만드는 노트에서 주민등록번호·전화번호·계좌번호 같은 민감 정보를 자동으로 가려요. 콜센터처럼 개인정보가 자주 등장하는 환경을 위한 옵션이에요. ## 여러 워크스페이스를 한곳에서 관리하기 조직이 여러 워크스페이스로 나뉘어 있어도 한곳에서 정책을 통제해요. * **사용 현황 대시보드**: 조직과 팀별 사용 현황을 한눈에 봐요. * **정책 일괄 적용**: 데이터 보관 기간, 외부 공유 도메인, 세션 만료 같은 설정을 조직 단위로 일괄 적용해요. 워크스페이스마다 따로 손볼 필요가 없어요. 조직 안에서의 역할과 권한은 [역할과 권한](/ko/guide/workspace/roles)을 참고하세요. ## 데이터를 규정에 맞게 다루기 데이터의 저장·보관·삭제를 조직의 컴플라이언스 요건에 맞춰 설정해요. * **데이터 보존 정책**: 도메인 단위로 보관 기간(예: 90일·180일·1년)을 정하고, 기간이 지나면 자동으로 삭제해요. * **완전 삭제와 삭제 증빙**: 회원 탈퇴나 삭제 요청 시 데이터를 복구 불가능한 상태로 제거하고, 요청부터 완료까지를 감사 로그로 남겨 증빙(JSON·PDF)을 발급해요. * **감사 로그**: 사용자·관리자 활동 이력을 보관하고(보관 기간 커스터마이즈 가능), CSV·JSON 내보내기나 SIEM 연동(Splunk, Datadog, Sumo Logic, Elastic 등)으로 자사 보안 모니터링에 직접 통합해요. * **벤더 라우팅 화이트리스트**: 사용할 LLM·STT 벤더를 직접 고르고, 한국 리전 한정 라우팅처럼 데이터 주권 요건에 맞춰 구성해요. * **전용 클라우드**: 물리적으로 분리된 전용 환경과 추가 보안 옵션을 협의할 수 있어요. 기본 데이터 저장·보안(AWS 서울 리전 저장, 저장 데이터 암호화, AI 학습 미사용)은 전 플랜 공통이에요. [개인정보 보호 및 보안](/ko/guide/privacy/overview)을 참고하세요. ## 사내 시스템과 연동하기 티로를 사내 워크플로에 연결하는 연동 옵션을 제공해요. * **전용 API와 Webhook**: 노트·전사·요약 데이터를 사내 시스템으로 가져가거나, 조직 요건에 맞춘 맞춤 연동을 구성해요. * **공용 로그인 도메인**: 사내 공용 도메인으로 로그인을 운영해요. 연동을 직접 붙이려면 [API 개요](/ko/developers/fundamentals/api-overview), [MCP 개요](/ko/developers/mcp/mcp-overview), [Webhook 개요](/ko/developers/webhooks/webhooks-overview)를 참고하세요. ## 도입과 지원 * **맞춤형 온보딩과 핫라인**: 전담 핫라인으로 맞춤 온보딩 세션을 지원하고, 보안 관련 추가 요청에 즉시 응대해요. * **서비스 수준 약정(SLA)**: 월 99.9% 가용성을 적용하고, 미달 시 서비스 크레딧을 제공해요. ## 자주 묻는 질문 ### 엔터프라이즈 플랜은 어떻게 시작하나요? 엔터프라이즈는 카드로 바로 구독하는 플랜이 아니라 상담 기반 플랜이에요. [도입 문의 양식](https://relate.so/forms/yr14ayb1s9zdkuru)이나 [partners@theplato.io](mailto:partners@theplato.io) 로 연락하면, 영업팀이 조직의 보안·운영 요구사항을 확인하고 맞춤 구성을 함께 설계해요. ### 팀 플랜과 엔터프라이즈 플랜은 어떻게 다른가요? 팀 플랜은 결제 카드로 바로 구독해 쓰는 셀프서비스 플랜이고, 엔터프라이즈는 SSO·보안 정책·맞춤 연동이 필요한 조직을 위한 상담 기반 플랜이에요. 두 플랜 비교는 [티로 요금제](/ko/guide/workspace/plans)를 참고하세요. ### 모든 보안 기능을 다 켜야 하나요? 아니요. 필요한 기능만 골라 쓸 수 있어요. 도입 과정에서 조직의 요구사항을 확인하고 필요한 옵션만 구성해요. ### 보안 검토 자료를 받을 수 있나요? 예, 가능해요. 티로는 ISO/IEC 27001:2022 인증을 취득했고 SOC 2 Type 1·Type 2 심사를 모두 완료했어요. 감사 보고서와 데이터 위치, 하위 처리자 목록 같은 보안 검토 자료는 NDA 체결 후 제공돼요. 자세한 인증 현황은 [신뢰 센터](https://trust.tiro.ooo)에서 확인하거나 영업팀에 문의해 주세요. *** **관련 페이지**: [조직 보안 설정](/ko/guide/privacy/enterprise-security) · [링크 공유 보안](/ko/guide/sharing/link-security) · [티로 요금제](/ko/guide/workspace/plans) · [개인정보 보호 및 보안](/ko/guide/privacy/overview) # 무료 체험 Source: https://docs.tiro.ooo/ko/guide/workspace/free-trial 가입 즉시 3주간 사용할 수 있는 300분의 무료 체험이 시작돼요. 결제 수단 등록 없이 전 기능을 써볼 수 있어요. ## 티로 무료 체험 안내 티로에 처음 가입하시면 자동으로 워크스페이스 하나가 만들어져요. 이 워크스페이스에 **3주 동안 사용할 수 있는 총 300분**의 사용량을 제공해드려요. 이 사용량은 실시간 녹음과 오프라인 모드, 음성파일 업로드에 모두 함께 차감돼요. 무료체험 크레딧은 매월 갱신되지 않고, 계정당 최초 1회만 지급되며, 추가로 만든 워크스페이스에는 적용되지 않습니다. 무료체험은 **총 300분을 모두 사용하거나, 가입 후 3주가 지나면 종료**돼요. 둘 중 먼저 도달하는 시점에 종료되며, 3주가 지나면 사용량이 남아 있어도 더 이상 사용할 수 없어요. 결제 수단을 미리 등록할 필요가 없고, 체험이 끝나도 자동으로 유료 전환되지 않으니 안심하고 써보세요. ## 무료체험 크레딧 소진 시 무료체험용 크레딧이 모두 소진되면 새 노트를 만들 수 없어요. 녹음 중 시간이 소진되면 녹음이 일시정지되고, 음성파일 업로드의 경우 스크립트가 일부만 변환될 수 있으니 참고해주세요. 서비스를 계속 사용하시려면 플랜 구독이 필요해요. [티로 요금제](/ko/guide/workspace/plans)와 [구독 관리](/ko/guide/workspace/billing-guide)에서 자세한 내용을 확인하실 수 있어요. **무료체험 크레딧이 모두 소진되어도 이전 기록을 볼 수 있어요.** 무료체험이 종료된 후에도 기존 노트를 조회, 수정, 공유할 수 있어요. 티로는 대화를 기록한 노트가 소중한 자산이라는 사실을 인지하고 있어요. 새로운 노트 생성만 불가할 뿐, 나머지 기능은 모두 사용하실 수 있습니다. ## 노트 열람 & 기록 제한 무료체험 시, 한 노트당 50분으로 열람이 제한되며, 최대 120분까지 기록하실 수 있습니다. * **50분이 지나면**: 노트가 계속 기록되고 있지만, 내용은 **일시적으로 블러 처리되어 열람이 제한**됩니다. 노트는 정상적으로 기록되고 있어요. 플랜 업그레이드 후에는 전문을 온전히 보실 수 있습니다. 오류가 아니니 당황하지 마세요. * **120분을 초과하면**: 녹음이 자동으로 중단되며, 이후 플랜을 업그레이드하시더라도 **중단 시점 이후의 내용은 복구되지 않습니다.** 더 긴 회의를 기록하고 싶다면 플랜 업그레이드 후 새 노트로 기록을 시작해주세요. 유료 플랜으로 업그레이드하면 한 노트당 최대 **5시간**(300분)까지 기록할 수 있고, 50분 블러 제한도 사라져요. ## 무료체험 중인 워크스페이스에 구성원 초대하기 무료체험 중인 워크스페이스에 구성원을 초대하면, 초대한 구성원과 함께 **인당 300분**의 무료체험을 누릴 수 있어요. 체험 기간은 워크스페이스가 만들어진 시점 기준으로 동일하게 적용돼요. ## 자주 묻는 질문 ### 새 워크스페이스를 만들면 무료체험 300분을 또 받나요? 아니요, 무료체험은 계정당 최초 1회만 제공돼요. 가입 후 새 워크스페이스를 추가로 만들어도 무료체험 사용량은 다시 지급되지 않아요. ### 구성원마다 300분을 따로 받나요? 네, 무료체험 중인 워크스페이스에 초대된 구성원은 각자 300분의 무료체험 사용량을 받아요. ### 무료체험이 끝난 뒤 결제하면 블러됐던 내용을 볼 수 있나요? 50분이 넘어 블러 처리됐던 노트는 플랜 업그레이드 후 전문을 다시 볼 수 있어요. 다만 120분을 초과해 녹음이 자동 중단된 경우, 중단 이후의 내용은 결제 후에도 복구되지 않아요. *** **관련 페이지**: [티로 요금제](/ko/guide/workspace/plans) · [크레딧](/ko/guide/workspace/credits) · [구독 관리](/ko/guide/workspace/billing-guide) # 워크스페이스 Source: https://docs.tiro.ooo/ko/guide/workspace/overview 워크스페이스는 노트, 폴더, 구성원, 결제가 한곳에 모이는 공간이에요. 혼자 쓰다가 구성원을 초대하면 그대로 팀 공간이 돼요. ## 워크스페이스란? 워크스페이스는 내가 작성한 노트와 폴더, 함께 일하는 구성원이 한곳에 모여 있는 공간이에요. 하나의 티로 계정으로 여러 워크스페이스에 동시에 속할 수 있고, 좌측 사이드바 상단의 워크스페이스 이름을 눌러 자유롭게 오갈 수 있어요. 혼자 쓰는 워크스페이스와 함께 쓰는 워크스페이스가 개념적으로 다르지 않아요. 구성원이 1명이면 개인 플랜(Lite·Pro·Max)을, 2명 이상이면 팀·엔터프라이즈 플랜을 사용해요. * **개인 폴더**: 나만 볼 수 있는 폴더예요. 폴더를 지정하지 않고 만든 노트는 자동으로 개인 폴더에 속해요. * **팀 폴더**: 권한을 받은 구성원에게 자동으로 공유되는 폴더예요. 자세한 내용은 [폴더](/ko/guide/sharing/folders)를 참고하세요. * **워크스페이스 단어장·템플릿**: 워크스페이스 안의 모두가 함께 써요. 계정 단위로 따라다니는 정보(프로필, 개인 단어장 등)는 [계정 관리 가이드](/ko/guide/account/overview)를 참고하세요. ## 새 워크스페이스 만들기 사이드바 상단의 워크스페이스 이름을 누르고 **\[새 워크스페이스 추가]** 메뉴를 선택한 뒤 이름을 입력하면 돼요. 새로 만든 워크스페이스는 완전히 새로운 공간이라, 다른 워크스페이스의 구성원이나 노트가 따라 들어오지 않아요. 새 워크스페이스 만들기는 웹·데스크탑에서 할 수 있어요. ## 기존 워크스페이스에 합류하기 운영 중인 워크스페이스에는 그 워크스페이스 Admin의 초대가 있어야 합류할 수 있어요. 받은 초대 이메일에서 수락하거나, 이미 티로를 쓰고 있다면 티로 안에서 바로 수락하면 돼요. 부여되는 역할은 초대한 사람이 정해 둔 대로이고(합류 시점에 바꿀 수 없어요), 역할별 권한 차이는 [구성원 역할](/ko/guide/workspace/roles)에서 확인하세요. ### 이메일로 받은 초대 수락하기 초대받은 이메일 주소로 초대 메일이 도착해요. 메일 안의 버튼을 누르면 초대 페이지가 열려요. * **티로 계정이 있는 경우**: 초대 페이지에서 합류할 워크스페이스 이름을 확인하고 **\[합류하기]** 버튼을 누르면 바로 구성원이 돼요. 지금 합류하지 않으려면 **\[나중에]** 버튼을 누르고 나중에 티로 안에서 다시 수락할 수 있어요. 초대받은 이메일과 지금 로그인한 이메일이 같아야 수락돼요. * **계정이 없는 경우**: 가입 화면으로 이동해 **초대받은 이메일 그대로** 가입하면, 가입이 끝나는 순간 자동으로 합류돼요. 다른 이메일로 가입하면 자동 합류가 동작하지 않아요. 초대 메일이 안 보이면 스팸함을 확인하고, 그래도 없으면 Admin에게 재초대를 요청하세요. Admin은 구성원 목록의 **\[⋯]** → **\[초대 취소]** 후 다시 초대할 수 있어요. 티로 사용자가 직접 만들 수 있는 계정 종류는 Google/Microsoft 밖에 없어요. 이메일로 초대를 받을 땐 먼저 티로 계정을 만들고, 초대를 수락하게 되기 때문에 초대받은 이메일이 Google·Microsoft 계정으로 로그인할 수 없는 주소라면 초대를 수락할 수 없어요. 지원이 필요하면 [hello@theplato.io](mailto:hello@theplato.io)로 문의해주세요. ### 티로 안에서 받은 초대 수락하기 이미 티로를 쓰고 있다면 이메일을 거치지 않고 티로 안에서 바로 받은 초대를 수락할 수 있어요. 이 방법은 웹·데스크탑 앱에서 할 수 있어요. 워크스페이스 전환기 드롭다운. 맨 위에 받은 초대 항목과 개수 배지 1이 있고, 그 아래 내 워크스페이스(선택됨), 새 워크스페이스 추가, 워크스페이스 설정 메뉴가 차례로 있는 화면 받은 초대 팝업. 티로 팀 워크스페이스 초대가 한 건 표시되고, 임은성님이 MEMBER 역할로 초대했다는 설명과 함께 수락·거절 버튼이 나란히 있는 화면 좌측 사이드바 상단의 워크스페이스 이름을 눌러 목록을 펼쳐요. 받은 초대가 있으면 워크스페이스 이름 옆에 받은 초대 개수가 표시돼요. 목록에서 **\[받은 초대]** 메뉴를 누르면 받은 초대 목록이 떠요. 초대마다 워크스페이스 이름, 누가 어떤 역할로 초대했는지, 초대받은 시점이 보여요. 합류할 초대의 **\[수락]** 버튼을 누르면 바로 합류하고, **\[거절]** 버튼을 누르면 합류하지 않아요. ## Admin이 할 수 있는 것 워크스페이스 Admin은 구성원 관리, 결제, 일부 정책 설정을 할 수 있어요. Admin이 여러 명이면 서로 동등한 권한을 가져요. 워크스페이스에 별도의 "소유자"는 없어요. * 구성원 초대·제거·역할 변경 * 구독 시작·변경·해지와 결제 수단 관리 * 워크스페이스 밖으로 노트 이동 허용 여부 설정 * 초대받지 않은 팀 폴더 조회 (폴더 안 노트 내용은 볼 수 없어요) 워크스페이스에는 Admin·Member 외에 **Unpaid admin**(Admin과 같은 관리 권한을 갖지만 결제·기록은 하지 않는 역할)과 **Viewer**(공유받은 노트를 읽기만 하는 역할)도 있어요. 역할별 권한과 시트 과금 차이는 [구성원 역할](/ko/guide/workspace/roles)에서 확인하세요. ### 구성원 초대하기 설정의 **\[멤버]** → **\[멤버 초대]** 버튼에서 이메일과 역할(Admin 또는 Member)을 정해 초대를 보내요. 개인 플랜을 쓰던 1인 워크스페이스에 구성원을 초대하려면 먼저 **\[플랜 관리]** 메뉴에서 팀 플랜으로 전환해야 해요. [티로 요금제](/ko/guide/workspace/plans)를 참고하세요. ### 구성원 제거하기 구성원 목록에서 제거할 구성원 옆 **\[⋯]** → **\[멤버 제거]** 메뉴를 누르세요(Admin 권한 필요). * 제거된 구성원은 워크스페이스에 더 이상 접근할 수 없어요. 노트에 직접 초대받은 노트는 **\[공유받은 노트]** 메뉴에서 계속 볼 수 있어요. * 마지막 Admin 1명은 본인을 제거할 수 없어요. 다른 구성원을 Admin으로 지정한 뒤에 가능해요. ## 워크스페이스 간 노트 이동하기 Admin이 **\[설정]** → **\[워크스페이스]** → 일반에서 노트 이동 허용 토글을 켠 경우에만 이동할 수 있어요. 허용되면 본인이 만든 노트를 노트 우측 상단 **\[⋯]** → **\[다른 워크스페이스로 이동]** 메뉴로 옮길 수 있고, 여러 개를 한 번에 선택해 옮길 수도 있어요. * 이동한 노트는 개인 폴더의 임시 보관함에 표시돼요. * **사용량은 노트를 처음 만든 워크스페이스에 영구 귀속돼요.** 노트를 옮겨도 원래 워크스페이스의 구독에서 계산돼요. * 기록이 진행 중인 노트는 이동할 수 없어요. 기록을 종료한 뒤 옮겨주세요. ## 워크스페이스 떠나기 **\[설정]** → **\[멤버]** 메뉴에서 본인 이름 옆 **\[⋯]** → **\[멤버 제거]** 메뉴로 나갈 수 있어요. 떠난 뒤에는 그 워크스페이스의 노트와 폴더에 접근할 수 없으니, 필요한 노트는 미리 다른 워크스페이스로 옮겨두세요. 본인이 마지막 Admin이라면 떠나기 전에 다른 구성원을 Admin으로 승격해야 해요. ## 자주 묻는 질문 ### 같은 계정으로 워크스페이스를 여러 개 가질 수 있나요? 네, 회사 워크스페이스에 속해 있으면서 개인용 워크스페이스를 따로 만들 수 있어요. 각 워크스페이스는 결제·구성원·노트가 모두 독립적이에요. 단, 엔터프라이즈 Organization에 소속된 회사 계정은 Organization과 분리된 별도 워크스페이스를 만들 수 없어요. ### 구성원을 초대하면 내 기존 노트가 다 공유되나요? 아니요, 개인 폴더의 노트는 다른 구성원에게 보이지 않아요. 팀 폴더에 올려둔 노트만 권한에 따라 공유돼요. 구성원이 들어왔다고 기존 노트가 자동 공개되는 일은 없어요. ### 워크스페이스를 새로 만들면 무료체험을 또 받나요? 아니요, 무료체험은 가입 시 만들어진 기본 워크스페이스에서 1회 제공돼요. 자세한 내용은 [무료 체험](/ko/guide/workspace/free-trial)을 참고하세요. ### 팀 플랜을 쓰고 있었는데 워크스페이스가 두 개 생겼어요. 워크스페이스 개편으로 기존 팀 플랜 사용자에게는 두 공간이 생겼어요. **기본 워크스페이스**에는 팀 가입 전에 만든 개인 노트가, **팀과 공유하는 워크스페이스**에는 팀에서 만든 노트가 모여 있어요. 노트는 자동으로 옮겨지거나 삭제되지 않았고, 접근 권한도 그대로예요. 사이드바 상단에서 두 공간을 오갈 수 있어요. ### 개인 폴더(Private)가 두 군데 있어요. 정상인가요? 네, 워크스페이스마다 개인 폴더가 하나씩 있고 서로 독립적이에요. 합치고 싶다면 노트 이동으로 직접 옮길 수 있어요. ### 기존에 결제 중이던 1인 워크스페이스에 구성원을 초대하면 어떻게 되나요? 웹 결제 중이었다면 **\[플랜 관리]** 메뉴에서 즉시 팀 플랜으로 전환할 수 있고, 전환 시점 기준 일할 계산으로 차액만 결제돼요. 모바일 인앱결제 중이었다면 즉시 전환할 수 없으니, 데스크탑에서 팀 플랜을 시작하고 기존 인앱결제는 스토어에서 해지해 주세요. 자세한 방법은 [구독 관리](/ko/guide/workspace/billing-guide)를 참고하세요. *** **관련 페이지**: [티로 요금제](/ko/guide/workspace/plans) · [폴더](/ko/guide/sharing/folders) · [구독 관리](/ko/guide/workspace/billing-guide) # 티로 요금제 Source: https://docs.tiro.ooo/ko/guide/workspace/plans 개인은 라이트·프로·맥스, 팀은 시트당 결제하는 팀 플랜, 조직은 엔터프라이즈. 연간 결제 시 2개월이 무료예요. ## 플랜 한눈에 보기 개인용은 **라이트·프로·맥스** 세 가지가 있고, 팀·조직용으로는 시트당 결제하는 팀 플랜과 엔터프라이즈가 있어요. 연간 결제하면 2개월이 무료고, 모든 플랜에 가입 시 3주 300분 무료 체험이 따라와요. 아래 표에서 가격·사용량·대상을 한눈에 비교하세요. | 플랜 | 가격 | 사용량 | 이런 분께 | | ---------- | ---------- | -------- | ------------------------------ | | **라이트** | \$7/월 | 월 300분 | 기록이 가끔 필요한 분 | | **프로** | \$13/월 | 월 1,000분 | 매일 기록하는 분 (이전 명칭: 스타터) | | **맥스** | \$29/월 | 무제한 | 하루에도 여러 건 기록하는 분 (이전 명칭: 비즈니스) | | **팀** | \$29/월·계정당 | 무제한 | 2명 이상이 함께 쓰는 워크스페이스 | | **엔터프라이즈** | 별도 문의 | 무제한 | 보안·운영 요구가 있는 조직 | 사용량은 월 단위로 제공되고 1개월이 지날 때마다 초기화돼요. 초기화 시점에 남아 있던 사용량은 다음 달로 이월되지 않고, 매월 플랜의 제공량이 새로 채워져요. 연간 결제도 마찬가지로 1년치 사용량이 한 번에 지급되는 게 아니라 매월 같은 방식으로 갱신돼요. 유료 플랜은 노트당 최대 5시간까지 기록할 수 있어요. ### 남은 사용량과 다음 초기화 시각 확인하기 웹·데스크탑 앱의 좌상단 프로필 → **\[설정]** → **\[플랜 관리]** 메뉴에서 현재 플랜 카드와 사용량 카드를 확인할 수 있어요. 이 카드에는 남은 사용량, 다음 사용량 초기화 시각, 구독 만료일 또는 다음 결제일이 함께 표시돼요. 모바일 앱에서도 **\[설정]** → **\[플랜 관리]** 화면에서 워크스페이스 사용량과 구독 일정을 확인할 수 있어요. 월 제공 시간이 언제 다시 채워지는지 궁금하다면 요금제 표보다 이 화면의 다음 초기화 시각을 먼저 확인하세요. ## 플랜별 제공 기능 가이드 본문에서 Pro+, Team+, Enterprise 배지가 붙은 기능은 해당 플랜부터 사용할 수 있어요. Team+ 배지는 함께 쓰는 워크스페이스에서 진가가 나오는 기능이라는 뜻이에요. | 기능 | 필요 플랜 | 가이드 | | --------------------------- | ------------- | ------------------------------------------------- | | 화자 분리 | | [화자 분리](/ko/guide/recording/diarization) | | 위키 | | [위키](/ko/guide/notes/wiki) | | 팀 폴더 | | [폴더](/ko/guide/sharing/folders) | | 링크 공유 보안 (공유 정책·링크 회수) | | [링크 공유 보안](/ko/guide/sharing/link-security) | | 조직 보안 설정 (SSO·감사 로그·데이터 보존) | | [조직 보안 설정](/ko/guide/privacy/enterprise-security) | ## 개인 플랜 (라이트·프로·맥스) 1인 워크스페이스에서 쓰는 플랜이에요. * **라이트 (\$7/월)**: 월 300분 사용량, 노트당 60분 제한 해제, 고품질 한 페이지 문서, 노트 기록 기반의 무제한 AI 채팅, 나만의 템플릿 요약 * **프로 (\$13/월)**: 월 1,000분 사용량, 라이트 플랜의 모든 기능, **화자 분리 지원** * **맥스 (\$29/월)**: 매일 써도 걱정 없는 무제한 사용량, 프로 플랜의 모든 기능 기존 스타터/비즈니스 플랜은 프로/맥스로 이름이 변경되었고 기능과 가격은 동일해요. ## 팀 플랜 팀 플랜은 워크스페이스에 구성원이 2명 이상일 때 사용하는 플랜이에요. 함께 쓰는 워크스페이스에서 노트를 만들려면 팀 플랜으로 전환해야 해요. 가격은 시트 수에 비례해 청구되고, 시트는 Admin·Member 권한을 가진 사람 수로 계산해요(Viewer·Unpaid admin은 과금되지 않아요). * **월 결제**: 시트당 \$29 * **연간 결제**: 시트당 \$290 (월 환산 약 \$24.17) 팀 플랜에 포함되는 것: * **개인용 맥스 플랜의 모든 기능** (무제한 사용량) * **워크스페이스 단위 결제**: 어드민 한 명이 전체 구독을 통합 관리해요. 회사 카드 하나로 정산이 끝나요 * **팀 폴더**: 폴더 권한만 설정하면 그 안의 노트가 구성원끼리 자동 공유돼요 * **워크스페이스 단어장**: 회사 약어·제품명·인명을 등록하면 모든 구성원의 기록에서 인식 정확도가 올라가요 * **워크스페이스 템플릿**: 회의록·인터뷰 양식을 통일해 누가 정리하든 같은 구조로 쌓여요 * **계정별 사용량 대시보드**와 구성원 관리 ### 시트는 누구만큼 청구되나요? 시트는 **Admin과 Member 수만큼** 청구돼요. 노트를 만들고 기록하려면 유료 시트를 차지하기 때문이에요. Unpaid admin과 Viewer는 시트를 차지하지 않아 과금되지 않아요. 워크스페이스 구성원은 Admin·Unpaid admin·Member·Viewer 네 역할 중 하나를 갖고, 역할별 권한과 과금 차이는 [구성원 역할](/ko/guide/workspace/roles)에서 확인하세요. ### 팀 플랜 시작하기 팀 플랜은 어드민 한 명이 **워크스페이스 단위로 구독 하나를 결제**하고, 그 안에 구성원을 초대해 채우는 방식이에요. 구성원이 각자 따로 결제한 뒤 서로를 연결하는 방식이 아니에요. 시트도 어드민이 개수를 미리 사두는 게 아니라, 워크스페이스의 Admin·Member 인원수에 맞춰 자동으로 청구돼요. 첫 결제 화면에 시트 수량 선택 단계가 없어도 정상이에요. 팀 플랜은 "3 seats를 먼저 구매"하는 방식이 아니라, 워크스페이스에서 실제로 유료 역할(Admin·Member)을 가진 사람 수를 기준으로 청구돼요. 시작하는 방법은 워크스페이스의 현재 상태에 따라 두 가지로 나뉘어요. 구성원을 먼저 초대한 다음 팀 플랜으로 전환하면, 전환 시점에 워크스페이스에 있는 Admin·Member 시트 수만큼 한 번에 결제돼요. 개인 플랜 상태에서는 구성원 초대가 막혀 있어요. 팀 플랜으로 먼저 전환한 뒤 구성원을 초대하면, 초대를 수락할 때마다 시트가 즉시 추가되고 남은 기간 요금이 일할 계산(proration)되어 다음 결제일 청구서에 합산돼요. 두 경우 모두 다음은 동일해요. * 기존 노트와 폴더는 워크스페이스에 그대로 남아요. 자동으로 옮겨지거나 삭제되지 않아요. * 팀 플랜 결제는 웹·데스크탑 앱에서 진행해요. 모바일 인앱 결제는 1인 워크스페이스의 개인 플랜만 지원해요. * 구성원이 2명 이상인데 팀 플랜이 없으면 새 노트 생성과 녹음 시작이 제한되고, 구독 화면으로 안내돼요. ## 엔터프라이즈 플랜 많은 구성원과 복잡한 보안·운영 환경을 가진 조직을 위한 맞춤형 플랜이에요. * 팀 플랜의 모든 기능 * 기업 내부 규정에 따른 추가 보안 옵션 (SSO, 감사 로그, 데이터 보존 정책은 [조직 보안 설정](/ko/guide/privacy/enterprise-security), 공유 링크 정책은 [링크 공유 보안](/ko/guide/sharing/link-security) 참고) * 사내 시스템 연동을 위한 전용 API 및 Webhook, 공용 로그인 도메인 지원 * 맞춤형 온보딩 세션과 핫라인 엔터프라이즈로 할 수 있는 모든 것은 [엔터프라이즈 플랜](/ko/guide/workspace/enterprise)에서 한눈에 살펴보세요. 도입 문의는 [문의 양식](https://relate.so/forms/yr14ayb1s9zdkuru)이나 [partners@theplato.io](mailto:partners@theplato.io) 로 보내주세요. ## 연간 결제 혜택 연간 결제 시 2개월 무료 혜택이 적용돼요. 10개월치 가격으로 12개월을 사용해요. * 라이트 \$70/년 · 프로 \$130/년 · 맥스 \$290/년 · 팀 시트당 \$290/년 연간 결제는 웹이나 데스크탑 앱에서 가능해요. ## 결제 방법 좌상단 프로필 → **\[설정]** → **\[플랜 관리]** 메뉴에서 원하는 플랜과 결제 주기를 선택하고 시작하세요. 결제는 Stripe로 안전하게 처리돼요. 비즈니스 사용자는 결제 화면에서 "비즈니스 목적으로 구매합니다"를 체크하고 사업자등록번호를 입력하면 VAT 10%가 면제돼요. App Store(iOS)·Google Play(Android)에서도 결제할 수 있지만, 플랫폼 수수료 때문에 웹·데스크탑보다 비싸요. 더 저렴하게 이용하려면 웹·데스크탑 결제를 추천해요. 인앱결제는 개인 워크스페이스가 하나일 때 사용할 수 있어요. 무료 체험이 끝나도 자동으로 유료 플랜으로 전환되지 않으니, 원하는 시점에 직접 구독을 시작하면 돼요. ## 추가 기록(종량제)으로 한도 넘겨 기록하기 플랜의 기본 제공 시간을 다 써도 **추가 기록**을 켜면 회의 기록을 멈추지 않고 이어갈 수 있어요. 월 제공 시간을 초과한 기록은 **분당 \$0.025**로 청구되는 종량제예요. 개인 플랜(라이트·프로·맥스)과 팀 플랜 모두에서 켤 수 있어요. 워크스페이스 Admin이 **\[설정]** → **\[워크스페이스]** 화면의 "기록 정책" 섹션에서 **\[추가 기록]** 토글을 켜요. 켜 두면 기본 제공 시간을 초과해도 기록이 자동으로 이어지고, 초과한 분만 종량제로 청구돼요. 추가 기록을 켜려면 다음 조건이 필요해요. * **Stripe 결제**: 웹·데스크탑에서 Stripe로 결제하는 워크스페이스에서만 켤 수 있어요. App Store·Google Play 인앱결제로 구독 중이면 **\[추가 기록]** 토글이 보이지 않아요. * **Admin 권한**: **\[추가 기록]** 토글은 Admin(과 Unpaid admin)에게만 보이고, 이들만 켜고 끌 수 있어요. Member·Viewer에게는 표시되지 않아요. * **등록된 결제 수단**: 결제 수단이 없으면 토글이 비활성화되고 "추가 기록을 켜려면 먼저 결제수단을 등록해 주세요" 안내가 나와요. 결제 수단을 등록한 뒤 다시 켜면 돼요. 맥스·팀처럼 사용량이 무제한인 플랜은 월 제공 시간을 초과할 일이 없어 추가 기록으로 청구되는 금액이 발생하지 않아요. 월 제공 시간이 정해진 라이트·프로 플랜에서 한도를 넘길 때 종량제가 작동해요. ## 자주 묻는 질문 ### 개인 플랜에서도 추가 기록(종량제)을 켤 수 있나요? 네, 추가 기록은 팀 플랜 전용이 아니에요. 라이트·프로·맥스 개인 플랜에서도 Stripe로 결제 중이고 본인이 Admin이라면 **\[설정]** → **\[워크스페이스]** 화면의 "기록 정책" 섹션에서 켤 수 있어요. App Store·Google Play 인앱결제로 구독 중이면 켤 수 없어요. 초과한 기록은 분당 \$0.025로 청구돼요. ### 팀원이 도중에 들어오거나 나가면 결제가 어떻게 바뀌나요? 유료 역할(Admin·Member)이 늘어나면 시트가 즉시 추가돼요. 추가한 날부터 현재 결제 주기 종료일까지의 금액은 일할 계산(proration)되어 다음 결제일 청구서에 합산돼요. 유료 역할이 줄어들면 현재 결제 주기에는 기존 시트 수와 요금이 유지되고, 줄어든 시트 수는 다음 갱신일부터 적용돼요. 결제 주기 중간에 시트를 줄여도 당월 요금은 환불되지 않아요. ### 팀 플랜은 처음부터 3 seats를 한 번에 결제해야 하나요? 아니요. 팀 플랜의 첫 결제 화면에서 시트 수량을 미리 선택하지 않아도 돼요. 티로는 워크스페이스의 Admin·Member 인원수를 기준으로 시트를 계산하고, 구성원이 초대를 수락하거나 역할이 바뀌어 유료 역할이 늘어나면 남은 기간 요금을 일할 계산해서 반영해요. Viewer와 Unpaid admin은 시트를 차지하지 않아요. ### 팀 플랜과 엔터프라이즈 플랜은 어떻게 다른가요? 팀 플랜은 결제 카드로 바로 구독해 쓰는 셀프서비스 플랜이고, 엔터프라이즈는 SSO·보안 정책·맞춤 연동이 필요한 조직을 위한 상담 기반 플랜이에요. 도입 문의는 [partners@theplato.io](mailto:partners@theplato.io) 로 보내주세요. ### 이번 달에 다 쓰지 못한 사용량은 다음 달로 이월되나요? 아니요, 미사용 사용량은 이월되지 않아요. 사용량은 구독 시작 시점을 기준으로 매월 플랜 제공량(예: 프로 1,000분)이 새로 채워지는 방식이라, 전월에 남은 시간이 더해지지 않아요. 연간 결제 중이어도 동일하게 매월 갱신돼요. 다음 초기화 시각은 **\[설정]** → **\[플랜 관리]** 화면에서 확인할 수 있어요. ### 플랜을 바꾸면 언제부터 적용되나요? 업그레이드는 즉시 적용되고 차액이 일할 계산으로 청구돼요. 자세한 플랜 변경·해지 방법은 [구독 관리](/ko/guide/workspace/billing-guide)를 참고하세요. *** **관련 페이지**: [무료 체험](/ko/guide/workspace/free-trial) · [구독 관리](/ko/guide/workspace/billing-guide) · [워크스페이스](/ko/guide/workspace/overview) # 워크스페이스 구성원 역할 Source: https://docs.tiro.ooo/ko/guide/workspace/roles 워크스페이스 구성원은 Admin·Unpaid admin·Member·Viewer 네 역할 중 하나를 가져요. 역할에 따라 관리·기록 권한과 시트 과금 여부가 달라져요. 역할 구분은 구성원이 2명 이상인 워크스페이스(팀·엔터프라이즈 플랜)에서 적용돼요. 혼자 쓰는 1인 워크스페이스에는 역할이 없어요. ## 워크스페이스 구성원은 어떤 역할이 있나요? 워크스페이스 구성원은 **Admin**, **Unpaid admin**, **Member**, **Viewer** 네 역할 중 하나를 가져요. 역할에 따라 구성원·설정 관리, 결제 관리, 노트 생성·기록 권한과 시트 과금 여부가 달라져요. | 권한 | Admin | Unpaid admin | Member | Viewer | | --------- | :------------: | :------------: | :------------: | :------------: | | 구성원·설정 관리 | | | | | | 결제 관리 | | | | | | 노트 생성·기록 | | | | | | 노트 읽기 | | | | | | 시트 과금 | 과금 | 무과금 | 과금 | 무과금 | * **Admin**은 구성원 초대·제거·역할 변경, 구독·결제, 워크스페이스 설정을 모두 할 수 있어요. Admin이 여러 명이면 서로 동등한 권한을 갖고, 별도의 "소유자"는 없어요. * **Unpaid admin**은 Admin과 같은 구성원 관리·설정 권한을 갖지만 결제는 관리하지 않아요. 직접 기록을 시작할 수는 없고 추가 기록 설정만 관리할 수 있어요. 유료 시트를 차지하지 않아 과금되지 않아요. * **Member**는 노트를 만들고 기록하며 함께 협업해요. 구성원 관리나 결제 권한은 없어요. * **Viewer**는 공유받은 노트를 읽기만 할 수 있어요. 노트를 만들거나 기록을 시작할 수 없고, 과금되지 않아요. ## 각 역할은 과금되나요? 시트는 **Admin과 Member 수만큼** 청구돼요. 노트를 만들고 기록하려면 유료 시트를 차지하기 때문이에요. Unpaid admin과 Viewer는 시트를 차지하지 않아 과금되지 않아요. * **과금되는 역할**: Admin, Member (각 시트당 월 \$29, 연간 결제 시 시트당 \$290) * **과금되지 않는 역할**: Unpaid admin, Viewer 시트 추가·제거 시점의 일할 계산(proration)과 결제 주기 등 요금 정책은 [티로 요금제](/ko/guide/workspace/plans)에서 확인하세요. ## 역할은 어떻게 정하고 바꾸나요? 구성원을 초대할 때 Admin 또는 Member 역할을 정해 보내고, 합류한 뒤에는 Admin이 역할을 바꿀 수 있어요. 초대·제거·역할 변경 방법은 [워크스페이스](/ko/guide/workspace/overview)의 "Admin이 할 수 있는 것"에서 확인하세요. 마지막 Admin 1명은 본인을 제거하거나 워크스페이스를 떠날 수 없어요. 다른 구성원을 Admin으로 먼저 지정한 뒤에 가능해요. ## 폴더 권한과 워크스페이스 역할은 뭐가 다른가요? 폴더 단위로 따로 설정하는 권한(읽기 전용·편집자·만든 사람)은 워크스페이스 역할과 별개예요. 워크스페이스 역할은 워크스페이스 전체에서 할 수 있는 일을 정하고, 폴더 권한은 특정 팀 폴더 안에서만 적용돼요. 예를 들어 워크스페이스 Member라도 어떤 팀 폴더에서는 읽기 전용일 수 있어요. 폴더 권한은 [폴더](/ko/guide/sharing/folders)에서 확인하세요. ## 자주 묻는 질문 ### Admin과 Unpaid admin은 뭐가 다른가요? 둘 다 구성원 관리와 워크스페이스 설정 권한은 같아요. 차이는 두 가지예요. Admin만 구독·결제를 관리하고 직접 기록을 시작할 수 있어요. Unpaid admin은 결제를 관리하지 않고 직접 기록할 수도 없는 대신, 유료 시트를 차지하지 않아 과금되지 않아요. 결제는 다른 Admin이 맡고 운영만 돕는 관리자에게 알맞은 역할이에요. ### Viewer나 Unpaid admin도 요금이 청구되나요? 아니요. 시트는 Admin과 Member 수만큼만 청구돼요. Viewer와 Unpaid admin은 시트를 차지하지 않아 무과금이에요. 노트를 읽기만 하거나 관리 업무만 맡는 사람을 과금 없이 워크스페이스에 둘 수 있어요. ### Viewer는 노트를 전혀 못 만드나요? 워크스페이스에서는 노트를 만들거나 기록을 시작할 수 없어요. 공유받은 노트를 읽는 것만 가능해요. 노트를 만들어야 한다면 Admin에게 Member로 역할을 바꿔달라고 요청하세요. *** **관련 페이지**: [워크스페이스](/ko/guide/workspace/overview) · [티로 요금제](/ko/guide/workspace/plans) · [폴더](/ko/guide/sharing/folders) # 인앱 결제에서 웹 결제로 바꾸기 Source: https://docs.tiro.ooo/ko/guide/workspace/switch-to-web-billing App Store·Google Play 인앱 결제를 티로 웹 카드 결제로 바꾸는 방법이에요. Google Play는 웹에서 결제만 하면 기존 구독이 자동으로 해지·환불되고, App Store는 스토어 구독 해지만 직접 해주시면 돼요. **인앱 결제(App Store·Google Play)를 쓰고 계셔도, 구독을 끊지 않고 웹 카드 결제로 바꿀 수 있어요.** 노트·워크스페이스·플랜은 그대로고, 바꾸는 동안 티로가 멈추는 시간도 없어요. 웹 결제는 스토어 수수료가 없어서 같은 플랜이 **최대 10% 저렴**해요. 전환 절차는 결제하고 계신 스토어에 따라 달라요. 아래 두 섹션 중 본인 스토어에 해당하는 쪽만 읽으시면 돼요. * **Google Play(안드로이드)**: 웹에서 새 플랜을 결제하면 끝이에요. 기존 인앱 구독은 자동으로 해지되고, 최근 결제분은 전액 환불돼요. → [Google Play에서 결제 중이라면](#google-play에서-결제-중이라면) * **App Store(iOS)**: 웹에서 결제한 뒤, App Store 구독의 자동갱신을 직접 해지하셔야 해요. → [App Store에서 결제 중이라면](#app-store에서-결제-중이라면) ## Google Play에서 결제 중이라면 **웹에서 새 플랜을 결제하시면 나머지는 자동이에요.** 결제가 완료되면 티로가 기존 Google Play 구독을 즉시 해지하고, 최근 결제하신 금액을 스토어에서 전액 환불해드려요. Google Play에 들어가서 직접 해지하실 필요가 없어요. 티로 웹사이트([tiro.ooo](https://tiro.ooo))에 로그인하고, 좌측 하단 프로필을 클릭한 뒤 **\[설정]** → **\[플랜 관리]** 로 이동해 주세요. 플랜 사용량 카드 아래에 **\[인앱 결제 사용 중]** 안내 카드가 있어요. 카드 안의 **\[결제 수단 변경하기]** 를 눌러 주세요. 개인 또는 팀 & 기업 탭에서 원하는 플랜을 고르고, 월간·연간 주기를 선택해 주세요. 요약 박스에서 오늘 결제 금액을 확인하실 수 있어요. 결제 페이지로 이동하면 카드 정보를 입력하고 결제를 완료해 주세요. 프로모션 코드가 있으시면 이 화면에서 적용하실 수 있어요. 여기까지 하시면 끝이에요. 기존 인앱 구독의 해지와 환불은 티로가 스토어 쪽에서 처리하고, 처리가 끝나면 이메일로 알려드려요. ### 기존에 결제한 금액은 어떻게 되나요? **최근 결제분이 Google Play에서 전액 환불돼요.** 환불이 정산의 전부라서, 첫 결제 금액에서 차감되거나 크레딧으로 남는 금액은 없어요. 새 플랜 요금은 웹에서 결제되고, 스토어에 내셨던 금액은 결제하셨던 수단으로 돌아와요. ## App Store에서 결제 중이라면 **웹에서 새 플랜을 결제한 뒤, App Store 구독의 자동갱신을 직접 해지해 주세요.** Apple 정책상 티로가 App Store 구독을 대신 해지해드릴 수 없어요. 대신 이미 결제하신 잔여 기간은 버려지지 않고, 웹 첫 결제 금액에서 그만큼 차감돼요. 티로 웹사이트([tiro.ooo](https://tiro.ooo))에 로그인하고, 좌측 하단 프로필을 클릭한 뒤 **\[설정]** → **\[플랜 관리]** 로 이동해 주세요. 플랜 사용량 카드 아래에 **\[인앱 결제 사용 중]** 안내 카드가 있어요. 카드 안의 **\[결제 수단 변경하기]** 를 눌러 주세요. 개인 또는 팀 & 기업 탭에서 원하는 플랜을 고르고, 월간·연간 주기를 선택해 주세요. 요약 박스에서 이미 결제한 기간의 차감액과 오늘 결제 금액을 확인하실 수 있어요. 결제 페이지로 이동하면 카드 정보를 입력하고 결제를 완료해 주세요. 프로모션 코드가 있으시면 이 화면에서 적용하실 수 있어요. 결제가 끝나면 완료 안내가 뜨고, 이어서 App Store 구독 해지 방법을 안내해드려요. **이 단계를 꼭 마무리해 주세요.** 해지하지 않으면 App Store에서 요금이 계속 청구돼요. ### 이미 결제한 기간은 어떻게 되나요? **같은 기간을 두 번 내지 않아요.** App Store에 이미 결제하신 잔여 기간만큼 웹 첫 결제 금액에서 차감돼요. 결제 화면 요약의 **이미 결제한 N일치 차감** 행에서 차감액을 미리 확인하실 수 있어요. 여기서 말하는 차감은 요금(금액) 정산이에요. 녹음 시간으로 쓰는 [크레딧](/ko/guide/workspace/credits)과는 다른 개념이에요. ### App Store 구독 해지 방법 오른쪽 위 계정 아이콘을 눌러 주세요. 계정 화면에서 **\[구독]** 을 눌러 주세요. 목록에서 티로 구독을 찾아 눌러 주세요. 자동갱신이 꺼지면 다음 결제일부터 청구되지 않아요. 해지가 확인되면 이메일로 알려드리고, 플랜 관리 화면의 안내도 사라져요. 확인까지는 최대 하루 걸릴 수 있어요. 해지가 확인되기 전까지는 3일마다 리마인더 메일을 보내드리고, 확인되면 자동으로 멈춰요. ### 해지하지 않으면 어떻게 되나요? **App Store에서 요금이 계속 청구돼요.** 티로 구독은 이미 웹 결제로 넘어와 있어서, 스토어 결제는 티로 이용과 무관한 중복 청구가 돼요. 이 경우 플랜 관리 화면 위쪽에 **\[중복 결제가 발생하고 있어요]** 배너와 **\[해결가이드]** 버튼이 나타나요. 해결 순서는 두 가지예요. 위 [App Store 구독 해지 방법](#app-store-구독-해지-방법) 단계를 따라 자동갱신을 꺼 주세요. 해지해도 티로 구독은 그대로 유지돼요. App Store 결제는 Apple이 직접 처리해서 **티로가 대신 환불해드릴 수 없어요.** [reportaproblem.apple.com](https://reportaproblem.apple.com)에서 요청해 주세요. 보통 며칠 안에 처리돼요. ### 이미 해지했는데 안내가 계속 보여요 플랜 관리 화면의 **\[해지 확인 요청]** 을 눌러 주세요. App Store 상태를 다시 확인해서 안내를 정리해드려요. 확인까지 최대 하루 걸릴 수 있고, 확인이 끝나면 이메일로 알려드려요. ## 무엇이 바뀌고 무엇이 그대로인가요? 바뀌는 것은 결제 수단과 청구 경로, 그리고 결제 주기예요. 구독 자체는 어느 스토어든 그대로 이어져요. | 그대로인 것 | 바뀌는 것 | | ------------------------- | ------------------------------------------ | | 티로 구독과 지금 쓰시는 플랜 | 요금 청구처: 스토어 → 티로에 등록한 카드 | | 노트·워크스페이스·팀원 등 모든 데이터 | 결제 수단 관리 위치: 스토어 계정 → 티로 | | 이용 중단 없음 (바꾸는 동안에도 계속 사용) | 인보이스: 매달 발행·PDF 다운로드 가능 | | 플랜의 월 제공량 (한도는 그대로) | 결제 주기: 바꾸시는 시점에 새로 시작. 사용량 초기화 날짜도 함께 옮겨져요 | **결제 주기가 바꾸시는 시점에 새로 시작돼요.** 그래서 [사용량 초기화](/ko/guide/workspace/plans#남은-사용량과-다음-초기화-시각-확인하기) 날짜도 그날로 옮겨지고, 이번 주기에 얼마나 쓰셨든 플랜 제공량이 새로 채워져요. 이미 스토어에 내신 금액은 위 스토어별 방식대로 정산되니, 어느 시점에 바꾸셔도 손해가 없어요. 웹 결제로 바꾸시면 인앱 결제에서는 못 하던 것들도 할 수 있어요. * **더 낮은 가격**: 스토어 수수료가 없어서 같은 플랜이 최대 10% 저렴해요. * **현지 통화 결제**: 익숙한 통화로 결제할 수 있어요. * **팀 플랜**: 여러 구성원이 하나의 워크스페이스에서 함께 관리할 수 있어요. * **연간 결제**: 월 결제보다 할인된 연간 요금을 선택할 수 있어요. * **쿠폰**: 프로모션 코드를 결제에 적용할 수 있어요. * **법인카드**: 회사 카드로 결제하고 결제 수단을 웹에서 직접 관리할 수 있어요. 인앱 결제 영수증과 인보이스는 각 스토어 계정에서만 확인할 수 있어요. 티로는 인앱 결제 인보이스를 발행하지 않아요. 웹 결제로 바꾸시면 그때부터 티로에서 인보이스를 받으실 수 있어요. ## 결제하기 전에 변경을 취소하려면 결제를 마치기 전이라면 언제든 되돌릴 수 있어요. 플랜 관리 화면의 **\[결제 수단 변경 중]** 패널에서 **\[변경 취소]** 를 눌러 주세요. * 취소해도 **지금 쓰시는 구독은 그대로 유지**되고, 아무것도 청구되지 않아요. * 스토어 구독도 건드리지 않아요. 자동갱신은 원래대로 이어져요. * 나중에 언제든 다시 시작하실 수 있어요. * 결제 페이지를 그냥 닫고 두셔도 괜찮아요. 결제하지 않은 변경은 하루 정도 뒤에 자동으로 정리돼요. 결제를 이미 마치셨다면 변경 자체는 되돌릴 수 없어요. App Store에서 결제하셨던 경우에는 스토어 구독 해지만 마저 진행해 주세요. ## 자주 묻는 질문 ### 바꾸는 동안 티로를 못 쓰는 시간이 생기나요? 아니요. 결제가 끝나는 즉시 웹 결제 구독으로 넘어가요. 그 전까지는 기존 인앱 구독이 그대로 유효하고, 중간에 이용이 끊기는 구간은 없어요. ### 노트와 워크스페이스는 그대로인가요? 네, 그대로예요. 노트·폴더·팀원·설정은 아무것도 달라지지 않아요. 바꾸시는 시점을 기준으로 새로 시작되는 건 결제 주기와 사용량 초기화 날짜뿐이에요. ### 스토어 구독을 먼저 해지하고 바꿔야 하나요? 아니요. Google Play는 웹에서 결제하시면 자동으로 해지되니 미리 하실 일이 없어요. App Store는 결제를 마친 뒤에 해지하시는 순서를 권해드려요. 이미 스토어에서 해지해 두셨다면, 같은 화면의 **\[구독 재개하기]** 로 만료일을 기다리지 않고 바로 새 플랜을 시작하실 수 있어요. ### \[결제 수단 변경하기] 버튼이 안 보여요 이 기능은 개인 플랜을 인앱 결제로 이용 중인 워크스페이스에서, **워크스페이스의 결제 관리자(Admin)** 에게만 보여요. 무료 체험 중이거나 이미 웹 카드로 결제 중이신 경우, 또는 변경이 이미 진행 중인 경우에도 버튼이 나타나지 않아요. ### 팀 플랜으로 바로 바꿀 수 있나요? 네. 결제 화면의 **\[팀 & 기업]** 탭에서 팀 플랜을 선택하시면 돼요. 인앱 결제로는 팀 플랜을 시작할 수 없지만, 웹 결제로 바꾸시면 가능해요. 팀 플랜은 **계정당** 요금이라, 오늘 결제 금액은 지금 워크스페이스의 시트 수(Admin·Member)만큼 계산돼요. 혼자 쓰는 워크스페이스면 1계정으로 시작하고, 나중에 구성원을 초대하면 그만큼 요금이 늘어나요. 어떤 역할이 시트를 차지하는지는 [역할과 권한](/ko/guide/workspace/roles)에서 확인하실 수 있어요. 청구는 결제 수단을 바꾸신 분(워크스페이스 청구 관리자)의 카드로 이뤄져요. ### 스토어에서 청구된 금액을 티로가 환불해줄 수 있나요? 전환에 따른 Google Play 환불은 티로가 자동으로 처리해드려요. 그 외의 스토어 청구 금액(해지하지 않아 발생한 중복 청구 등)은 Apple과 Google이 직접 처리해서 티로가 환불해드릴 수 없어요. 각 스토어의 환불 창구로 요청해 주세요. * iOS(App Store): [reportaproblem.apple.com](https://reportaproblem.apple.com) * Android(Google Play): [Google Play 환불 요청](https://support.google.com/googleplay/answer/2479637) *** **관련 페이지**: [구독 관리](/ko/guide/workspace/billing-guide) · [결제 FAQ](/ko/guide/workspace/billing-faq) · [티로 요금제](/ko/guide/workspace/plans) # 무엇을 도와드릴까요? Source: https://docs.tiro.ooo/ko/index Tiro AI 노트 사용법을 한곳에. 녹음·실시간 전사·AI 요약·노트 공유부터 REST API·MCP 연동까지, 필요한 주제를 골라 바로 시작하세요.

Perfectly Crafted Meeting Notes

무엇을 도와드릴까요?

녹음·실시간 전사·AI 요약·노트 공유부터 REST API·MCP 연동까지, 필요한 주제를 골라 바로 시작하세요.

무엇이든 검색해 보세요… ⌘K
가입부터 첫 녹음까지, 5분이면 시작해요 회의·통화·파일, 무엇이든 받아써서 노트로 맥락·화자 분리·단어장으로 더 정확하게 템플릿으로 원하는 문서를 빠르게 위키·Ask Tiro·MCP로 노트를 AI와 문단별로 음성을 다시 들어요 링크와 폴더로 팀과 함께 보기 공유·정리·캘린더 녹음을 자동으로 워크스페이스·요금제·구독·영수증을 한곳에서 로그인·기기·계정을 관리해요 내 데이터가 어떻게 보호되는지 막혔을 때 빠르게 해결하는 법 티로에 쌓이는 노트·전사·요약을 코드로 가져와 자동화하거나 AI에 연결하고 싶다면.
# Get Note Document Template Source: https://docs.tiro.ooo/api-reference/note-document-template/get-note-document-template /openapi.yaml get /v1/external/note-document-templates/{templateId} Retrieve a specific note document template by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Bound Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-bound-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/me/note-document-templates List the note document templates in the workspace bound to the API key, with cursor-based pagination. Use this with a workspace-scoped key when you do not want to pass the workspace GUID explicitly; the workspace is resolved the same way as `GET /v1/external/workspaces/me`. # List Managed Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-managed-note-document-templates /openapi.yaml get /v1/external/note-document-templates/managed List Tiro's built-in (managed) note document templates, with cursor-based pagination. Managed templates are curated by Tiro and shared across every account; they are read-only (`isManaged: true`, `isEditable: false`). Use the optional `locale` query parameter (BCP-47, for example `en-US`, `ko-KR`, `ja-JP`) to select the language of the returned templates. When omitted, a fallback locale is returned. # List Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates /openapi.yaml get /v1/external/note-document-templates Deprecated. Use the path-explicit list endpoints (users/me, workspaces, organizations/me). Resolves scope by API key type. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Document Templates Across Workspaces Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates-across-workspaces /openapi.yaml get /v1/external/workspaces/-/note-document-templates List note document templates across every workspace the API key can access, with cursor-based pagination. Pass the optional `workspaceGuids` query parameter (comma-separated, up to 50 GUIDs) to restrict the result to specific workspaces; omit it to include every accessible workspace. # List Organization Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-organization-note-document-templates /openapi.yaml get /v1/external/organizations/me/note-document-templates List the org-owned note document templates of the organization bound to the API key, with cursor-based pagination. Requires an organization API key; personal, workspace, and legacy team keys return `401`. # List User Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-user-note-document-templates /openapi.yaml get /v1/external/users/me/note-document-templates List the calling user's personal note document templates, with cursor-based pagination. Only templates the user owns personally are returned — workspace and organization templates are excluded. # List Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/note-document-templates List the note document templates in the specified workspace, with cursor-based pagination. The API key must be able to access the workspace in the path; a key bound to a different workspace returns `403`. # Get Note Summary Source: https://docs.tiro.ooo/api-reference/note-summary/get-note-summary /openapi.yaml get /v1/external/notes/{noteGuid}/summaries/{summaryId} Retrieve a specific summary with full content. - Default format: Markdown (`text/markdown`) - Use the `format` query parameter to request `text/plain` instead See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Add or Update Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/add-or-update-workspace-member /openapi.yaml put /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently assign an existing organization member to an organization workspace, or update that workspace role. This endpoint does not create or invite users. # Get My Organization Source: https://docs.tiro.ooo/api-reference/organization/get-my-organization /openapi.yaml get /v1/external/organizations/me Retrieve the organization bound to the caller's API key. Requires an organization API key — keys issued by an organization admin from the organization console. Personal, workspace, and legacy team keys return `401`. Organization API keys carry fixed scopes (for example `note_document:write`) and can reach the notes in every workspace that belongs to the organization. Use this endpoint to verify which organization your key is bound to. # Get Organization Member Source: https://docs.tiro.ooo/api-reference/organization/get-organization-member /openapi.yaml get /v1/external/organizations/me/members/{userGuid} # List Organization Members Source: https://docs.tiro.ooo/api-reference/organization/list-organization-members /openapi.yaml get /v1/external/organizations/me/members List existing organization members. This endpoint does not create or invite users. # List Organization Notes Source: https://docs.tiro.ooo/api-reference/organization/list-organization-notes /openapi.yaml get /v1/external/organizations/me/notes List ended notes in the workspaces of the organization bound to the API key, with cursor-based pagination. A note is "ended" when its recording has finished (`recordingEndAt` is set) — the same condition that fires the `note.ended` webhook event. Filter by `endedAfter` / `endedBefore` (ISO 8601, applied to `recordingEndAt`) to bound the window. Results are ordered by note ID descending (newest-created first) with an ID-based cursor; the time filters bound the window, they do not change the sort order. # Remove Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/remove-workspace-member /openapi.yaml delete /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently remove an existing organization member from an organization workspace. # Resume Member Recording Source: https://docs.tiro.ooo/api-reference/organization/resume-member-recording /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently remove the member's recording suspension. # Revoke All Member Sessions Source: https://docs.tiro.ooo/api-reference/organization/revoke-all-member-sessions /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/sessions Revoke every current Tiro session for an existing organization member. The user can sign in again unless access is blocked by the identity provider. # Suspend Member Recording Source: https://docs.tiro.ooo/api-reference/organization/suspend-member-recording /openapi.yaml put /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently prevent the organization member from starting recordings. # Expand Wiki Graph Source: https://docs.tiro.ooo/api-reference/wiki/expand-wiki-graph /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/expand Expand the graph around a specific wiki page by traversing links up to a given depth. Returns 402 if wiki is not plan-eligible or not activated. # Get My Workspace Source: https://docs.tiro.ooo/api-reference/wiki/get-my-workspace /openapi.yaml get /v1/external/workspaces/me Retrieve the single workspace implicit in the caller's API key. Resolution follows the same order as `GET /v1/external/workspaces`: 1. Workspace-bound key → that workspace's GUID 2. Legacy team key → the team's workspace GUID 3. Personal/OAuth key → the user's default workspace GUID Used by the MCP server and CLI to fill the `{workspaceGuid}` path segment without requiring the caller to pass a workspace parameter explicitly. # Get Wiki Graph Around Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-around /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/around Retrieve the graph in the neighborhood of a wiki page (radius-based expansion). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Links Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-links /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/links Retrieve the graph of links between multiple wiki pages. Pass one or more page GUIDs as repeated `pageGuids` query parameters. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Seed Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-seed /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/seed Retrieve an initial set of nodes and edges for graph visualization. Optionally filter by page type, creation date, or search keyword. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Info Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-info /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki Retrieve metadata for the workspace's wiki (name, creation timestamp, etc.). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Page Details Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-page-details /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid} Retrieve full details for a wiki page, including body/description, mentions, aliases, and links. Returns 402 if wiki is not plan-eligible or not activated. # List Page Mentions Source: https://docs.tiro.ooo/api-reference/wiki/list-page-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid}/mentions List mentions (references from notes) for a specific wiki page with cursor-based pagination. Returns 402 if wiki is not plan-eligible or not activated. # List Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/list-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages List wiki pages with cursor-based pagination. Optionally filter by page type or creation date, or search by keyword (which reorders results by relevance and disables cursor pagination). Returns 402 if wiki is not plan-eligible or not activated. # List Workspaces Source: https://docs.tiro.ooo/api-reference/wiki/list-workspaces /openapi.yaml get /v1/external/workspaces List all workspaces accessible to the caller's API key or OAuth token. Resolution order: 1. Workspace-bound API key → the single bound workspace 2. Organization-bound API key → all active workspaces in the organization 3. Legacy team API key → the team's workspace 4. Personal/OAuth key → all workspaces the user is a member of Use this endpoint to enumerate workspaces when your account belongs to multiple workspaces, then pass the chosen workspace `guid` to the wiki endpoints. # Search Wiki Mentions Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/mentions Keyword-required search for mentions (references in notes). Returns ranked mentions with source context. Returns 402 if wiki is not plan-eligible or not activated. # Search Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/pages Keyword-required search for wiki pages. Returns pages ranked by full-text relevance. Returns 402 if wiki is not plan-eligible or not activated. # Bulk Create Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk Create multiple organization word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). Requires an **organization** API key. # Bulk Create User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk Create multiple word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs — against both existing entries and other items in the same request — are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). # Bulk Create Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Create multiple word memories in a workspace in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Requires a **user** API key that is a writable member of the workspace; a workspace-bound key must match the path. # Bulk Delete Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk-delete Delete multiple organization word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires an **organization** API key. # Bulk Delete User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk-delete Delete multiple word memories by ID (up to 1000). Non-existent or non-owned IDs are ignored; the response reports how many were actually deleted. # Bulk Delete Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk-delete Delete multiple workspace word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires a **user** API key that is a writable member of the workspace. # Bulk Update Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-organization-word-memories /openapi.yaml patch /v1/external/organizations/me/word-memories/bulk Update multiple organization word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires an **organization** API key. # Bulk Update User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-user-word-memories /openapi.yaml patch /v1/external/users/me/word-memories/bulk Update multiple word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. # Bulk Update Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-workspace-word-memories /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Update multiple workspace word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires a **user** API key that is a writable member of the workspace. # Create Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-organization-word-memory /openapi.yaml post /v1/external/organizations/me/word-memories Register a new word to the organization's shared word memory. Requires an **organization** API key. Duplicate entries (same `entry` + `subEntry`) are not allowed and return `409 Conflict`. # Create User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-user-word-memory /openapi.yaml post /v1/external/users/me/word-memories Register a new word to the user's personal word memory. Once registered, Tiro references this word during voice transcription to improve recognition accuracy. Useful for proper nouns, technical terms, or any word that standard speech-to-text may not recognize correctly. Duplicate entries (same `entry` value) are not allowed and will return `409 Conflict`. # Create Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-workspace-word-memory /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories Register a new word to a workspace's shared word memory. Name the target workspace in the path with its `workspaceGuid`. Workspace word memories are accessible to all workspace members. Once registered, Tiro references this word during voice transcription for any member's recording. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. Duplicate entries (same `entry` value) are not allowed and return `409 Conflict`. # Delete Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-organization-word-memory /openapi.yaml delete /v1/external/organizations/me/word-memories/{wordMemoryId} Delete an organization word memory. This action is irreversible. Requires an **organization** API key. # Delete User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-user-word-memory /openapi.yaml delete /v1/external/users/me/word-memories/{wordMemoryId} Delete a word memory. This action is irreversible. Once deleted, Tiro will no longer reference this word during transcription. # Delete Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-workspace-word-memory /openapi.yaml delete /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Delete a workspace word memory. This action is irreversible. Once deleted, Tiro no longer references this word during transcription for any workspace member. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. # Get Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-organization-word-memory /openapi.yaml get /v1/external/organizations/me/word-memories/{wordMemoryId} Retrieve a specific organization word memory by ID. Requires an **organization** API key. # Get User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-user-word-memory /openapi.yaml get /v1/external/users/me/word-memories/{wordMemoryId} Retrieve a specific word memory by ID # Get Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-workspace-word-memory /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Retrieve a specific workspace word memory by ID. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. # List Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-organization-word-memories /openapi.yaml get /v1/external/organizations/me/word-memories List the organization's shared word memories with cursor-based pagination. These are shared across every workspace in the organization. Requires an **organization** API key (issued by an organization admin). Any other key type returns `401`. # List User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-user-word-memories /openapi.yaml get /v1/external/users/me/word-memories Retrieve user word memories with cursor-based pagination. Word memories help Tiro accurately recognize important terms — such as company names, people's names, and product names — during voice transcription. Registered words are referenced in real-time to reduce transcription errors. - Use `cursor` from previous response's `nextCursor` to paginate through results # List Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-workspace-word-memories /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories List a workspace's shared word memories with cursor-based pagination. Name the target workspace in the path with its `workspaceGuid` — obtain it from `GET /v1/external/workspaces`. Workspace word memories are shared among all workspace members. When any member records a meeting, Tiro references both personal and workspace word memories for accurate transcription. New members benefit from the shared vocabulary without additional setup. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. - Use `cursor` from the previous response's `nextCursor` to paginate through results. # Update Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-organization-word-memory /openapi.yaml patch /v1/external/organizations/me/word-memories/{wordMemoryId} Update an existing organization word memory. Only provided fields are updated (partial update). Requires an **organization** API key. # Update User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-user-word-memory /openapi.yaml patch /v1/external/users/me/word-memories/{wordMemoryId} Update an existing word memory. Only provided fields will be updated (partial update). # Update Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-workspace-word-memory /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Update an existing workspace word memory. Only provided fields are updated (partial update). Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. # AI 에이전트를 위한 가이드 Source: https://docs.tiro.ooo/ko/developers/cli/agent-guide 에이전트 작업에 맞는 MCP·CLI 선택 기준과 예제. Claude Code, Cursor, ChatGPT 에이전트에서 MCP와 CLI를 언제 써야 하는지 설명해요. ## 멘탈 모델 > **MCP 결과는 대화에 남고 CLI 결과는 파일로 저장할 수 있어요.** MCP `get_note_transcript`를 호출하면 전체 전사(노트당 보통 5\~50KB)가 대화 컨텍스트에 들어와요. 요약하거나 컨텍스트를 정리하기 전까지 이후 대화에도 남아요. `tiro notes transcript --output transcript.md`를 호출하면 같은 내용을 파일로 저장하고 stdout에는 메타데이터 한 줄만 반환해요. ```json theme={"system"} {"ok":true,"data":{"saved":"./transcript.md","size":12450,"format":"md","guid":"note-a8f2c1…","paragraphCount":42,"segmentCount":127}} ``` 전사 100개도 대화에는 경로와 개수만 남길 수 있어요. 필요한 파일만 읽으세요. ## 도구 선택 치트시트 | 이럴 때… | 사용 | 비고 | | ------------------------- | --------------------------------------------------- | ------------------------------------- | | 주제로 노트 찾기 | MCP `search_notes` | 주요 문서 포함, 응답은 대화에 남음 | | 노트 50개 이상 파일로 저장 | CLI `tiro notes search "…" --json > meetings.jsonl` | NDJSON 파이프, `jq`로 필터링 | | 그대로 인용하기 | MCP `get_note_transcript` | 필요한 노트 한 건의 전체 전사 | | 전체 전사 저장 | CLI `tiro notes transcript --output ` | 내용은 파일, 메타데이터는 stdout | | 날짜별로 회의 둘러보기 | CLI `tiro notes list --since 7d --json` | 가벼움, 메타데이터만 | | MCP 호스트 없이 MCP 형태 JSON 읽기 | CLI `tiro notes transcript --format json` | MCP `get_note_transcript`와 바이트 단위로 동일 | ## MCP를 호출할지 CLI를 호출할지 ``` Are you in an MCP-aware client (Claude Desktop, Cursor, Code)? │ ├─ NO → CLI is your only option. Use --json everywhere. │ └─ YES → Will the result fit comfortably in your context window? (Rule of thumb: <5 KB total, single-shot reasoning) │ ├─ YES → MCP. Schema-typed call, multi-turn friendly. │ └─ NO → CLI with --output. Disk holds the content, context holds the path. Reach for Read tool on demand. ``` ## 예제 — 최근 30일 'Acme Corp' 회의 클라이언트별 분기 요약본을 작성하려고 해요. 최근 30일 동안 Acme가 언급된 모든 회의를 전체 transcript와 함께 가져와야 해요. ```bash theme={"system"} # 1. Search → metadata + hydrated documents (NDJSON) tiro notes search "Acme Corp" --since 30d --json > /tmp/acme.jsonl # stdout: ~12 lines of NDJSON, ~3 KB total # 2. Pull guids without loading bodies cat /tmp/acme.jsonl | jq -r '.guid' > /tmp/guids.txt # 3. Download each transcript to disk (paths only return to context) xargs -I{} tiro notes transcript {} --output ./out/{}.md < /tmp/guids.txt ``` 대화에는 stdout 3줄과 메타데이터 12개만 남아요(약 80토큰). 전사 12개는 `./out/`에 저장돼요. 정확한 표현이 필요할 때만 `Read` 도구로 하나씩 읽으세요. `get_note_transcript`를 12번 호출하면 60~~600KB(전사 12개 × 각 5~~50KB)가 대화에 남아요. 자세히 볼 2\~3개만 불러오면 토큰을 줄일 수 있어요. ## 에러를 JSON으로 읽기 CLI의 모든 에러는 안정적인 envelope을 따라요: ```json theme={"system"} { "ok": false, "error": { "code": "auth_required", "message": "Not authenticated. Run `tiro auth login` to sign in, or set TIRO_TOKEN env var.", "suggestion": "tiro auth login", "errorType": "auth_required", "httpStatus": null, "requestId": null } } ``` 안정적인 필드: | 필드 | 용도 | | ------------------ | --------------------------------------------------- | | `error.code` | machine-readable 식별자, 이걸로 분기 | | `error.errorType` | 큰 분류(`unauthorized`, `not_found`, `bad_request`, …) | | `error.suggestion` | 자동 복구를 위해 실행할 바로 그 명령 | | `error.httpStatus` | 해당되는 경우 upstream HTTP status | | `error.requestId` | 지원 에스컬레이션용 upstream `x-request-id` | `error.message`는 사람이 읽는 용도이고 릴리스마다 표현이 바뀔 수 있으니, 이걸로 패턴 매칭하지 마세요. ## Exit code | Code | 의미 | 에이전트 동작 | | ---- | ------------------------------------ | --------------------------------------------------------- | | `0` | 성공 | 계속 | | `1` | 일반 에러 | `error.code` 확인 | | `2` | usage 에러(잘못된 flag, 잘못된 날짜, 필수 인자 누락) | 호출을 고침, 무작정 재시도 금지 | | `4` | auth 필요 | `tiro auth login` 실행 후 재시도 | | `64` | EX\_USAGE | `2`와 동일 | | `65` | EX\_DATAERR | 응답이 schema 검증 실패, 사용자에게 알림 | | `78` | EX\_CONFIG | env·keychain에 token 없음, 사용자에게 인증 요청 또는 `TIRO_TOKEN` 제공 요청 | 셸에서 빠른 auth 복구 루프: ```bash theme={"system"} output=$(tiro notes list --json 2>&1) exit_code=$? if [ $exit_code -eq 4 ] || [ $exit_code -eq 78 ]; then tiro auth login output=$(tiro notes list --json) fi echo "$output" ``` ## 출력 보장 * **`--json`은 스트림에서 NDJSON** — list와 search는 한 줄에 JSON 객체 하나씩 내보내요. 페이지네이션 cursor는 마지막에 `{"_cursor": "…"}` 줄로 와요. * **`--output `는 원자적으로 씀** — temp 파일 + rename 방식이라 절대 부분 저장이 없어요. * **TTY 자동 감지** — 인터랙티브 셸에선 pretty, 파이프·리다이렉트되면 JSON. `--pretty` / `--json`으로 강제할 수 있어요. * **`tiro notes transcript --format json`은 MCP `get_note_transcript`와 일치** — 같은 필드명, 같은 중첩, 같은 speaker-segment 구조예요. 기존 파서를 그대로 재사용하세요. * **token은 절대 출력되지 않음** — `auth status`는 앞 4자만 보여주고, `--verbose`에서도 나머지는 가려져요. ## 안정 계약 — patch 릴리스에서 깨지지 않는 것 * `error.code` 값 * `error.errorType` 값 * Exit code * list/search의 NDJSON 줄 형태 * `tiro notes transcript --format json`이 반환하는 MCP 형태 JSON * `--output` 작업이 반환하는 메타데이터 줄 형태 그 외(pretty 출력, 에러 메시지, verbose 로그 포맷)는 best-effort이고 바뀔 수 있어요. ## 링크 * [Quickstart](/ko/developers/cli/quickstart) — 직접 해보는 다섯 가지 시나리오. * [Setup](/ko/developers/cli/setup) — 설치 + 인증 + headless/CI 설정. * [CLI on npm](https://www.npmjs.com/package/@theplato/tiro-cli) * [tiro-cli on GitHub](https://github.com/plato-corp/tiro-cli) * [CHANGELOG](https://github.com/plato-corp/tiro-cli/blob/main/CHANGELOG.md) # CLI 개요 Source: https://docs.tiro.ooo/ko/developers/cli/cli-overview 셸, CI, 에이전트에서 Tiro 노트와 전사를 다루는 CLI. Tiro CLI는 npm의 [`@theplato/tiro-cli`](https://www.npmjs.com/package/@theplato/tiro-cli) 패키지예요. MCP와 같은 Tiro API를 셸, CI, cron, 에이전트에서 사용할 수 있어요. [![npm version](https://img.shields.io/npm/v/@theplato/tiro-cli)](https://www.npmjs.com/package/@theplato/tiro-cli) [![Node.js](https://img.shields.io/node/v/@theplato/tiro-cli)](https://nodejs.org) ## 빠른 설치 ```bash npm theme={"system"} npm install -g @theplato/tiro-cli ``` ```bash pnpm theme={"system"} pnpm add -g @theplato/tiro-cli ``` ```bash yarn theme={"system"} yarn global add @theplato/tiro-cli ``` ```bash bun theme={"system"} bun add -g @theplato/tiro-cli ``` ```bash theme={"system"} tiro auth login # browser opens; OAuth + PKCE tiro notes search "Q3 Planning" --since 7d --json ``` ## 어떤 방식을 쓸까요 | | **REST API** | **MCP server** | **CLI** | | ---------- | ------------ | ------------------ | ---------------------- | | 대상 | 서비스, 통합 | MCP를 인식하는 AI 클라이언트 | 셸, CI, 임시 에이전트 | | 결과가 도착하는 곳 | 내 코드 | 에이전트 **컨텍스트** | **파일** 또는 stdout 파이프 | | 세션당 토큰 비용 | 요청당 | 수천(tool schema) | 수십(호출당) | | 가장 잘 맞는 용도 | 서비스 간 트래픽 | 작은 읽기, 멀티턴 추론 | 대량 export, 파일 작업, 스크립팅 | | 발견 방법 | OpenAPI | MCP `list_tools` | `tiro --help` | 세 방식은 같은 OAuth와 JWT를 사용해요. 한 곳에서 발급한 자격 증명을 다른 곳에서도 쓸 수 있어요. 자세한 내용은 [인증](/ko/developers/fundamentals/authentication)을 참고하세요. 대화 안에서 노트를 읽고 추론한다면 MCP가 알맞아요. 결과를 파일이나 파이프로 받아야 한다면 CLI를 쓰세요. ## 무엇을 얻나요 * **인증**: `tiro auth login | status | logout` — OAuth Authorization Code + PKCE로 로그인하고 토큰을 운영체제의 자격 증명 저장소에 보관해요. * **노트**: `tiro notes list | search | get | transcript` — MCP의 `list_notes` / `search_notes` / `get_note` / `get_note_transcript`와 같은 데이터를 다뤄요. * **위키**: `tiro wiki workspaces | search | page | mentions | graph` — 위키를 검색하고 읽어요. `--workspace `로 워크스페이스를 지정할 수 있어요. 유료이며 별도로 활성화해야 해요. * **MCP 형식 JSON**: `tiro notes transcript --format json`은 MCP `get_note_transcript`와 같은 응답을 반환해요. 기존 MCP 파서를 재사용할 수 있어요. * **파일 출력**: 모든 조회 명령은 `--output `를 지원해요. 콘텐츠는 파일에 저장하고 stdout에는 메타데이터 한 줄만 남겨요. * **에러 형식**: 모든 에러는 문서화된 종료 코드와 `{ ok: false, error: { code, message, suggestion?, errorType?, httpStatus?, requestId? } }`를 반환해요. ## 아키텍처 ``` Tiro Backend — /v1/external/* + /v1/mcp/* │ ┌──────────────────────┼──────────────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │ REST │ │ MCP server │ │ CLI │ │ clients │ │ (uniform │ │ (filesystem, │ │ │ │ shape) │ │ bulk, pipe) │ └──────────┘ └──────────────┘ └──────────────┘ ``` → 설치와 인증을 진행하려면 [Setup](/ko/developers/cli/setup)으로 이어가세요. ## 링크 * npm: [npmjs.com/package/@theplato/tiro-cli](https://www.npmjs.com/package/@theplato/tiro-cli) * GitHub: [github.com/plato-corp/tiro-cli](https://github.com/plato-corp/tiro-cli) * Changelog: [CHANGELOG.md](https://github.com/plato-corp/tiro-cli/blob/main/CHANGELOG.md) * Issues: [github.com/plato-corp/tiro-cli/issues](https://github.com/plato-corp/tiro-cli/issues) # 에이전트에 Tiro CLI 설치하기 Source: https://docs.tiro.ooo/ko/developers/cli/install 에이전트가 Tiro CLI를 설치하고 로그인하도록 지시하는 프롬프트. 아래 프롬프트를 셸을 사용할 수 있는 코딩 에이전트에 붙여넣으세요. CLI 설치, OAuth 로그인, 연결 확인을 차례로 실행해요. **요구 사항**  ·  Node.js 20+  ·  macOS, Linux, 또는 Windows  ·  에이전트가 명령을 실행할 수 있는 셸 ## 이 프롬프트를 복사하세요 ```text The Tiro CLI install prompt theme={"system"} Install the Tiro CLI in this environment and sign me in. Package : @theplato/tiro-cli (Node.js 20+) Platforms : macOS, Linux, Windows Auth : OAuth (Authorization Code + PKCE) — opens a browser and stores the token in the OS keychain. Steps: 1. Install globally with whichever package manager is already in use here. For npm, that is: npm install -g @theplato/tiro-cli (Use pnpm / yarn / bun equivalents if those are the active package manager — do not switch tooling.) 2. Verify the install: tiro --version # expect 0.3.1 or later 3. Sign me in: tiro auth login # opens a browser for OAuth 4. Confirm the session: tiro auth status # shows user + token prefix only If this is a headless / CI / sandboxed environment without a browser, do not run `tiro auth login`. Instead, ask me for a TIRO_TOKEN value and export it for subsequent commands: export TIRO_TOKEN="" When everything is connected, run: tiro notes list --limit 3 --json and show me the output to prove the CLI is working. If any step fails, show the exact command, the exit code, and the error — do not retry silently. ``` 이 프롬프트는 현재 프로젝트의 패키지 매니저를 그대로 사용하도록 지시해요. ## 에이전트가 하게 될 일 1. 패키지 매니저(npm / pnpm / yarn / bun)를 감지하고 `@theplato/tiro-cli`를 전역 설치해요. 2. `tiro --version`을 실행해 바이너리가 `PATH`에 있는지 확인해요. 3. `tiro auth login`을 실행해요. 브라우저가 OAuth를 위해 열려요. bearer token은 OS native keychain(Keychain / Secret Service / Credential Manager)에 저장돼요. 4. `tiro auth status`와 `tiro notes list --limit 3 --json`으로 연결을 확인해요. headless 환경에서는 에이전트가 3단계에서 멈추고 대신 `TIRO_TOKEN`을 요청해요. 토큰 발급 방법은 [Headless, CI, 에이전트 환경](/ko/developers/cli/setup#headless-ci-and-agent-environments)을 참고하세요. ## 개인정보와 토큰 처리 * OAuth 토큰은 OS native 자격 증명 저장소에 저장돼요. 전체 bearer는 stdout에 절대 나타나지 않고 `tk__...***` 같은 prefix만 보여요. * `TIRO_TOKEN`이 설정돼 있으면 keychain을 override해요. CI secret에는 유용하지만 셸 히스토리에 새면 위험해요. * 신뢰할 수 있는 머신에서 `tiro auth logout && tiro auth login`을 실행한 뒤 secret 저장소를 갱신해 rotate하세요. *** 직접 설치하고 싶으세요?  → [수동 설치 & 인증](/ko/developers/cli/setup)   ·   [Quickstart 시나리오](/ko/developers/cli/quickstart)   ·   [에이전트 가이드](/ko/developers/cli/agent-guide) # 빠른 시작 Source: https://docs.tiro.ooo/ko/developers/cli/quickstart 노트 조회, 검색, 파일 저장, 셸 파이프 예제. 자주 쓰는 CLI 명령을 예제로 확인하세요. ## 1. 가장 최근 노트 나열하기 ```bash theme={"system"} tiro notes list --limit 10 ``` TTY에서의 pretty 출력: ``` 2026-04-02 note-a8f2c1... 18m32s Q3 Planning 2026-04-01 note-b7e1d4... 12m05s Customer call with Acme Corp 2026-03-29 note-c3f9a2... 45m11s Engineering weekly standup … ``` 파이핑을 위해 NDJSON으로 바꾸려면 `--json`을 추가하세요: ```bash theme={"system"} tiro notes list --limit 100 --json | jq -r '.guid' | head -5 ``` ## 2. 키워드와 날짜 범위로 검색하기 ```bash theme={"system"} tiro notes search "OKR" --since 30d --json ``` `tiro notes search`는 전문 검색을 사용하고 주요 문서(one-pager, custom)를 결과에 포함해요. 키워드는 위치 인자나 `--keyword`로 입력해야 해요. 날짜 필터는 ISO-8601 또는 상대 표기 단축형을 받아요: ```bash theme={"system"} tiro notes search "Q3 Planning" --since 2026-04-01 --until 2026-05-01 tiro notes search "Acme Corp" --since 7d tiro notes search "release" --since 24h ``` 폴더 범위 지정: ```bash theme={"system"} tiro notes search "deploy" --folder --json ``` ### 키워드 매칭이 동작하는 방식 `tiro notes search`는 노트 제목과 문단을 전문 검색해요. 대소문자를 구분하지 않으며 `"OKR planning"`은 두 단어를 모두 포함한 노트를 찾아요. 결과는 관련도순이며 점수가 같으면 `createdAt` 내림차순으로 정렬해요. `tiro notes search`와 `POST /v1/external/notes/search`는 각 노트의 주요 문서(one-pager, custom)를 함께 반환해요. `tiro notes list --keyword "..."`는 메타데이터만 반환해요. `--keyword` 없이 `tiro notes list`를 호출하면 `createdAt` 내림차순으로 정렬해요. `--keyword`를 쓰면 페이지 커서는 항상 `null`이에요. **미완성 노트 제외.** `tiro notes list`와 `tiro notes search`는 `title === "Untitled"` 또는 `sourceType === "onboarding"`인 노트를 기본적으로 제외해요. 포함하려면 `--include-untitled`를 넘기세요. ## 3. 회의 노트 하나를 Markdown으로 저장하기 ```bash theme={"system"} tiro notes get --output ./q3-planning.md --include transcript ``` stdout은 메타데이터 한 줄을 반환하고, 실제 콘텐츠는 디스크로 가요: ```json theme={"system"} {"ok":true,"data":{"saved":"./q3-planning.md","size":12450,"format":"md","guid":"note-a8f2c1...","title":"Q3 Planning"}} ``` Markdown 파일에는 YAML frontmatter, 참가자 목록, 그리고 문단마다 elapsed-timestamp 헤더 하나가 붙고 그 뒤에 화자가 표기된 segment가 오는 트랜스크립트가 들어 있어요: ```md theme={"system"} ### 00:12 **Yeoul**: Let's start with the Acme deal pipeline. **Evan**: They just signed the LOI. ``` `### mm:ss` 헤더를 완전히 빼려면 `--no-timestamps`(v0.3.0+)를 넘기세요. timestamp가 노이즈가 되는 raw 저장이나 LLM ingest에 편리해요: ```bash theme={"system"} tiro notes transcript --output ./clean.md --no-timestamps ``` ## 4. 검색 결과를 `jq`로 파이핑하기 ```bash theme={"system"} tiro notes search "OKR" --since 7d --json \ | jq -r 'select(.recordingDurationSeconds > 600) | .guid' \ > long-okr-meetings.txt ``` `--json`은 list/search 응답에 대해 항상 NDJSON을 내보내요. 노트 하나당 한 줄이에요. 후속 파이프라인을 위해 `jq -c`(compact)와 조합하거나, `head` / `tail`로 잘라내세요. 응답에 다음 페이지 cursor가 포함되면, `_cursor` 키가 붙은 마지막 NDJSON 줄로 내보내져요: ```bash theme={"system"} tiro notes list --limit 50 --json | tail -1 # → {"_cursor":"eyJjcmVhdGVkQXQi…"} ``` 계속하려면 그 값을 `--cursor`로 되돌려 넘기세요: ```bash theme={"system"} tiro notes list --limit 50 --cursor "eyJjcmVhdGVkQXQi…" ``` ## 5. 화자 라벨이 있는 트랜스크립트 가져오기 ```bash theme={"system"} tiro notes transcript --format md --output ./transcript.md ``` ```md theme={"system"} # Customer call with Acme Corp **Participants**: Yeoul, Evan, Hailey ## Transcript ### 00:00 **Yeoul**: Thanks for joining — let me walk through the proposal. ### 00:12 **Hailey**: One quick question on pricing tiers. ### 00:25 **Evan**: That's covered on slide 4. … ``` MCP의 `get_note_transcript` payload를 이미 이해하는 에이전트라면 `--format json`으로 바꾸세요. shape이 바이트 단위로 동일해요: ```bash theme={"system"} tiro notes transcript --format json ``` ```json theme={"system"} { "noteGuid": "note-a8f2c1...", "title": "Customer call with Acme Corp", "participants": ["Yeoul", "Evan", "Hailey"], "createdAt": "2026-04-01T10:30:00Z", "recordingDurationSeconds": 3605, "paragraphs": [ { "timeFrom": "2026-04-01T10:30:00Z", "timeTo": "2026-04-01T10:30:12Z", "segments": [ { "content": "Thanks for joining…", "speaker": { "label": "SPEAKER_0", "name": "Yeoul" } } ] }, … ] } ``` ## 6. 워크스페이스 위키 둘러보기 위키는 내 노트 위에 Tiro가 자동으로 추출한 knowledge graph(엔티티, 개념, 그리고 그 사이의 링크)예요. 아래 명령들은 읽기 전용이고, 위키가 활성화된 워크스페이스(유료, opt-in)가 필요해요. ```bash theme={"system"} tiro wiki workspaces # which workspaces? (guid + wiki on/off) tiro wiki search "payment system" --workspace # ranked pages; is positional tiro wiki page --workspace # body + mentions + aliases + links (all included) tiro wiki mentions --workspace # where the page is grounded in your notes tiro wiki graph --mode around --workspace # neighborhood graph (capped — see `truncated`) tiro wiki graph --mode seed --type CONCEPT --workspace # overview graph — no pageGuid needed ``` `--workspace`는 선택이에요. 생략하면 내 API Key의 기본 워크스페이스를 써요. 계정이 둘 이상의 워크스페이스에 속해 있다면 먼저 `tiro wiki workspaces`를 실행해서 위키가 켜진 워크스페이스의 `guid`를 넘기세요. 게이트된 워크스페이스는 백엔드의 업그레이드 안내 메시지를 출력하고 0이 아닌 코드로 종료돼요. → 도구 선택 가이드와 실제로 풀어본 에이전트 플로를 보려면 [For AI agents](/ko/developers/cli/agent-guide)로 이어가세요. # 설치와 인증 Source: https://docs.tiro.ooo/ko/developers/cli/setup Tiro CLI 설치, OAuth 로그인, 헤드리스·CI 인증 설정. CLI는 npm에 `@theplato/tiro-cli`로 배포되고 Node.js 20+에서 동작해요. macOS, Linux, Windows를 지원해요. ## 1. 설치 ```bash npm theme={"system"} npm install -g @theplato/tiro-cli ``` ```bash pnpm theme={"system"} pnpm add -g @theplato/tiro-cli ``` ```bash yarn theme={"system"} yarn global add @theplato/tiro-cli ``` ```bash bun theme={"system"} bun add -g @theplato/tiro-cli ``` 설치를 확인하세요: ```bash theme={"system"} tiro --version # → 0.3.1 (or later) ``` **시스템 요구 사항**: Node.js 20 이상. 배포되는 바이너리는 ESM 전용이라 Node 18은 import에서 에러가 나요. ## 2. 로그인 ```bash theme={"system"} tiro auth login ``` 이 명령은 기본 브라우저에서 OAuth Authorization Code + PKCE 로그인을 시작해요. CLI는 redirect를 받으려고 `http://127.0.0.1:/callback`에서 일회용 로컬 서버를 열어요. 로그인한 뒤 JWT는 운영체제의 자격 증명 저장소에 보관돼요. * **macOS** — Keychain * **Linux** — Secret Service (`gnome-keyring` 또는 `kwallet` 필요) * **Windows** — Credential Manager 확인하세요: ```bash theme={"system"} tiro auth status # ✓ Signed in # source: keychain # hostname: https://api.tiro.ooo # user: # expires at: # token: tk__...*** ``` 화면에는 토큰 앞부분만 표시돼요. 전체 Bearer 토큰은 keychain 밖으로 노출되지 않아요. **CLI는 로그인한 사용자로 동작해요.** 그래서 조회 범위가 앱에서 보는 노트와 같고, 본인의 개인 폴더 노트도 다룰 수 있어요. 시스템 API Key는 이와 달라서 전체 구성원에게 공유된 폴더의 노트만 조회해요([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). 자동화가 개인 폴더 노트까지 다뤄야 한다면 CLI나 계정 API Key를 쓰세요. ## 3. 로그아웃 ```bash theme={"system"} tiro auth logout ``` keychain 항목과 캐시된 Dynamic Client Registration ID를 지워요. 다음 `tiro auth login`은 새 DCR client를 등록해요. ## 4. 에이전트에 Tiro MCP 연결하기 (선택) Claude Code(또는 MCP 호환 클라이언트)를 쓴다면, CLI는 `https://mcp.tiro.ooo/mcp`에 호스팅된 Tiro MCP를 위한 한 줄짜리 installer를 제공해요: ```bash theme={"system"} tiro mcp install # → claude mcp add --transport http tiro https://mcp.tiro.ooo/mcp ``` 출력을 셸로 바로 파이핑하거나, 명령을 MCP 클라이언트의 config에 복사하세요. 구조화된 뷰(transport, URL, docs link)를 보려면 `tiro mcp info --json`을 실행하세요. CLI는 읽기 위주 플로(브라우징, 디스크 저장)를 다루고, MCP는 에이전트 루프 안의 인터랙티브한 tool 호출을 다뤄요. 전체 에이전트 계약은 패키지에 동봉된 [`AGENTS.md`](https://github.com/plato-corp/tiro-cli/blob/main/AGENTS.md)를 참고하세요. ## Headless, CI, 에이전트 환경 일부 환경은 브라우저를 열 수 없어요(CI, SSH, sandbox 에이전트, Docker). 그런 경우엔 `TIRO_TOKEN`을 직접 설정하세요. 여기 들어가는 값은 keychain을 override해요. ```bash theme={"system"} export TIRO_TOKEN="$(security find-generic-password -s 'io.tiro.cli' -a default -w 2>/dev/null \ | jq -r '.accessToken')" tiro notes list --json ``` GitHub Actions에서: ```yaml theme={"system"} - name: Run tiro env: TIRO_TOKEN: ${{ secrets.TIRO_TOKEN }} run: | tiro notes search "release notes" --since 1d --json > recent.jsonl ``` 전체 bearer token을 CI secret에 넣는 것은 180일짜리 Personal Access Token과 같아요. 신뢰할 수 있는 머신에서 `tiro auth logout && tiro auth login`을 실행하고 새 토큰을 secret 저장소에 복사해 rotate하세요. ## 설정 override | Variable | 용도 | | ----------------- | --------------------------------------------------- | | `TIRO_TOKEN` | Bearer token — keychain을 override | | `TIRO_HOSTNAME` | API base URL (기본값 `https://api.tiro.ooo`) | | `TIRO_OUTPUT_DIR` | export 명령의 기본 `--output-dir` (v0.3+) | | `NO_COLOR` | ANSI 색상 비활성화 ([no-color.org](https://no-color.org)) | 호출별 override: ```bash theme={"system"} tiro --hostname https://api.tiro-ooo.dev notes list # dev environment tiro notes get --json --no-color # script-friendly ``` ## CLI 업데이트 ```bash npm theme={"system"} npm update -g @theplato/tiro-cli ``` ```bash pnpm theme={"system"} pnpm update -g @theplato/tiro-cli ``` ```bash yarn theme={"system"} yarn global upgrade @theplato/tiro-cli ``` ```bash bun theme={"system"} bun update -g @theplato/tiro-cli ``` → 직접 해보는 예제를 보려면 [Quickstart](/ko/developers/cli/quickstart)로 이어가세요. # 지원 로케일 Source: https://docs.tiro.ooo/ko/developers/fundamentals/supported-locales 전사, 번역, 요약에 사용되는 로케일 ## 개요 `SupportedLocale` 값은 `language_COUNTRY` 패턴을 따라요. `language`는 소문자(ISO 639-1), `COUNTRY`는 대문자(ISO 3166-1 alpha-2)예요. * 예시: `en_US`, `ko_KR`, `ja_JP`, `zh_CN`, `es_ES`, `fr_FR` * `transcribeLocale`, `translateLocale`, `summaryLocale` 같은 필드에서 사용돼요. 필드에 로케일이 지정되지 않으면 `null`일 수 있어요. ## 지원 목록 * `de_DE` – 독일어 (독일) * `en_US` – 영어 (미국) * `es_ES` – 스페인어 (스페인) * `fr_FR` – 프랑스어 (프랑스) * `hi_IN` – 힌디어 (인도) * `id_ID` – 인도네시아어 (인도네시아) * `it_IT` – 이탈리아어 (이탈리아) * `ja_JP` – 일본어 (일본) * `ko_KR` – 한국어 (대한민국) * `ms_MY` – 말레이어 (말레이시아) * `ru_RU` – 러시아어 (러시아) * `sv_SE` – 스웨덴어 (스웨덴) * `th_TH` – 태국어 (태국) * `tr_TR` – 터키어 (튀르키예) * `uk_UA` – 우크라이나어 (우크라이나) * `vi_VN` – 베트남어 (베트남) * `zh_CN` – 중국어 (간체, 중국) ## 가이드라인 * `transcribeLocale`로 원본 음성 인식 로케일을 지정하세요. * `translateLocale`로 번역 대상 로케일을 지정하세요. * `summaryLocale`로 생성되는 요약의 언어를 지정하세요. # 에이전트에 Tiro MCP 설치하기 Source: https://docs.tiro.ooo/ko/developers/mcp/install 에이전트가 Tiro MCP 서버를 연결하고 인증하도록 지시하는 프롬프트. 아래 프롬프트를 MCP 호환 클라이언트에 붙여넣으세요. Tiro MCP 서버를 연결하고 인증 상태까지 확인해요. **호환 클라이언트**  ·  Claude Desktop  ·  Claude Code  ·  Cursor  ·  ChatGPT  ·  VS Code (Copilot)  ·  streamable-HTTP를 지원하는 모든 MCP 클라이언트 ## 이 프롬프트를 복사하세요 ```text The Tiro MCP install prompt theme={"system"} Install the Tiro MCP server in this workspace. Server URL : https://mcp.tiro.ooo/mcp Transport : HTTP (streamable) Auth : OAuth (preferred). On first connection, open a browser for Google sign-in. Tokens cache locally for 180 days. If this client cannot run a browser flow, ask me for a Tiro API key from https://platform.tiro.ooo/me/api-keys and attach the header: Authorization: Bearer For stdio-only clients, wrap the endpoint with mcp-remote: npx -y mcp-remote https://mcp.tiro.ooo/mcp After connecting, list the Tiro tools that loaded and call `auth_status` to confirm the session is live. If a step fails, show me the exact error and the step where it happened — do not retry silently. ``` 클라이언트에 맞는 설정 파일(`claude_desktop_config.json`, `.vscode/mcp.json`, Cursor 설정 등)은 에이전트가 선택해요. ## 에이전트가 하는 일 1. 활성화된 MCP 클라이언트를 감지하고 해당 설정 파일을 열어요. 2. `https://mcp.tiro.ooo/mcp`를 가리키는 `tiro` 서버 항목을 추가해요. 3. 클라이언트를 재시작하고(또는 재시작을 요청하고) 브라우저에서 OAuth를 완료해요. 4. `auth_status`를 호출해 연결을 확인하고 어떤 도구가 사용 가능한지 보고해요. 문제가 생기면 에이전트가 정확한 오류를 그대로 보여주므로 어느 단계를 다시 시도해야 할지 알 수 있어요. 조용히 반복 시도하는 일은 없어요. ## 개인정보 및 token 처리 * OAuth token은 로컬 MCP 클라이언트 설정에만 캐시되고, 다른 어디에도 전송되지 않아요. * API key를 대체 수단으로 사용하는 경우 같은 설정 파일에 평문으로 저장돼요. 공유되는 dotfile에는 넣지 마세요. * 둘 다 [API Keys 대시보드](https://platform.tiro.ooo/me/api-keys)에서, 또는 클라이언트에서 로그아웃하여 언제든 폐기할 수 있어요. *** 직접 설정하고 싶으신가요?  → [클라이언트별 수동 설정](/ko/developers/mcp/setup)   ·   [사용 가능한 도구](/ko/developers/mcp/tools/overview)   ·   [문제 해결](/ko/developers/mcp/troubleshooting) # MCP 개요 Source: https://docs.tiro.ooo/ko/developers/mcp/mcp-overview AI 클라이언트에서 Tiro 노트를 검색하고 읽는 MCP 서버. Tiro MCP Server는 `https://mcp.tiro.ooo/mcp`에서 제공돼요. 연결한 AI 클라이언트에서 노트 검색, 전사·요약 조회, 위키 탐색을 자연어로 요청할 수 있어요. ## 무엇을 할 수 있나요 * **노트 찾기**: `list_notes` * **노트와 주요 문서 검색**: `search_notes` * **요약·전사·문서 조회**: `get_note` * **문서 템플릿 조회**: `list_document_templates`, `get_document_template` * **정확한 발화 조회**: `get_note_transcript` * **폴더·공유 링크 조회**: `search_private_folders`, `search_team_folders`, `get_share_link` * **위키 탐색**: `search_wiki`, `get_wiki_page`, `list_wiki_mentions`, `get_wiki_graph`, `list_workspaces` 노트는 `list_notes`(메타데이터) → `search_notes`(내용) → `get_note_transcript`(원문 발화) 순서로 조회하세요. 대부분의 질문은 앞의 두 단계에서 답할 수 있어요. 전체 목록은 [Tools](/ko/developers/mcp/tools/overview)에서 확인하세요. ## 작동 방식 1. API Key(헤드리스 도구)나 OAuth(대화형 클라이언트)로 인증해요. 2. AI 클라이언트가 `https://mcp.tiro.ooo/mcp`에 연결돼요. 3. 채팅에서 Tiro 도구를 호출해요. 설정 방법은 [클라이언트 연결하기](/ko/developers/mcp/setup)를 참고하세요. # 클라이언트 연결하기 Source: https://docs.tiro.ooo/ko/developers/mcp/setup Claude, ChatGPT, Cursor, Claude Code에서 Tiro MCP 서버를 연결하는 방법. Tiro MCP 서버 주소는 `https://mcp.tiro.ooo/mcp`예요. 아래에서 사용하는 클라이언트의 설정 방법을 확인하세요. **API key가 없다면** [Tiro Platform API Keys 페이지](https://platform.tiro.ooo/me/api-keys)에서 만드세요. `abc123.xR7mK9pL2qW4...`처럼 점(.)을 포함한 전체 문자열을 복사해야 해요. 전체 키는 생성할 때 한 번만 볼 수 있어요. **권장: OAuth.** 한 번 로그인하면 클라이언트가 token을 관리해요. [Node.js](https://nodejs.org/)가 필요해요. `mcp-remote` 패키지가 streamable-http를 Claude Desktop이 기대하는 stdio transport로 연결해 줘요. 플랫폼에 맞는 설정 파일을 여세요. ```bash macOS theme={"system"} ~/Library/Application Support/Claude/claude_desktop_config.json ``` ```bash Windows theme={"system"} %APPDATA%\Claude\claude_desktop_config.json ``` ```bash Linux theme={"system"} ~/.config/Claude/claude_desktop_config.json ``` OAuth 설정을 추가하세요. ```json claude_desktop_config.json theme={"system"} { "mcpServers": { "tiro": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.tiro.ooo/mcp"] } } } ``` Claude Desktop을 재시작하세요. 처음 연결할 때 브라우저가 열리며 Google 로그인이 진행돼요. token은 로컬에 캐시되며 180일간 유효해요. **대체: API Key.** 브라우저 흐름을 원하지 않으면 다음을 사용하세요. ```json claude_desktop_config.json theme={"system"} { "mcpServers": { "tiro": { "command": "npx", "args": [ "-y", "mcp-remote", "https://mcp.tiro.ooo/mcp", "--header", "Authorization:Bearer YOUR_API_KEY" ] } } } ``` **권장: API Key.** 브라우저 의존성이 없고 교체하기 쉬워요. ```bash theme={"system"} claude mcp add --transport http tiro-mcp https://mcp.tiro.ooo/mcp \ --header "Authorization:Bearer YOUR_API_KEY" ``` **대체: OAuth.** `--header`를 생략하세요. Claude Code가 처음 연결할 때 브라우저를 열어요. ```bash theme={"system"} claude mcp add --transport http tiro-mcp https://mcp.tiro.ooo/mcp ``` **권장: OAuth.** 브라우저를 사용할 수 있는 대부분의 MCP 클라이언트는 OAuth를 기본 지원해요. 1. 서버 URL `https://mcp.tiro.ooo/mcp`를 추가하세요. 2. ChatGPT가 Google 로그인용 브라우저 창을 열어요. 3. 클라이언트가 access token을 캐시해요. 내장 브라우저 흐름이 없는 클라이언트라면 `mcp-remote`를 로컬 stdio 프록시로 실행하고 ChatGPT가 그 로컬 프로세스를 가리키게 하세요. ```bash theme={"system"} npx -y mcp-remote https://mcp.tiro.ooo/mcp ``` **권장: API Key.** 1. **Settings** > **MCP**를 여세요. 2. **Add new MCP server**를 클릭하세요. 3. transport를 **HTTP**로 설정하세요. 4. 서버 URL `https://mcp.tiro.ooo/mcp`를 입력하세요. 5. header를 추가하세요: `Authorization: Bearer YOUR_API_KEY`. **권장: API Key.** workspace에 `.vscode/mcp.json`을 만들거나 편집하세요. ```json .vscode/mcp.json theme={"system"} { "servers": { "tiro": { "type": "http", "url": "https://mcp.tiro.ooo/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` streamable-http를 지원하는 모든 MCP 클라이언트는 아래 원본 값으로 동작해요. | Field | Value | | ------------ | ------------------------------------------------------------ | | Server URL | `https://mcp.tiro.ooo/mcp` | | Transport | HTTP (streamable) | | Auth header | `Authorization: Bearer YOUR_API_KEY` | | OAuth issuer | `https://mcp.tiro.ooo` (클라이언트가 OAuth 2.0 with PKCE를 지원하는 경우) | stdio만 지원하는 클라이언트라면 endpoint를 `mcp-remote`로 감싸세요. ```bash theme={"system"} npx -y mcp-remote https://mcp.tiro.ooo/mcp \ --header "Authorization:Bearer YOUR_API_KEY" ``` *** ## 권한 범위 권한 범위는 MCP 서버가 접근할 수 있는 리소스를 정의해요. 현재 API Key에는 모든 권한 범위가 자동으로 부여돼요. | 권한 범위 | 설명 | | ------------------ | ------------------------------ | | `mcp:notes:read` | 노트, transcript, 요약, 문서, 템플릿 읽기 | | `mcp:folders:read` | 사용자 및 팀 폴더 구조 검색 | 세부 권한 범위 선택은 아직 지원하지 않아요. 인증된 연결에는 전체 접근 권한이 부여돼요. *** ## API Key 종류 | API Key 종류 | 묶이는 대상 | 접근 범위 | | --------------------- | ---------- | --------------------------------------------------- | | **사용자 범위 API Key** | 한 명의 사용자 | 사용자가 접근할 수 있는 모든 노트, 요약, 문서, 폴더. 여러 워크스페이스에 걸칠 수 있음 | | **워크스페이스 범위 API Key** | 하나의 워크스페이스 | 해당 워크스페이스에서 전체 구성원에게 공유된 폴더의 노트. 사용자 신원 없음 | **어떤 키가 필요한가요?** 대부분 **사용자 범위 API Key**로 시작해요. 사용자가 속한 모든 워크스페이스에서 접근 권한이 있는 노트를 검색하고 읽을 수 있어요. **워크스페이스 범위 API Key**는 연결된 워크스페이스만 검색하고, 그 안에서도 전체 구성원에게 공유된 폴더의 노트만 조회해요([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). 개인 폴더의 노트가 필요하면 사용자 범위 API Key를 쓰세요. MCP 도구는 REST API 와 같은 키를 쓰고 같은 조회 범위 규칙을 따라요. 폴더 도구(`search_private_folders`, `search_team_folders`)에는 `mcp:folders:read` 권한이 필요해요. API Key는 [Tiro Platform API Keys 페이지](https://platform.tiro.ooo/me/api-keys)에서 폐기하지 않는 한 만료되지 않아요. 개발용과 운영용 키를 분리하고 주기적으로 교체하세요. OAuth 토큰은 **180일**간 유효해요. 교체하려면 클라이언트에서 로그아웃한 뒤 다시 로그인하세요. 즉시 폐기해야 한다면 지원팀에 문의하세요. 연결되면 [사용 가능한 도구](/ko/developers/mcp/tools/overview)를 살펴보세요. 클라이언트가 연결되지 않으면 [문제 해결](/ko/developers/mcp/troubleshooting)로 이동하세요. # auth_status Source: https://docs.tiro.ooo/ko/developers/mcp/tools/auth-status 현재 인증 상태와 권한 확인 ## 개요 `auth_status`는 인증 방식, 사용자, 부여된 scope를 반환해요. 파라미터나 별도 scope는 필요하지 않아요. **사용할 때** * 인증이 올바르게 구성됐는지 확인 * 다른 도구가 권한 오류를 반환할 때 권한 문제 디버깅 * 도구를 호출하기 전에 어떤 scope가 사용 가능한지 확인 **특징** * 파라미터 불필요 * scope 불필요 * 완전한 인증 컨텍스트 반환 *** ## 파라미터 이 도구는 파라미터를 받지 않아요. ### 요청 예시 ```json theme={"system"} {} ``` *** ## 응답 형식 ### 성공 응답 ```json theme={"system"} { "authenticated": true, "authMethod": "api_key", "userId": 12345, "workspaceGuid": null, "clientId": "client_001", "scopes": [ "mcp:notes:read", "mcp:folders:read" ] } ``` **필드 설명:** | Field | Type | Description | | --------------- | -------------- | --------------------------------------- | | `authenticated` | boolean | 이 도구가 성공적으로 반환되면 항상 `true` | | `authMethod` | string | 사용된 인증 방식: `jwt` 또는 `api_key` | | `userId` | number \| null | 인증된 사용자의 ID (user 범위 key일 때 존재) | | `workspaceGuid` | string \| null | workspace GUID (workspace 범위 key일 때 존재) | | `clientId` | string | 클라이언트 애플리케이션 ID | | `scopes` | string\[] | 부여된 권한 scope 목록 | *** ## scope 이해하기 `scopes` 배열은 사용자가 어떤 도구를 사용할 권한이 있는지 나타내요: | Scope | Grants Access To | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | | `mcp:notes:read` | `list_notes`, `search_notes`, `get_note`, `get_note_transcript`, `list_document_templates`, `get_document_template`, `get_share_link` | | `mcp:folders:read` | `search_private_folders`, `search_team_folders` | *** ## 사용 예시 ### 권한 오류 디버깅 도구 호출이 `403 Forbidden` 오류를 반환하면 `auth_status`로 scope를 확인하세요: ```json theme={"system"} // 1. Call auth_status {} // 2. Check the response { "authenticated": true, "authMethod": "api_key", "userId": 12345, "workspaceGuid": null, "clientId": "client_001", "scopes": ["mcp:notes:read"] } ``` 이 예시에서 key는 `mcp:notes:read` scope만 가지고 있어요. 다른 scope가 필요한 도구(예: 폴더 검색에 필요한 `mcp:folders:read`)는 `403 Forbidden`을 반환해요. ### API key 종류 확인 user 범위 key를 쓰는지 workspace 범위 key를 쓰는지 판단하려면 `userId`와 `workspaceGuid`를 확인하세요: * **user 범위 key:** `userId`에 사용자 식별자가 들어 있음 (여러 workspace에 걸칠 수 있음) * **workspace 범위 key:** `workspaceGuid`에 workspace 식별자가 들어 있고, 단일 workspace에 묶여 있음 *** ## 자주 발생하는 오류 ### 유효하지 않거나 만료된 자격 증명 ```json theme={"system"} { "error": "Authentication failed. Invalid or expired credentials.", "code": "UNAUTHORIZED", "statusCode": 401 } ``` **해결 방법:** API key 또는 JWT token이 올바르고 만료되지 않았는지 확인하세요. 필요하면 새 key를 발급하세요. *** ## 권장 사례 MCP 클라이언트를 초기화할 때 `auth_status`를 먼저 호출해서 연결 상태를 확인하고 사용 가능한 scope를 점검하세요. 다른 도구를 호출하기 전에 구성 문제를 조기에 잡아낼 수 있어요. 도구가 예상치 못한 권한 오류를 반환하면 `auth_status`가 문제를 진단하는 가장 빠른 방법이에요. 필요한 scope가 `scopes` 배열에 있는지, 올바른 API key 유형을 쓰고 있는지 확인하세요. # 노트 & 폴더 편집 Source: https://docs.tiro.ooo/ko/developers/mcp/tools/edit-notes-folders 노트 제목과 폴더 이름·색상·위치·순서 수정. ## 개요 아래 네 도구로 노트 제목과 폴더 구성을 바꿀 수 있어요. * **`update_note`** — 노트 제목을 수정해요. Scope `mcp:notes:write`. * **`update_folder`** — 폴더의 제목, 설명, 색상을 수정해요. Scope `mcp:folders:write`. * **`move_folder`** — 폴더를 다른 부모 아래로 이동하거나 워크스페이스 루트로 옮겨요. Scope `mcp:folders:write`. * **`reorder_folders`** — 같은 부모 아래 형제 폴더의 순서를 변경해요. Scope `mcp:folders:write`. **사용할 때** * 회의가 끝난 뒤 실제 내용에 맞게 노트 제목을 다시 붙일 때. * 폴더 이름을 바꾸거나 설명을 정리하거나 한눈에 구분되도록 색상을 바꿀 때. * 폴더 트리를 재구성할 때: 폴더를 다른 폴더 아래로 넣거나, 워크스페이스 루트로 올리거나, 형제 폴더가 표시되는 순서를 바꿀 때. **계정 API Key와 워크스페이스 API Key의 차이 (폴더 도구).** `update_folder`, `move_folder`, `reorder_folders`의 경우: **계정** API Key는 편집 권한이 있는 폴더(개인 또는 팀)라면 무엇이든 편집할 수 있어요. **워크스페이스** API Key는 **워크스페이스 전체 구성원에게 공유된 폴더만** 편집할 수 있어요. 개인 폴더와 일부 구성원에게만 공유한 폴더는 거부돼요 ([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). `update_note`는 계정·워크스페이스·조직 API Key 모두에서 동작해요. ## update\_note 노트 제목을 수정해요. ### 파라미터 | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ---------------------------- | | `noteGuid` | string | Required | 수정할 노트의 GUID. | | `title` | string | Required | 새 노트 제목. 1–100자, 공백만으로는 안 됨. | ### 예시 **요청:** ```json theme={"system"} { "noteGuid": "note_9f8c2a1b", "title": "Q1 Planning — Kickoff" } ``` **응답:** ```json theme={"system"} { "noteGuid": "note_9f8c2a1b", "title": "Q1 Planning — Kickoff", "updatedAt": "2026-07-14T09:30:00Z" } ``` ## update\_folder 폴더의 제목, 설명, 색상을 수정해요. AIP-134 field-mask 업데이트로, **전달한 필드만 변경**되고 생략한 필드는 그대로 유지돼요. 최소 한 개 필드는 필수예요. ### 파라미터 | Parameter | Type | Required | Description | | ------------- | ------ | -------- | ----------------------------- | | `folderId` | string | Required | 수정할 폴더의 ID. | | `title` | string | Optional | 새 폴더 제목. 1–50자, 공백만으로는 안 됨. | | `description` | string | Optional | 새 설명. 빈 문자열(`""`)을 전달하면 지워져요. | | `color` | string | Optional | `#RRGGBB` hex 문자열 형식의 폴더 색상. | `title`, `description`, `color` 중 최소 하나는 반드시 전달해야 해요. 생략한 필드는 변경되지 않아요. 예를 들어 제목을 다시 보내지 않고도 색상만 바꿀 수 있어요. ### 예시 **요청:** ```json theme={"system"} { "folderId": "12345", "title": "Engineering", "color": "#4C6EF5" } ``` **응답:** ```json theme={"system"} { "folderId": "12345", "title": "Engineering", "description": "Engineering team notes", "color": "#4C6EF5" } ``` ## move\_folder 폴더를 다른 부모 아래로 이동하거나 워크스페이스 루트로 옮겨요. ### 파라미터 | Parameter | Type | Required | Description | | ------------- | ------ | -------- | --------------------------------------------------- | | `folderId` | string | Required | 이동할 폴더의 ID. | | `newParentId` | string | Optional | 새 부모 폴더의 ID. `null`을 전달하거나 생략하면 폴더를 워크스페이스 루트로 옮겨요. | ### 예시 **요청:** ```json theme={"system"} { "folderId": "12346", "newParentId": "12345" } ``` 폴더 `12346`을 폴더 `12345` 아래로 이동해요. **응답:** ```json theme={"system"} { "folderId": "12346", "title": "Q1 Planning", "parentId": "12345" } ``` 폴더를 워크스페이스 루트로 옮기려면 `newParentId`를 생략하거나 `null`을 전달하세요: **요청:** ```json theme={"system"} { "folderId": "12346" } ``` ## reorder\_folders 형제 폴더의 순서를 변경해요. 한 형제 집합의 **완전한** 원하는 순서를 전달하세요. 워크스페이스는 첫 번째 폴더 ID에서 추론돼요. ### 파라미터 | Parameter | Type | Required | Description | | ------------------ | --------- | -------- | ----------------------------------------------------------------------- | | `orderedFolderIds` | string\[] | Required | 원하는 형제 순서 전체(최소 1개 ID). 모든 형제가 정확히 한 번씩 나와야 해요. 워크스페이스는 첫 번째 ID에서 추론돼요. | ### 예시 **요청:** ```json theme={"system"} { "orderedFolderIds": ["12347", "12345", "12346"] } ``` 세 형제 폴더를 주어진 순서로 재정렬해요. **응답:** ```json theme={"system"} { "orderedFolderIds": ["12347", "12345", "12346"] } ``` ## scope 요구 사항 `update_note`는 `mcp:notes:write` scope가 필요하고, `update_folder`, `move_folder`, `reorder_folders`는 `mcp:folders:write` scope가 필요해요. API key는 모든 scope를 가지므로, 유효한 API key라면 이 도구들을 호출할 수 있어요. `mcp:notes:write` / `mcp:folders:write` scope는 **OAuth 기반 클라이언트**에서 의미가 있는데, 이 경우 부여된 scope가 어떤 도구를 호출할 수 있는지를 결정해요. API key는 [Tiro Platform API Keys](https://platform.tiro.ooo/me/api-keys)에서 구성하세요. ## 관련 도구 * **[`get_note`](./get-note)** — 제목을 수정하기 전에 노트의 현재 메타데이터를 확인해요. * **[폴더 검색](./folder-search)** — 편집·이동·순서 변경 전에 이름으로 폴더의 `folderId`를 찾아요. * **[`get_note_folders`](./get-note-folders)** — 노트가 속한 폴더 목록을 확인해요. # 폴더 검색 Source: https://docs.tiro.ooo/ko/developers/mcp/tools/folder-search 이름으로 개인·팀 폴더 검색. ## 개요 `search_private_folders`와 `search_team_folders`는 이름으로 개인·팀 폴더를 찾아요. 대소문자를 구분하지 않는 부분 문자열 검색과 NFC 정규화를 사용해 한국어를 비롯한 CJK 텍스트도 검색해요. * **`search_private_folders`** — 개인(공유되지 않은) 폴더를 검색해요. * **`search_team_folders`** — 팀(워크스페이스 공유) 폴더를 검색해요. 두 도구의 파라미터와 동작은 같아요. 둘 다 `mcp:folders:read` scope가 필요하며 기본적으로 API key의 워크스페이스를 검색해요. 다른 워크스페이스를 검색하려면 `workspaceGuid`를 전달하세요. **사용할 때** * 이름의 일부만 기억날 때 특정 폴더 찾기(예: "general"은 "0.General", "General", "general-things"에 매칭). * 워크스페이스의 모든 폴더 열거하기(빈 keyword는 전체를 페이지네이션과 함께 반환). * 한국어 검색: `keyword="네이버"`는 `"네이버 모니터링"`, `"0.네이버"` 등에 매칭. **검색 방식** * 대소문자를 구분하지 않는 부분 문자열 매칭(CJK 안정성을 위해 NFC 정규화). * 폴더는 매칭 위치(이름 시작 부분일수록 상위) 기준으로, 그다음 이름 길이(짧을수록 상위) 기준으로 정렬돼요. * 각 결과에는 폴더의 breadcrumb 경로가 포함돼요(예: `"Engineering > Q1 Planning > Sprint 1"`). * 빈 keyword는 모든 폴더를 페이지네이션과 함께 반환해요. * 하위 호환을 위한 이중 응답 필드: `content`(권장)와 `folders`(레거시 별칭). **v1 구현:** 호출할 때마다 폴더 트리를 가져와 서버에서 필터링해요. 백엔드 검색 엔드포인트가 추가돼도 MCP 시그니처는 유지돼요. ## 파라미터 `search_private_folders`와 `search_team_folders`는 동일한 파라미터를 받아요: | Parameter | Type | Required | Description | | --------------- | ------ | -------- | --------------------------------------------------------------------------------------------- | | `keyword` | string | Optional | 검색할 폴더 이름 부분 문자열(대소문자 구분 안 함, NFC 정규화). 생략하면 모든 폴더를 열거해요. | | `cursor` | string | Optional | 이전 `nextCursor`에서 받은 페이지네이션 cursor. 다음 페이지를 가져오려면 이걸 전달하세요. | | `size` | number | Optional | 페이지당 결과 수(기본값 `30`, 최대 `100`). | | `workspaceGuid` | string | Optional | 워크스페이스 GUID(`list_workspaces`에서 확인). 생략하면 API key의 워크스페이스를 사용하고, 하나를 전달하면 다른 워크스페이스를 대상으로 해요. | ### keyword (선택) 대소문자를 구분하지 않는 부분 문자열 매칭이에요. 검색은 한국어, 일본어, 중국어를 비롯한 CJK 텍스트를 안정적으로 처리하기 위해 NFC(Canonical Decomposition 후 Canonical Composition)로 정규화돼요. 빈 keyword이거나 생략하면 모든 폴더를 페이지네이션과 함께 반환해요. **예시:** * `"general"`은 `"0.General"`, `"General"`, `"general-things"`에 매칭돼요(매칭 위치, 그다음 이름 길이 순으로 정렬). * `"네이버"`는 `"네이버 모니터링"`, `"0.네이버"`, `"팀별 > 네이버"`에 매칭돼요. ### cursor (선택) 다음 페이지를 가져오려면 이전 응답의 `nextCursor`를 전달하세요. 첫 페이지에서는 생략하세요. ### size (선택) 페이지당 결과 수예요. 기본값 `30`, 최대 `100`이에요. 페이지가 작을수록 응답이 빠르고, 클수록 왕복 횟수가 줄어요. ## 응답 형식 ### 성공 응답 (search\_private\_folders) ```json theme={"system"} { "content": [ { "folderId": 12345, "name": "General", "path": "General" }, { "folderId": 12346, "name": "Q1 Planning", "path": "Engineering > Q1 Planning" } ], "folders": [ { "folderId": 12345, "name": "General", "path": "General" }, { "folderId": 12346, "name": "Q1 Planning", "path": "Engineering > Q1 Planning" } ], "total": 47, "totalSize": 2, "nextCursor": "eyJvZmZzZXQiOjMwfQ==" } ``` **필드 설명:** | Field | Type | Description | | -------------------- | -------------- | --------------------------------------------------------------------------------------------------- | | `content[]` | array | 검색 결과(권장 필드). | | `content[].folderId` | number | 안정적인 폴더 식별자. | | `content[].name` | string | 폴더 이름(예: `"General"`, `"Q1 Planning"`). | | `content[].path` | string | breadcrumb 경로(예: `"Engineering > Q1 Planning > Sprint 1"`), `>`로 연결돼요. 최상위 폴더는 `path`가 `name`과 같아요. | | `folders[]` | array | `content`의 레거시 별칭. 두 배열은 동일한 데이터를 담아요. 클라이언트가 선호하는 쪽을 고르세요. | | `total` | number | keyword에 매칭되는 폴더의 총 개수(모든 페이지에 걸친 전체 결과 집합). | | `totalSize` | number | 이 페이지의 결과 수. | | `nextCursor` | string \| null | 다음 페이지를 위한 cursor. 더 이상 결과가 없으면 `null`. | 응답에는 하위 호환을 위해 `content`(권장, 최신 명명)와 `folders`(레거시 별칭)가 모두 포함돼요. 둘은 같은 배열 객체를 참조하므로 코드에서 선호하는 쪽을 고르고 다른 쪽은 무시하세요. ## 사용 예시 ### 예시 1: search\_private\_folders — 단순 keyword **요청:** ```json theme={"system"} { "keyword": "general" } ``` "general"에 매칭되는(대소문자 구분 안 함) 모든 개인 폴더를 페이지네이션과 함께 반환해요. **응답:** ```json theme={"system"} { "content": [ { "folderId": 100, "name": "General", "path": "General" }, { "folderId": 101, "name": "0.General Announcements", "path": "General Folder > 0.General Announcements" } ], "total": 2, "totalSize": 2, "nextCursor": null } ``` ### 예시 2: search\_team\_folders — 한국어 keyword **요청:** ```json theme={"system"} { "keyword": "네이버" } ``` 이름에 "네이버"가 들어간 모든 팀 폴더를 반환해요(CJK 매칭을 위해 NFC 정규화). **응답:** ```json theme={"system"} { "content": [ { "folderId": 200, "name": "네이버", "path": "파트너십 > 네이버" }, { "folderId": 201, "name": "네이버 API 모니터링", "path": "기술 > 파트너 > 네이버 API 모니터링" } ], "total": 2, "totalSize": 2, "nextCursor": null } ``` ### 예시 3: 모든 폴더 열거 (빈 keyword) **요청:** ```json theme={"system"} { "keyword": "", "size": 50 } ``` 처음 50개 폴더(모든 최상위 및 중첩 폴더)를 특정 순서 없이 반환해요. **응답:** ```json theme={"system"} { "content": [ { "folderId": 1, "name": "Engineering", "path": "Engineering" }, { "folderId": 2, "name": "Q1 Planning", "path": "Engineering > Q1 Planning" }, { "folderId": 3, "name": "General", "path": "General" } ], "total": 137, "totalSize": 3, "nextCursor": "eyJvZmZzZXQ6NTB9" } ``` ### 예시 4: 페이지네이션 **첫 페이지 (cursor 생략):** ```json theme={"system"} { "keyword": "sprint", "size": 20 } ``` **두 번째 페이지 (첫 응답의 nextCursor 사용):** ```json theme={"system"} { "keyword": "sprint", "size": 20, "cursor": "eyJvZmZzZXQ6MjB9" } ``` ## 정렬 순서 결과는 매칭 위치 기준으로, 그다음 폴더 이름 길이 기준(매칭 위치가 같으면 짧은 이름이 상위)으로 정렬돼요: 1. **매칭 위치 오름차순** — `name`이 keyword로 **시작하는** 폴더가 이름 **뒷부분**에서 keyword를 포함하는 폴더보다 상위에 와요. * `keyword="general"` → `"General"`(위치 0)이 `"0.General"`(위치 2)보다 상위. 2. **이름 길이 오름차순** — 매칭 위치가 같으면 짧은 이름이 상위에 와요. * 둘 다 위치 0에서 "gen"에 매칭: `"General"`(7자)이 `"General Announcements"`(21자)보다 상위. 이렇게 해서 가장 구체적인 매칭이 먼저 나타나요. ## 권장 사례 `search_private_folders`는 개인(공유되지 않은) 폴더를 검색하고, `search_team_folders`는 팀(워크스페이스 공유) 폴더를 검색해요. 둘 다 `mcp:folders:read` scope가 있는 key면 받아요. 도구는 폴더 타입으로 고르세요. 매칭되는 폴더가 없으면 결과는 오류가 아니라 빈 목록이에요. 두 도구 모두 기본적으로 API key의 워크스페이스에서 동작해요. 접근 가능한 다른 워크스페이스의 폴더를 검색하려면 `list_workspaces`에서 얻은 명시적인 `workspaceGuid`를 전달하세요. 한국어, 일본어, 중국어 텍스트는 서버 측에서 자동으로 NFC 정규화돼요. keyword를 미리 전처리할 필요 없이 원본 텍스트를 그대로 전달하면 매칭 엔진이 알아서 처리해요. 예시: `keyword="네이버"`는 같은 텍스트의 결합형 또는 분해형 폴더에 모두 매칭돼요. 항상 이전 응답에서 반환된 `nextCursor`를 사용하세요. offset을 직접 계산하려고 하지 마세요. 페이지네이션 동작은 향후 릴리스에서 바뀔 수 있어요. 필터 없이 폴더의 전체 목록을 가져오려면 `keyword`를 생략하거나 빈 문자열을 전달하세요. `size`와 `nextCursor`로 전체 결과 집합을 페이지네이션하세요. ## 자주 발생하는 오류 ### 권한 scope 부족 ```json theme={"system"} { "error": "FORBIDDEN", "message": "Insufficient scope: mcp:folders:read required", "statusCode": 403 } ``` **해결 방법:** API key에 `mcp:folders:read` scope가 없어요. 올바른 scope로 새 key를 발급하거나 워크스페이스 관리자에게 권한 부여를 요청하세요. ## 토큰 사용량 | Operation | Tokens | | -------------------- | --------- | | 빈 keyword (모든 폴더 열거) | \~200–500 | | keyword 검색 | \~200–500 | 폴더 검색은 가벼워요. 결과에는 콘텐츠가 아니라 이름과 경로만 포함돼요. ## scope 요구 사항 `search_private_folders`와 `search_team_folders`는 모두 `mcp:folders:read` scope가 필요해요. API key는 [Tiro Platform API Keys](https://platform.tiro.ooo/me/api-keys)에서 구성하세요. **참고:** `mcp:folders:write` scope는 더 이상 존재하지 않아요(2026-05-06 기준). 모든 폴더 쓰기 작업이 제거됐어요. `mcp:folders:write`가 있는 오래된 API key가 있다면 무시돼요. 이 scope는 사용되지 않아요. ## 관련 도구 * **[`list_notes`](./list-notes)** — `filter.folderId`를 사용해 특정 폴더 안의 노트를 찾아요(별도의 "폴더 목록" 도구가 필요 없어요). * **[`search_notes`](./search-notes)** — `filter.folderId`로 폴더 안의 노트를 검색해요(keyword가 필수인 심층 검색). # get_note Source: https://docs.tiro.ooo/ko/developers/mcp/tools/get-note 노트 메타데이터와 요약·전사·문서를 함께 조회. ## 개요 `get_note`는 노트 메타데이터를 조회해요. `include`에 `summary`, `transcript`, `documents`를 넣으면 해당 내용도 함께 반환해요. 각 항목은 병렬로 조회하므로 하나가 실패해도 나머지는 반환돼요. 이 도구는 2026-05-06에 제거된 `list_note_summaries`, `get_note_summary`, `list_note_documents`, `get_note_document`를 대체해요. **사용할 때** * 노트의 기본 정보(참가자, 날짜, 길이)만 필요하면 메타데이터만 가져와요. * AI가 생성한 요약의 전체 내용을 얻으려면 `summary`를 포함하세요. * 전체 대화 텍스트(타임스탬프가 붙은 단락이 하나의 문자열로 연결됨)를 얻으려면 `transcript`를 포함하세요. * 노트의 모든 생성 문서(one-pager, custom 등)를 전체 내용과 함께 가져오려면 `documents`를 포함하세요. **동작 방식** * `Promise.allSettled`를 사용한 병렬 가져오기. 한 리소스가 실패해도 나머지는 그대로 반환돼요. * `include`는 선택적 배열 enum이에요: `["summary"]`, `["transcript"]`, `["documents"]` 또는 이들의 조합. * `documents` 옵션은 노트의 모든 문서에 대해 **전체 내용**을 반환해요(5KB로 제한하는 `search_notes`와 달리). * `include`가 비었거나 생략되면 메타데이터만 반환해요. 워크스페이스 범위 API Key로 개인 폴더의 노트를 요청하면 삭제된 노트와 같은 "찾을 수 없음"으로 응답해요([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). **참고:** `get_note`는 설계상 전체 문서 내용을 반환해요. 문서당 5KB로 제한하는 `search_notes`보다 무거워요. 내용 미리보기가 필요하면 대신 `search_notes`를 사용하세요. ## 파라미터 | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ------------------------------------------------------------------------------------------------------ | | `noteGuid` | string | **Yes** | 고유 노트 식별자. 보통 `list_notes`나 `search_notes`에서 얻어요. | | `include` | array | Optional | 콘텐츠 옵션 배열: `"summary"`, `"transcript"`, `"documents"`. 모두 선택이며 추가 방식이에요. 생략하거나 빈 배열을 전달하면 메타데이터만 반환해요. | ### noteGuid (필수) 노트의 고유 식별자예요. **예시:** ```json theme={"system"} { "noteGuid": "abc-123-def" } ``` ### include (선택) 병렬로 가져올 콘텐츠 유형의 배열이에요. 유효한 옵션: * `"summary"` — 노트에서 처음으로 사용 가능한 AI 생성 요약을 가져와요(전체 내용). * `"transcript"` — 전체 대화 transcript를 가져와요(단락이 `\n\n`로 연결됨). * `"documents"` — 노트의 모든 생성 문서(one-pager, custom 등)를 전체 내용과 함께 가져와요. **예시:** ```json theme={"system"} // Metadata only {} // With summary { "include": ["summary"] } // With transcript and documents { "include": ["transcript", "documents"] } // All three { "include": ["summary", "transcript", "documents"] } ``` ## 응답 형식 ### 성공 응답 ```json theme={"system"} { "noteGuid": "abc-123-def", "guid": "abc-123-def", "title": "Q2 OKR Planning", "webUrl": "https://platform.tiro.ooo/notes/abc-123-def", "participants": [ { "name": "Alice Kim", "email": "alice@example.com" }, { "name": "Bob Park", "email": null } ], "createdAt": "2026-04-15T10:00:00Z", "updatedAt": "2026-04-15T11:30:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice", "summary": { "content": "## Key Decisions\n- Q2 roadmap prioritizes...\n## Action Items\n- Alice: finalize spec by...", "format": "MARKDOWN", "summaryId": "summary-id-123" }, "transcript": "[10:00:05] Alice: Let's start with Q2 planning.\n[10:00:18] Bob: Sure, here's what...", "documents": [ { "documentId": 42, "templateId": 1, "templateTitle": "One Pager", "locale": "en", "sections": [ { "content": "## OKR Goals\nGoal 1: ...", "format": "MARKDOWN" } ], "createdAt": "2026-04-15T11:30:00Z" } ] } ``` **필드 설명:** | Field | Type | Description | | -------------------------------- | ------ | ----------------------------------------------------------------------------------------- | | `noteGuid` / `guid` | string | 노트 식별자(하위 호환을 위해 두 필드 모두 존재). | | `title` | string | 노트 제목. | | `webUrl` | string | Tiro 웹 앱에서 노트로 바로 가는 링크. | | `createdAt` | string | ISO 8601 생성 타임스탬프. | | `updatedAt` | string | ISO 8601 마지막 수정 타임스탬프. | | `recordingDurationSeconds` | number | 녹음 길이(초). | | `sourceType` | string | `live-voice`, `recording`, `text`, `video`, `webpage`, `offline-mode`, `onboarding` 중 하나. | | `participants[]` | array | 참가자별 `{ name, email }`. 둘 중 어느 쪽이든 `null`일 수 있어요. | | `summary` (포함된 경우) | object | 요약이 있으면 `{ content, format, summaryId }`, 없으면 `null`. | | `summary.content` | string | 요약 텍스트(HTML 제거, markdown 친화적). | | `summary.format` | string | `MARKDOWN` 또는 `PLAIN_TEXT`. | | `summary.summaryId` | string | 요약의 식별자. | | `transcript` (포함된 경우) | string | `[HH:MM:SS]`가 앞에 붙은 줄들로 이뤄진 전체 transcript, `\n\n`로 연결돼요. transcript가 없으면 `null`. | | `documents` (포함된 경우) | array | 문서 객체 배열, 없으면 `null`. `include: ["documents"]`를 요청했지만 노트에 문서가 없으면 빈 배열 `[]`. | | `documents[].documentId` | number | 안정적인 문서 식별자. | | `documents[].templateId` | number | 숫자 template id(구분에는 `templateTitle`이 아니라 이걸 사용하세요). | | `documents[].templateTitle` | string | 표시 라벨(locale에 따라 달라지며 custom 템플릿은 사용자가 편집 가능). | | `documents[].locale` | string | 문서의 locale(예: `"en"`, `"ko"`). | | `documents[].sections[]` | array | `{ content, format }` 섹션 배열. | | `documents[].sections[].content` | string | 섹션 텍스트(HTML 제거). | | `documents[].sections[].format` | string | 콘텐츠 형식(`MARKDOWN`, `PLAIN_TEXT` 등). | | `documents[].createdAt` | string | ISO 8601 문서 생성 타임스탬프. | 요청한 리소스를 사용할 수 없을 때(예: 요약이 없을 때) 해당 필드는 생략되지 않고 `null`로 설정돼요. 이를 통해 호출자는 "요청에 포함되지 않음"과 "포함했지만 사용 불가"를 구분할 수 있어요. ## 사용 예시 ### 예시 1: 메타데이터만 **요청:** ```json theme={"system"} { "noteGuid": "abc-123-def" } ``` **응답:** ```json theme={"system"} { "noteGuid": "abc-123-def", "title": "Q2 Planning", "participants": [{ "name": "Alice Kim", "email": "alice@example.com" }], "createdAt": "2026-04-15T10:00:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice" } ``` ### 예시 2: 요약만 포함 **요청:** ```json theme={"system"} { "noteGuid": "abc-123-def", "include": ["summary"] } ``` **응답:** ```json theme={"system"} { "noteGuid": "abc-123-def", "title": "Q2 Planning", "participants": [{ "name": "Alice Kim", "email": "alice@example.com" }], "createdAt": "2026-04-15T10:00:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice", "summary": { "content": "## Key Decisions\n- OKR prioritizes feature X...\n## Action Items\n- Alice: finalize spec", "format": "MARKDOWN", "summaryId": "summary-id-123" } } ``` ### 예시 3: transcript와 문서 포함 **요청:** ```json theme={"system"} { "noteGuid": "abc-123-def", "include": ["transcript", "documents"] } ``` **응답:** ```json theme={"system"} { "noteGuid": "abc-123-def", "title": "Q2 Planning", "participants": [{ "name": "Alice Kim", "email": "alice@example.com" }], "createdAt": "2026-04-15T10:00:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice", "transcript": "[10:00:05] Alice: Let's start with Q2 planning...\n[10:00:18] Bob: Sure...", "documents": [ { "documentId": 42, "templateId": 1, "templateTitle": "One Pager", "locale": "en", "sections": [ { "content": "## OKR Goals\n...", "format": "MARKDOWN" } ], "createdAt": "2026-04-15T11:30:00Z" } ] } ``` ### 예시 4: 한 번의 호출로 모든 콘텐츠 **요청:** ```json theme={"system"} { "noteGuid": "abc-123-def", "include": ["summary", "transcript", "documents"] } ``` 메타데이터, 요약, 전체 transcript, 모든 문서를 병렬로 반환해요. 그중 하나라도 실패하면(예: 요약이 없을 때) 해당 필드는 `null`이지만 나머지는 그대로 채워져요. ## 권장 사례 필요한 콘텐츠만 요청하세요. 메타데이터는 약 50 토큰이고, 요약을 추가하면 약 200 토큰이, transcript는 시간당 약 3,000\~5,000 토큰이 추가돼요. 문서는 크기에 따라 달라요. 메타데이터로 시작해서 빠른 개요가 필요하면 `get_note(include: ["summary"])`로, action item이나 핵심 정리가 필요하면 `get_note(include: ["documents"])`로 전환하세요. 노트에 무엇이 들어 있는지 빠르게 보려면 먼저 [`search_notes`](./search-notes)를 사용하세요. 5KB로 제한된 문서와 함께 매칭된 노트를 반환해요. 문서의 **전체** 내용이 필요할 때만 `get_note(include: ["documents"])`를 사용하세요. `include: ["summary"]`를 설정했지만 요약이 없으면 `summary`는 `null`이 돼요. 코드에서 이를 처리해야 해요. 요청했다는 이유만으로 필드가 항상 채워진다고 가정하지 마세요. 점진적 공개(progressive disclosure) 패턴: `list_notes` → `search_notes` → `get_note(include: [...])`. 대부분의 워크플로우는 2단계에서 멈춰요. 전체 내용이 필요하거나 앞선 도구로 충분하지 않을 때만 3단계를 사용하세요. ## 자주 발생하는 오류 ### 노트를 찾을 수 없음 ```json theme={"system"} { "error": "Note not found", "code": "NOT_FOUND", "statusCode": 404 } ``` **해결 방법:** `noteGuid`가 올바른지 확인하세요. `list_notes`나 `search_notes`로 유효한 노트 식별자를 찾으세요. ### 권한 scope 부족 ```json theme={"system"} { "error": "Insufficient scope: mcp:notes:read required", "code": "FORBIDDEN", "statusCode": 403 } ``` **해결 방법:** API key에 `mcp:notes:read` scope가 있는지 확인하세요. scope 구성은 [Setup](/ko/developers/mcp/setup)을 참고하세요. ## 토큰 사용량 | Mode | Tokens | | ------------------ | ---------------------------- | | 메타데이터만 | \~50 | | 메타데이터 + 요약 | \~250 | | 메타데이터 + transcript | 시간당 \~3,000–5,000 | | 메타데이터 + 문서 | \~1,000–5,000 (문서 크기에 따라 다름) | | 세 가지 모두 | \~4,000–10,000 (가변) | **통합으로 절감:** 예전의 `list_note_summaries` + `get_note_summary` 체인이 이제 한 번의 `get_note(include: ["summary"])` 호출로 처리돼요. `list_note_documents` + `get_note_document` → `get_note(include: ["documents"])`도 마찬가지예요. ## 관련 도구 * **[`search_notes`](./search-notes)** — keyword로 노트를 찾고 그 문서까지 읽어야 할 때. 문서당 5KB로 제한된 문서 내용과 함께 최대 10개의 매칭 노트를 반환해요. * **[`list_notes`](./list-notes)** — 어떤 노트가 있는지만 알면 될 때. 가장 가벼운 단계로 메타데이터만 반환해요. * **[`get_note_transcript`](./get-transcript)** — 타임스탬프가 있는 원본 transcript용(대체 수단이며, 병렬 가져오기에는 대신 이 도구에서 `include: ["transcript"]`를 사용하세요). * **[`list_document_templates`](./overview)** — 문서를 요청하기 전에 사용 가능한 문서 템플릿 유형을 확인하세요. # 노트 폴더 조회 Source: https://docs.tiro.ooo/ko/developers/mcp/tools/get-note-folders 노트 GUID로 노트가 속한 폴더 조회. ## 개요 `get_note_folders`에 노트 GUID를 전달하면 그 노트가 속한 폴더를 반환해요. 폴더 안의 노트를 찾는 `list_notes`의 `filter.folderId`와 반대 방향으로 조회해요. 폴더 이름으로 찾으려면 `search_private_folders`나 `search_team_folders`를 사용하세요. 노트가 속한 폴더를 찾을 때만 `get_note_folders`를 사용해요. **사용할 때** * 노트가 위치한 곳 표시("이 노트는 Engineering > Q1 Planning 아래에 정리되어 있습니다"). * 후속으로 어떤 폴더 검색 도구를 쓸지 판단: 각 결과의 `isTeamFolder` 플래그로 해당 폴더가 팀(워크스페이스 공유) 폴더인지 개인 폴더인지 알 수 있습니다. ## 파라미터 | 파라미터 | 타입 | 필수 | 설명 | | ---------- | ------ | -- | -------------------- | | `noteGuid` | string | 필수 | 폴더 목록을 조회할 노트의 GUID. | ## 응답 형식 ```json theme={"system"} { "content": [ { "folderId": "12345", "name": "Project Discussion", "workspaceGuid": "ws_abc123", "isTeamFolder": true }, { "folderId": "12346", "name": "Daily Standup", "workspaceGuid": "ws_abc123", "isTeamFolder": false } ], "total": 2 } ``` **필드 설명:** | 필드 | 타입 | 설명 | | ------------------------- | ------- | ------------------------------------------------- | | `content[]` | array | 노트가 속한 폴더 목록. 어떤 폴더에도 정리되어 있지 않으면 빈 배열. | | `content[].folderId` | string | 안정적인 폴더 식별자. | | `content[].name` | string | 폴더 이름. | | `content[].workspaceGuid` | string | 폴더가 속한 워크스페이스의 GUID. 항상 존재(노트 폴더는 항상 워크스페이스에 속함). | | `content[].isTeamFolder` | boolean | 팀(워크스페이스 공유) 폴더면 `true`, 개인 폴더면 `false`. | | `total` | number | 반환된 폴더 개수. | 폴더 목록은 서버에서 접근 권한 필터링됩니다. 노트의 워크스페이스와 호출자 멤버십을 통해 호출자가 접근 가능한 폴더만 반환됩니다. ## 사용 예시 **요청:** ```json theme={"system"} { "noteGuid": "note_abc123" } ``` **응답:** ```json theme={"system"} { "content": [ { "folderId": "200", "name": "Engineering", "workspaceGuid": "ws_abc123", "isTeamFolder": true } ], "total": 1 } ``` ## 스코프 요구사항 `get_note_folders`는 `mcp:notes:read`와 `mcp:folders:read` 스코프를 **둘 다** 요구합니다. 접근 가능한 노트를 키로 하지만(notes 스코프) 폴더 메타데이터를 반환하므로(folders 스코프 — `search_*_folders` 도구가 요구하는 것과 동일), 두 스코프가 모두 필요합니다. 추가로 노트 접근 권한으로도 게이팅됩니다. 노트를 읽을 수 없는 호출자는 그 노트의 폴더도 조회할 수 없습니다. API Key는 모든 스코프를 포함하며, OAuth 토큰은 두 스코프를 모두 부여받아야 합니다. API Key는 [Tiro Platform API Keys](https://platform.tiro.ooo/me/api-keys)에서 설정하세요. ## 관련 도구 * **[`list_notes`](./list-notes)** — 정방향: `filter.folderId`로 폴더 안의 노트를 나열. * **[`get_note`](./get-note)** — 노트 자체의 메타데이터와 콘텐츠 조회. * **[`search_private_folders` / `search_team_folders`](./folder-search)** — 노트가 없을 때 폴더 이름으로 폴더 트리 검색. # get_note_transcript Source: https://docs.tiro.ooo/ko/developers/mcp/tools/get-transcript 회의 노트의 전체 전사와 화자 정보 조회. ## 개요 **정확한 발화가 필요할 때만 사용하세요.** 1시간짜리 전사는 30K 토큰을 넘을 수 있어요. 먼저 [`search_notes`](./search-notes)로 주요 문서를 확인하세요. **호환성 변경 (2026-05-06).** 응답 형태가 화자 귀속 segment 중심으로 통합됐어요. `transcription`, `paragraphs[].text`, `hasDiarization`, `totalParagraphs` 필드는 **제거**됐어요. 이제 모든 단락은 `{content, speaker}`를 담은 `segments[]` 배열을 노출해요. diarization 데이터가 있으면 `speaker`는 `{label, name}`이고, 없으면 `null`이에요. 아래 [Migration](#migration) 섹션을 참고해 새 형태에서 옛 필드를 재구성하세요. `get_note_transcript`는 노트의 **전체 transcript**를 화자 귀속 segment의 단락들로, 노트 메타데이터와 함께 반환해요. 노트에 diarization 데이터가 있든 없든 형태는 동일해요. 모든 단락은 `segments[]` 배열을 가지며, 각 segment에는 `content` 문자열과 `speaker` 객체(또는 `null`)가 있어요. `content`와 `speaker.name`은 둘 다 MCP 레이어에서 HTML이 제거돼요. **사용할 때** * 회의에서 실제로 말한 단어를 그대로 인용. * **누가 무엇을 말했는지** 파악. segment별 `speaker` 필드가 이 도구의 주요 사용 사례예요. * 구조화된 `paragraphs` 배열을 사용해 transcript를 시간 범위로 잘라내기. * 문서가 필요한 표현을 담지 못할 때 대화 맥락 분석. **응답 특징** * 일관된 형태: diarization 가용 여부와 관계없이 모든 단락이 `segments[]`를 포함해요. * 화자 정보: `segment.speaker`는 diarization이 있으면 `{label, name}`, 없으면 `null`이에요. * MCP 레이어에서 HTML 제거(`content`와 `speaker.name` 모두 정제됨). **무료·미결제 노트는 전사가 일부 가려질 수 있어요.** 노트가 무료 사용 한도를 넘었고 유료 플랜이 아니면, 한도를 넘는 단락의 `content`가 마스킹된 채 반환돼요. 글자 수와 구조는 그대로지만 단어가 자리표시 문자로 바뀌어 실제 발화 대신 뜻 없는 텍스트로 보여요. transcript가 중간부터 깨져 보인다면 대부분 버그가 아니라 이 마스킹이에요. 유료 플랜을 시작하면 노트 잠금이 풀리고 전체 전사가 반환돼요. ## 파라미터 | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ----------- | | `noteGuid` | string | Yes | 고유 노트 식별자 | ### noteGuid (필수) 가져올 노트의 고유 식별자예요. **예시:** ```json theme={"system"} { "noteGuid": "abc-123-def" } ``` **노트 GUID를 얻는 방법:** 1. [`list_notes`](./list-notes)(가벼움)를 사용해 폴더, 날짜, keyword로 후보를 찾으세요. 2. 결과에서 `noteGuid`를 사용하세요. 맥락을 위한 문서 내용도 필요하면 먼저 [`search_notes`](./search-notes)로 가져오고, 그대로 받아 적은 발화가 필요할 때만 이 도구로 돌아오세요. ## 응답 형식 ### 성공 응답 — diarization된 노트 노트에 diarization 데이터가 있으면 단락은 하나 이상의 segment를 포함하고, 각 segment의 `speaker`는 `label`(엔진이 할당하고 노트 내에서 안정적)과 `name`(해석된 사람 이름, 화자가 매핑되지 않으면 `null`)을 가진 객체예요: ```json theme={"system"} { "noteGuid": "abc-123-def", "title": "Weekly Team Meeting", "participants": ["Alice Kim", "Bob Park"], "createdAt": "2024-01-15T10:30:00Z", "recordingDurationSeconds": 3625, "paragraphs": [ { "timeFrom": "2024-01-15T10:30:05Z", "timeTo": "2024-01-15T10:30:18Z", "segments": [ { "content": "Let's start with the project update.", "speaker": { "label": "SPEAKER_0", "name": "Alice Kim" } }, { "content": "Sure, I've completed the migration.", "speaker": { "label": "SPEAKER_1", "name": "Bob Park" } } ] } ] } ``` ### 성공 응답 — diarization되지 않은 노트 노트에 diarization 데이터가 없으면 각 단락은 `speaker`가 `null`인 단일 segment로 축약돼요. 그 외 형태는 동일하므로 호출자는 분기 없이 `paragraphs[].segments[]`를 순회할 수 있어요: ```json theme={"system"} { "noteGuid": "abc-123-def", "title": "Solo Voice Memo", "participants": ["Alice Kim"], "createdAt": "2024-01-15T10:30:00Z", "recordingDurationSeconds": 120, "paragraphs": [ { "timeFrom": "2024-01-15T10:30:05Z", "timeTo": "2024-01-15T10:30:18Z", "segments": [ { "content": "Reminder to send the contract by Friday.", "speaker": null } ] } ] } ``` **필드 설명:** | Field | Type | Description | | --------------------------------------- | -------------- | -------------------------------------------------------------- | | `noteGuid` | string | 고유 노트 식별자. | | `title` | string | 노트 제목. | | `participants` | string\[] | 참가자 이름(이름을 쓸 수 없으면 이메일). | | `createdAt` | string | ISO 8601 생성 타임스탬프. | | `recordingDurationSeconds` | number | 녹음 길이(초). | | `paragraphs[]` | array | 구조화된 단락. 각 단락은 하나 이상의 화자 귀속 segment를 담은 시간 경계 청크예요. | | `paragraphs[].timeFrom` | string \| null | 단락의 ISO 8601 시작 시각. | | `paragraphs[].timeTo` | string \| null | 단락의 ISO 8601 종료 시각. | | `paragraphs[].segments[]` | array | 단락의 화자 귀속 조각들. 단락이 반환될 때는 항상 비어 있지 않아요(빈 segment와 빈 단락은 필터링됨). | | `paragraphs[].segments[].content` | string | segment의 HTML 제거된 일반 텍스트 내용. | | `paragraphs[].segments[].speaker` | object \| null | diarization 데이터가 있으면 `{label, name}`, 없으면 `null`. | | `paragraphs[].segments[].speaker.label` | string | diarization 엔진 라벨(예: `SPEAKER_0`). 단일 노트 내에서 안정적. | | `paragraphs[].segments[].speaker.name` | string \| null | 사용자가 화자를 매핑한 경우 해석된 사람 이름, 아니면 `null`. | ## Migration 2026-05-06 이전 응답은 `transcription`(연결된 문자열), `paragraphs[].text`(단락별 일반 텍스트), `hasDiarization`, `totalParagraphs`를 담았어요. 이 네 가지 모두 사라졌어요. 새 형태에서 다음과 같이 재구성할 수 있어요: ```js theme={"system"} // Reconstruct the old `paragraphs[].text` field. const text = paragraph.segments.map(s => s.content).join(" "); // Reconstruct the old `transcription` joined string. const transcription = response.paragraphs .map(p => { const ts = p.timeFrom ? `[${p.timeFrom.slice(11, 19)}] ` : ""; return ts + p.segments.map(s => s.content).join(" "); }) .join("\n"); // Reconstruct the old `hasDiarization` flag. const hasDiarization = response.paragraphs.some(p => p.segments.some(s => s.speaker !== null) ); // Reconstruct the old `totalParagraphs` count. const totalParagraphs = response.paragraphs.length; ``` "누가 무엇을 말했는지"가 필요하면 `segments[].speaker`를 직접 읽으세요. 그게 이 도구의 새로운 주요 사용 사례예요. ## 사용 예시 ### 예시 1: 기본 사용 **AI 요청:** ``` Show me the full transcript of meeting abc-123-def ``` **MCP 호출:** ```json theme={"system"} { "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "get_note_transcript", "arguments": { "noteGuid": "abc-123-def" } }, "id": 1 } ``` **응답:** ```json theme={"system"} { "jsonrpc": "2.0", "result": { "noteGuid": "abc-123-def", "title": "Q4 Marketing Strategy Meeting", "participants": ["Sarah Kim", "John Park"], "createdAt": "2025-11-10T10:00:00Z", "recordingDurationSeconds": 3625, "paragraphs": [ { "timeFrom": "2025-11-10T10:00:05Z", "timeTo": "2025-11-10T10:00:18Z", "segments": [ { "content": "Welcome to the Q4 marketing strategy meeting.", "speaker": { "label": "SPEAKER_0", "name": "Sarah Kim" } } ] }, { "timeFrom": "2025-11-10T10:00:18Z", "timeTo": "2025-11-10T10:00:42Z", "segments": [ { "content": "Thanks. Let me present our website analytics.", "speaker": { "label": "SPEAKER_1", "name": "John Park" } } ] } ] }, "id": 1 } ``` ### 예시 2: 점진적 공개 패턴 **1단계: 검색** ``` Find recent marketing meetings ``` `search_notes` 사용 - 빠름(\~1초, \~100 토큰) **2단계: 요약** ``` What was discussed in meeting abc-123-def? ``` `get_note(include: ['summary'])` 사용 - 중간(\~2초, \~500 토큰) **3단계: 전체 transcript (필요할 때만)** ``` Show me the exact conversation about budget allocation ``` `get_note_transcript` 사용 - 느림(\~5초, \~4,000 토큰) ## 토큰 사용량 **일반적인 회의 (1시간):** \~3,000-5,000 토큰 2026-05-06 이전 형태와 비교하면 단일 화자 노트는 중복되던 `transcription` 연결 문자열이 더 이상 방출되지 않아 **약 30% 감소**해요. 다중 화자(diarization된) 노트는 거의 비슷해요. segment별 `speaker` 메타데이터가 옛 `transcription` 페이로드를 대체하고, segment 내용은 옛 `text` 필드가 담던 것과 같은 데이터예요. **비교 (3단계 디스커버리):** | Tool | Token Usage | When to Use | | ---------------------------------- | ------------------------ | -------------------------- | | `list_notes` | 노트당 \~50 토큰 | 어떤 노트가 있는지 찾기(메타데이터만) | | `search_notes` | 노트당 \~1,500 토큰 | 주제 이면의 **내용** 읽기(문서 반환) | | **`get_note_transcript`** | **시간당 \~3,000-5,000 토큰** | **최후의 수단 — 인용을 위한 정확한 발화** | | `get_note(include: ['summary'])` | \~200-800 토큰 | 노트 하나의 빠른 AI 요약 | | `get_note(include: ['documents'])` | \~300-2,000 토큰 | 특정 생성 문서 | **토큰 절감** 먼저 [`search_notes`](./search-notes)를 사용하세요. 문서 출력이 보통 원본 transcript보다 10배 더 압축적이고 "팀이 무엇을 결정했나" 같은 질문 대부분에 답해줘요. 정말로 그대로 받아 적은 표현이 필요할 때만 `get_note_transcript`를 사용하세요. ## 권장 사례 항상 이 순서를 따르세요: 1. **list\_notes** — 어떤 노트가 있는지 찾기(노트당 \~50 토큰) 2. **search\_notes** — 매칭된 주제의 문서 읽기(노트당 \~1,500 토큰) 3. **get\_note\_transcript** — 정확한 표현이 필요할 때만(시간당 \~4,000 토큰) "우리가 무엇을 결정했지?" 같은 질문 대부분은 2단계에서 멈춰요. 곧바로 transcript로 가는 것보다 최대 90%의 토큰을 절약할 수 있어요. 다음이 필요할 때 전체 transcript를 사용하세요: * 정확한 인용이나 발언 찾기 * 상세한 대화 흐름 분석 * 완전한 맥락 이해 * 특정 논의 참조 * **누가 무엇을 말했는지** 파악. `segments[].speaker` 필드가 이를 이 도구의 주요 사용 사례로 만들어요. 다음에는 transcript를 사용하지 마세요: * 빠른 개요(대신 `get_note(include: ['summary'])`) * action item(`get_note(include: ['documents'])`) * 전반적 이해(`get_note(include: ['summary'])`) 아주 긴 회의(2시간 이상)에서는: * 5,000\~10,000 토큰을 예상하세요 * timeout(60초)이 발생할 수 있어요 * 먼저 요약으로 특정 섹션을 요청하는 것을 고려하세요 * 전체 transcript를 불러오기 전에 요약으로 관련 부분을 파악하세요 ## 자주 발생하는 오류 ### 노트 GUID 누락 ```json theme={"system"} { "error": "noteGuid is required", "code": "MISSING_NOTE_GUID", "statusCode": 400 } ``` **해결 방법:** `noteGuid` 파라미터를 제공하세요. ### 노트를 찾을 수 없음 ```json theme={"system"} { "error": "Note not found", "code": "NOTE_NOT_FOUND", "statusCode": 404 } ``` **가능한 원인:** * 노트가 존재하지 않음 * 노트가 삭제됨 * 이 노트에 접근할 권한이 없음 **해결 방법:** `search_notes`로 노트 GUID를 확인하세요. ### 요청 timeout ```json theme={"system"} { "error": "Request timeout", "code": "REQUEST_TIMEOUT", "statusCode": 504 } ``` **원인:** * 아주 긴 회의 transcript(2시간 이상) * 서버 부하 **해결 방법:** 1. 대신 `get_note(include: ['summary'])`를 사용하세요 2. 잠시 후 재시도하세요 3. 문제가 계속되면 지원팀에 문의하세요 ## 성능 **응답 시간:** | Meeting Length | Tokens | Response Time | | -------------- | -------- | ---------------- | | 30분 | \~1,500 | \~2초 | | 1시간 | \~3,000 | \~3초 | | 2시간 | \~6,000 | \~5초 | | 3시간 이상 | \~9,000+ | \~8초(timeout 가능) | **캐시 동작** transcript는 15분간 캐시돼요. 같은 노트에 대한 후속 요청은 더 빨라요. # list_notes Source: https://docs.tiro.ooo/ko/developers/mcp/tools/list-notes 필터와 키워드로 노트 메타데이터 조회. ## 개요 `list_notes`는 제목, 참가자, 날짜, 소스 유형 같은 메타데이터만 반환해요. 노트 내용을 읽지 않고 목록만 확인할 때 사용하세요. `query.keyword`가 제공되면 결과 집합은 `recordingStartAt` 내림차순 대신 전문 검색(full-text) 관련도(동점 시 `createdAt` 내림차순)로 재정렬돼요. **사용할 때** * "폴더 X에 어떤 노트가 있지?" * "어떤 노트가 keyword Y에 매칭되지?"(존재 여부만 확인) * 날짜 범위로 필터링해 큰 워크스페이스 좁히기. **동작 방식** * [`search_notes`](./search-notes)(심층, 문서 반환), [`get_note_transcript`](./get-transcript)(원본 transcript)와 함께 3단계 모델을 이뤄요. * 목록 경로에서 cursor 기반 페이지네이션. * 미완성 노트는 자동으로 제외해요. 녹음이 시작된 적 없고 제목이 기본 placeholder인 노트는 MCP 레이어에서 필터링돼요. 워크스페이스 범위 API Key로 호출하면 개인 폴더의 노트가 에러 없이 결과에서 빠져요([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). **토큰 효율.** `list_notes` 페이지는 노트당 약 50 토큰을 반환해요. `search_notes`로 문서를 불러오거나(노트당 \~1,500 토큰) `get_note_transcript`로 transcript를 불러오는 것(노트당 \~3,000–5,000 토큰)과 비교하면, 가진 것을 찾는 가장 저렴한 방법이에요. ## 파라미터 | Parameter | Type | Required | Description | | ---------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------- | | `query.keyword` | string | Optional | 선택적 keyword. 있으면 전문 검색 관련도로 재정렬해요. | | `workspaceGuid` | string | Optional | 특정 workspace를 대상으로 지정(`list_workspaces`에서 GUID 확인). 생략하면 접근 가능한 모든 workspace를 검색해요. workspace 범위 key는 자동으로 자신의 workspace를 검색해요. | | `pagination.cursor` | string | Optional | 이전 `nextCursor`에서 받은 cursor. | | `pagination.size` | number | Optional | 페이지당 결과 수(기본값 `20`, 최대 `100`). | | `filter.folderId` | string | Optional | 폴더로 제한(재귀적 — 하위 폴더 포함). | | `filter.createdAtFrom` | string | Optional | ISO 8601 datetime, `createdAt`의 포함 하한. | | `filter.createdAtTo` | string | Optional | ISO 8601 datetime, `createdAt`의 배제 상한. | ### query.keyword (선택) 목록을 관련도 모드로 전환해요. 매칭은 서버의 전문 검색 인덱스가 노트 제목과 단락 내용을 기준으로 점수를 매겨요. keyword가 있으면 `nextCursor`는 `null`이에요(심층 검색 인덱스에는 안정적인 목록 cursor가 없어요). keyword 검색은 user 범위와 workspace 범위 API key 모두에서 동작해요. `workspaceGuid`를 생략하면 접근 가능한 모든 workspace를 검색하고(workspace 범위 key는 자동으로 자신의 workspace를 검색해요), 특정 workspace를 대상으로 하려면 명시적인 `workspaceGuid`를 전달하세요. ### workspaceGuid (선택) 특정 workspace를 대상으로 지정해요. 사용 가능한 GUID는 `list_workspaces`에서 확인하세요. 생략하면 접근 가능한 모든 workspace를 검색해요 — workspace 범위 key는 자동으로 자신의 workspace를 검색해요. ### filter.folderId (선택) 제공되면 목록은 해당 폴더와 모든 하위 폴더로 재귀적으로 범위가 좁혀져요. 폴더 접근은 서버 측에서 인가돼요. 접근 권한이 없는 folderId를 전달하면 `404`를 반환해요. ### filter.createdAtFrom / filter.createdAtTo (선택) `createdAt`에 대한 반열린 `[from, to)` 범위 필터예요. 둘 다 시간대가 포함된 ISO 8601 datetime을 받아요(예: `2026-04-01T00:00:00Z`). ### pagination (선택) `{ cursor, size }`. 기본값 `size: 20`, 최대 `100`. 이전 응답의 `nextCursor`를 사용해 페이지를 넘기세요. ## 응답 형식 ### 성공 응답 ```json theme={"system"} { "content": [ { "noteGuid": "abc-123-def", "title": "OKR Q2 Planning", "webUrl": "https://platform.tiro.ooo/notes/abc-123-def", "createdAt": "2026-04-15T10:00:00Z", "updatedAt": "2026-04-15T11:30:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice", "participants": [ { "name": "Alice Kim", "email": "alice@example.com" }, { "name": "Bob Park", "email": null } ] } ], "notes": [], "total": 137, "totalSize": 1, "nextCursor": "eyJvZmZzZXQiOjUwfQ==" } ``` 응답은 각 노트를 `content`(권장)와 `notes`(레거시 별칭) 양쪽에 담아요. 클라이언트가 선호하는 쪽을 고르고 다른 쪽은 무시하세요. **필드 설명:** | Field | Type | Description | | ------------------------------------ | -------------- | ----------------------------------------------------------------------------------------- | | `content[]` | array | 노트(선호 필드). | | `content[].noteGuid` | string | 고유 노트 식별자 — `search_notes`, `get_note_transcript` 등에 전달해요. | | `content[].title` | string | 노트 제목. | | `content[].webUrl` | string | Tiro 웹 앱에서 노트로 바로 가는 링크. | | `content[].createdAt` | string | ISO 8601 생성 타임스탬프. | | `content[].updatedAt` | string | ISO 8601 마지막 수정 타임스탬프. | | `content[].recordingDurationSeconds` | number | 녹음 길이(초)(녹음이 아닌 소스는 `0`). | | `content[].sourceType` | string | `live-voice`, `recording`, `text`, `video`, `webpage`, `offline-mode`, `onboarding` 중 하나. | | `content[].participants[]` | array | 참가자별 `{ name, email }`. 둘 중 어느 쪽이든 `null`일 수 있어요. | | `total` | number | 백엔드의 필터 전 개수. | | `totalSize` | number | MCP 측 미완성 노트 필터 적용 후 개수(`total`보다 작을 수 있어요). | | `nextCursor` | string \| null | 다음 페이지를 위한 cursor. 더 이상 결과가 없거나 keyword 검색이 활성화되면 `null`. | **페이지네이션 팁.** `total`과 `totalSize`는 다를 수 있어요. `total`이 센 미완성 노트가 `totalSize` 전에 필터링돼요. `while (totalSize < total)`로 반복하지 말고 `nextCursor`로 페이지를 넘기세요. ## 사용 예시 ### 예시 1: 특정 폴더의 노트 **요청:** ```json theme={"system"} { "filter": { "folderId": "455765" } } ``` 폴더 `455765`와 그 하위 폴더에서 가장 최근의 완성 노트 20개를 반환해요. ### 예시 2: 날짜 범위로 최근 노트 **요청:** ```json theme={"system"} { "filter": { "createdAtFrom": "2026-04-01T00:00:00Z", "createdAtTo": "2026-05-01T00:00:00Z" }, "pagination": { "size": 50 } } ``` ### 예시 3: keyword 목록 (관련도 순위) **요청:** ```json theme={"system"} { "query": { "keyword": "OKR" }, "pagination": { "size": 30 } } ``` 제목이나 단락이 `OKR`에 매칭되는 노트를 관련도 순으로 반환해요. 응답의 `nextCursor`는 `null`이에요. 더 필요하면 같은 keyword와 더 큰 `size`로 다시 호출하세요. ### 예시 4: 페이지네이션 탐색 **첫 페이지:** ```json theme={"system"} { "pagination": { "size": 50 } } ``` **다음 페이지 (이전 응답의 `nextCursor` 사용):** ```json theme={"system"} { "pagination": { "size": 50, "cursor": "eyJvZmZzZXQiOjUwfQ==" } } ``` ## 어떤 단계를 언제 쓸지 폴더, 날짜, keyword 존재 여부로 **어떤 노트가 있는지 알아야** 할 때예요. 메타데이터만 반환하고 노트당 약 50 토큰이에요. 가장 저렴한 디스커버리 도구예요. 주제 이면의 결정, action item, 팀의 결론 등 **맥락을 이해해야** 할 때예요. 매칭된 노트와 그 주요 문서(one-pager, custom)를 반환해요. 노트당 약 1,500 토큰이에요. LLM이 사용자 질문에 답하기 위해 문서 내용이 필요할 때 `list_notes`에서 [`search_notes`](./search-notes)로 전환하세요. 대화에서 **정확한 발화를 인용해야** 할 때예요. 타임스탬프가 있는 전체 transcript를 반환해요. 회의 시간당 \~3,000–5,000 토큰으로, 최후의 수단이에요. [`get_note_transcript`](./get-transcript)를 참고하세요. ## 자주 발생하는 오류 ### 유효하지 않은 datetime ```json theme={"system"} { "error": "Invalid createdAtFrom format. Expected ISO 8601 datetime.", "code": "INVALID_DATE_FORMAT", "statusCode": 400 } ``` **해결 방법:** 시간대가 포함된 ISO 8601 datetime을 사용하세요(예: `2026-04-01T00:00:00Z`). ## 토큰 사용량 | Mode | Tokens per note | | ------------------------------------- | -------------------- | | `list_notes` (메타데이터만) | \~50 | | `search_notes` (문서 포함) | \~1,500 | | `get_note_transcript` (전체 transcript) | 회의 시간당 \~3,000–5,000 | **디스커버리 흐름.** `list_notes`로 관심 있는 noteGuid를 먼저 찾으세요. 문서 내용이 필요할 때만 `search_notes`로 전환하세요. 그대로 인용해야 할 때만 `get_note_transcript`를 사용하세요. # 도구 Source: https://docs.tiro.ooo/ko/developers/mcp/tools/overview Tiro MCP에서 사용할 수 있는 도구 목록. 클라이언트를 연결하면 아래 Tiro 도구를 호출할 수 있어요. ## 노트 & 콘텐츠 [List notes](/ko/developers/mcp/tools/list-notes) · [Search notes](/ko/developers/mcp/tools/search-notes) · [Get note](/ko/developers/mcp/tools/get-note) · [Get transcript](/ko/developers/mcp/tools/get-transcript) ## 공유 & 정리 [Folder search](/ko/developers/mcp/tools/folder-search) · [Share links](/ko/developers/mcp/tools/share-links) ## 위키 [Wiki tools](/ko/developers/mcp/tools/wiki) ## 인증 [Auth status](/ko/developers/mcp/tools/auth-status) # search_notes Source: https://docs.tiro.ooo/ko/developers/mcp/tools/search-notes 키워드로 노트와 주요 문서 검색. ## 개요 `search_notes`는 키워드와 일치하는 노트를 주요 문서(one-pager, custom)와 함께 반환해요. 결정 사항이나 할 일처럼 노트의 내용까지 확인할 때 사용하세요. 가벼운 메타데이터만 필요한 목록 조회(예: "폴더 X에 어떤 노트가 있지")는 대신 [`list_notes`](./list-notes)를 사용하세요. **사용할 때** * "OKR Q2에서 팀이 무엇을 결정했지?" * "이 결정의 출처 노트가 어디 있지?" * "네이버를 언급한 노트를 보여줘." **동작 방식** * keyword 필수. 결과는 전문 검색 관련도(동점 시 `createdAt` 내림차순)로 정렬돼요. * 매칭된 각 노트는 주요 문서(one-pager, custom)를 inline으로 담아요. * 문서 내용에서 HTML이 제거돼요. 5,000자보다 큰 문서는 잘리고 표시돼요. * 검색 인덱스를 사용할 수 없으면 정상 응답에 `degraded: true`, 빈 `notes`, `degradedReason`을 포함해요. 워크스페이스 범위 API Key로 호출하면 개인 폴더의 노트는 keyword가 매칭되더라도 결과에서 빠져요([시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)). **`list_notes`보다 무거워요.** 각 결과에 문서 내용이 포함돼요(노트당 \~1,500 토큰). 기본 페이지 크기는 `50`, 최대 `200`이에요. 메타데이터만 필요하면 [`list_notes`](./list-notes)를 사용하세요. ## 파라미터 | 파라미터 | 타입 | 필수 여부 | 설명 | | ---------------------- | ------ | ------ | ------------------------------------------------------------------------------------------------------- | | `keyword` | string | **필수** | 검색어(1자 이상). 제목과 단락 내용을 기준으로 전문 검색. | | `pagination.cursor` | string | 선택 | 향후 사용 예약. 심층 검색 엔드포인트는 현재 `null`을 반환해요. | | `pagination.size` | number | 선택 | 페이지당 결과 수(기본값 `50`, 최대 `200`). | | `workspaceGuid` | string | 선택 | 워크스페이스 GUID(`list_workspaces`에서 확인). 생략하면 접근 가능한 모든 워크스페이스에서 검색해요. 워크스페이스 범위 API Key는 연결된 워크스페이스만 검색해요. | | `filter.folderId` | string | 선택 | 폴더로 제한(하위 폴더 포함). | | `filter.createdAtFrom` | string | 선택 | ISO 8601 datetime, `createdAt`의 포함 하한. | | `filter.createdAtTo` | string | 선택 | ISO 8601 datetime, `createdAt`의 배제 상한. | ### keyword (필수) 검색어예요. 서버 측에서 토큰화돼요. 한국어 텍스트는 형태소 분석돼요(예: `네이버` → `[네, 버]`). 비었거나 공백만 있는 keyword는 `400`을 반환해요. 키워드 검색은 사용자 범위와 워크스페이스 범위 API Key를 모두 받아요. `workspaceGuid`를 생략하면 접근 가능한 모든 워크스페이스를 검색해요. 워크스페이스 범위 API Key는 연결된 워크스페이스만 검색해요. 특정 워크스페이스로 한정하려면 `workspaceGuid`를 전달하세요. ### filter.folderId (선택) `list_notes`와 의미가 같아요. 재귀적 폴더 범위이며 서버 측에서 인가돼요. ### pagination (선택) `{ cursor, size }`. 기본값 `size: 50`, 최대 `200`. 이 상한은 결과당 더 높은 비용(각 노트가 문서를 담음)을 반영해요. ## 응답 형식 ### 성공 응답 ```json theme={"system"} { "notes": [ { "noteGuid": "abc-123-def", "title": "OKR Q2 Planning", "webUrl": "https://platform.tiro.ooo/notes/abc-123-def", "createdAt": "2026-04-15T10:00:00Z", "updatedAt": "2026-04-15T11:30:00Z", "recordingDurationSeconds": 3625, "sourceType": "live-voice", "participants": [ { "name": "Alice Kim", "email": "alice@example.com" } ], "matchedSnippets": null, "documents": [ { "documentGuid": "7821", "templateId": 12, "templateTitle": "One Pager", "content": "## 결정 사항\n- 자동 ingest 우선...\n## Action Items\n- ...", "truncated": false, "updatedAt": "2026-04-15T11:30:00Z" } ] } ], "nextCursor": null, "degraded": false, "degradedReason": null } ``` **필드 설명:** | Field | Type | Description | | ----------------------------------- | ----------------- | ----------------------------------------------------------------------------------------------- | | `notes[]` | array | 매칭된 노트, 전문 검색 관련도(동점 시 `createdAt` 내림차순)로 정렬. | | `notes[].matchedSnippets` | string\[] \| null | 하이라이트 스니펫용 예약. 현재 `null`로, "하이라이트 미구현"과 "검색했으나 매칭 하이라이트 없음"을 구분해요. | | `notes[].documents[]` | array | 노트의 주요 문서. 노트에 문서가 없으면 빈 배열. | | `notes[].documents[].documentGuid` | string | 안정적인 문서 식별자. | | `notes[].documents[].templateId` | number \| null | 숫자 template id — 유일하게 안정적인 구분자. | | `notes[].documents[].templateTitle` | string | 표시 라벨(예: `"One Pager"`, `"회의록"`). **locale에 따라 달라지고 custom 템플릿은 사용자가 편집 가능** — 이 문자열로 구분하지 마세요. | | `notes[].documents[].content` | string | HTML 제거된 markdown 친화 텍스트. 5,000자로 제한. `truncated`를 참고하세요. | | `notes[].documents[].truncated` | boolean | 내용이 잘렸으면 `true`. 나머지가 필요하면 [`get_note(include: ['documents'])`](./get-note)로 전체 문서를 가져오세요. | | `nextCursor` | string \| null | 향후 사용 예약. 현재 항상 `null`. | | `degraded` | boolean | 검색 인덱스를 사용할 수 없거나 실패했으면 `true`. | | `degradedReason` | string \| null | `degraded=true`일 때: `"search_index_unavailable"` 또는 `"search_index_degraded"`. | **`templateTitle`로 구분하지 마세요.** 이건 enum이 아니라 표시 라벨이에요. boolean 확인("이게 one-pager인가?")에는 알려진 관리형 템플릿 id에 대해 `templateId`를 사용하거나, 두 필드를 모두 노출하고 UI가 라벨로 고르게 하세요. ### 성능 저하 응답 검색 인덱스를 사용할 수 없으면 응답은 `degraded=true`로 설정되고 빈 `notes` 배열을 반환해요: ```json theme={"system"} { "notes": [], "nextCursor": null, "degraded": true, "degradedReason": "search_index_unavailable" } ``` `degradedReason`은 다음 중 하나예요: * `search_index_unavailable` — 이 환경에서 검색 인덱스가 비활성화됨. * `search_index_degraded` — 쿼리 도중 검색 인덱스가 오류를 던짐. 재시도를 미루거나 결과를 적절히 해석할 수 있도록 이를 LLM/사용자에게 노출하세요. ## 사용 예시 ### 예시 1: 주제 검색 **요청:** ```json theme={"system"} { "keyword": "OKR" } ``` OKR을 언급하는 가장 관련도 높은 노트 10개를 각각의 주요 문서와 함께 inline으로 반환해요. ### 예시 2: 폴더 범위 한국어 keyword **요청:** ```json theme={"system"} { "keyword": "네이버", "filter": { "folderId": "455765" }, "pagination": { "size": 5 } } ``` 폴더 `455765`(및 하위)에서만 `네이버`를 검색해요. 한국어 형태소 분석이 서버 측에서 실행돼요. ### 예시 3: 날짜 범위 심층 검색 **요청:** ```json theme={"system"} { "keyword": "release", "filter": { "createdAtFrom": "2026-04-01T00:00:00Z", "createdAtTo": "2026-05-01T00:00:00Z" } } ``` ## 권장 사례 먼저 [`list_notes`](./list-notes)로 어떤 노트가 매칭되는지 찾으세요. LLM이 답하기 위해 여전히 문서 내용이 필요하면 같은 keyword로 `search_notes`로 전환하세요. 가장 저렴한 점진적 공개 경로예요. 폴더 범위 검색은 관련도 공간이 더 작아서 더 빠르고 순위가 더 좋은 결과를 반환해요. 폴더 후보를 먼저 찾으려면 `list_notes(filter.folderId)`와 함께 쓰세요. 심층 검색 endpoint는 현재 `nextCursor: null`을 방출해요. 결과 30개로 부족하면 페이지네이션 대신 keyword를 더 구체적으로 다듬거나 folderId/dateRange로 범위를 좁히세요. `degraded=true` 응답은 솔직한 신호예요. 검색 인덱스가 실행되지 못했어요. 빈 `notes` 배열을 "매칭 없음"으로 취급하지 말고, 재시도 타이밍을 적절히 잡을 수 있도록 성능 저하를 사용자/LLM에게 노출하세요. ## 자주 발생하는 오류 ### 빈 keyword ```json theme={"system"} { "error": "keyword must not be blank", "code": "BAD_REQUEST", "statusCode": 400 } ``` ## 토큰 사용량 **노트당 (문서 포함):** 평균 약 1,500 토큰. 잘린 문서는 원본 크기와 관계없이 약 1,500 토큰으로 제한돼요. **`get_note_transcript`와 비교하면**(회의 시간당 \~3,000–5,000 토큰), `search_notes`는 보통 10배 더 압축적이면서 같은 핵심 결정을 다루는 정제된 문서를 반환해요. 정확한 발화가 필요할 때만 transcript를 사용하세요. # 공유 링크 Source: https://docs.tiro.ooo/ko/developers/mcp/tools/share-links 노트의 공개 공유 링크 조회. ## 개요 `get_share_link` 도구는 노트의 공개 공유 링크를 조회해요. 공유 링크를 쓰면 인증 없이도 외부에서 회의 노트를 열어볼 수 있어요. 사용 가능한 도구는 `get_share_link` 하나예요. 공유 링크를 생성하거나 삭제하는 작업은 MCP로는 할 수 없어요. 이 쓰기 작업에는 `mcp:notes:write` scope가 필요한데, MCP 서버는 아직 이 scope를 노출하지 않아요. 공유 링크를 생성하거나 삭제하려면 REST API를 사용하세요 — `PUT` / `DELETE /v1/external/notes/{noteGuid}/share-link`. **사용할 때** * 노트에 이미 공개 공유 링크가 있는지 확인 * 노트의 공유 URL을 조회해 전달 * 비밀번호를 입력해 비밀번호 보호 링크의 상세 정보를 해제 *** ## get\_share\_link 노트의 현재 공유 링크 정보를 조회해요. 공유 UUID(새 형식)나 노트 GUID(레거시) 중 하나를 받아요. 링크가 비밀번호로 보호된 경우, 접근을 검증하고 전체 응답을 해제하려면 `password`를 전달하세요. **필요한 Scope:** `mcp:notes:read` ### 파라미터 | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ------------------------------------- | | `noteGuid` | string | Yes | 노트 GUID 또는 share ID(UUID 또는 noteGuid) | | `password` | string | No | 공유 링크가 비밀번호로 보호된 경우 검증할 비밀번호 | ### 요청 예시 ```json theme={"system"} { "noteGuid": "abc123-def456-ghi789", "password": "xK9mP2qL" } ``` ### 응답 ```json theme={"system"} { "shareId": "9b2f7c1a-1234-4d56-9abc-1234567890ab", "noteGuid": "abc123-def456-ghi789", "shareUrl": "https://tiro.ooo/share-links/9b2f7c1a-1234-4d56-9abc-1234567890ab", "hasPassword": true, "passwordVerified": true, "sharePassword": null } ``` **필드 설명:** | Field | Type | Description | | ------------------------------ | -------------- | ------------------------------------------------- | | `shareId` | string | 공유 링크용 UUID token | | `noteGuid` | string | 원본 노트 GUID | | `shareUrl` | string | 공유된 노트에 접근하는 공개 URL | | `hasPassword` | boolean | 링크가 비밀번호로 보호되는지 여부 | | `passwordVerified` | boolean | 올바른 `password`가 제공됐을 때 존재하며 `true` | | `requiresPasswordVerification` | boolean | 링크가 비밀번호로 보호됐고 `password`가 제공되지 않았을 때 존재하며 `true` | | `sharePassword` | string \| null | 응답에서는 항상 `null`(비밀번호는 절대 다시 반환되지 않음) | 링크가 비밀번호로 보호됐는데 `password` 없이 `get_share_link`를 호출하면, 응답에 `requiresPasswordVerification: true`가 포함되고 검증 플래그는 생략돼요. 잘못된 비밀번호를 제공하면 `401 Unauthorized`를 반환해요. *** ## 자주 발생하는 오류 ### 노트를 찾을 수 없음 ```json theme={"system"} { "error": "Note not found", "code": "NOTE_NOT_FOUND", "statusCode": 404 } ``` **해결 방법:** `noteGuid`가 올바른지 확인하세요. `search_notes`로 유효한 노트 식별자를 찾으세요. ### 공유 링크를 찾을 수 없음 ```json theme={"system"} { "error": "No share link exists for this note", "code": "SHARE_LINK_NOT_FOUND", "statusCode": 404 } ``` **해결 방법:** 노트에 아직 공유 링크가 없어요. Tiro 앱이나 REST API(`PUT /v1/external/notes/{noteGuid}/share-link`)로 하나 만드세요. *** ## 권장 사례 링크가 비밀번호로 보호된 경우, `get_share_link`에 `password`를 전달해 전체 응답을 해제하세요. 전달하지 않으면 응답이 `requiresPasswordVerification: true`로 설정돼요. 누군가에게 URL을 보내기 전에 `get_share_link`로 노트에 활성 공개 링크가 있는지 확인하세요. # Wiki Source: https://docs.tiro.ooo/ko/developers/mcp/tools/wiki 워크스페이스 위키 검색·조회·그래프 탐색. ## 개요 위키 도구는 회의 노트에서 추출한 엔티티, 개념, 관계를 검색하고 읽는 **읽기 전용** 도구입니다. * **`search_wiki`**: 키워드로 위키 페이지를 검색합니다. * **`get_wiki_page`**: 페이지 본문과 메타데이터, `mentions`, `aliases`, `links`를 반환합니다. * **`list_wiki_mentions`**: 페이지가 언급된 노트 단락을 반환합니다. * **`get_wiki_graph`**: 연결된 페이지의 노드와 엣지를 반환합니다. `search_wiki`로 페이지를 찾고 `list_wiki_mentions`로 출처를 확인한 뒤 `get_wiki_graph`로 연결된 개념을 탐색하세요. 여러 워크스페이스를 사용한다면 \*\*`list_workspaces`\*\*에서 `guid`와 위키 활성화 여부를 확인한 뒤 `workspaceGuid`를 전달하세요. **읽기 전용 (v1).** 위키 페이지 생성, 이름 변경, 병합, 삭제는 지원하지 않습니다. 노트 내용은 `search_notes`나 `get_note`로 조회하세요. ## 접근 권한과 요금제 게이트 위키는 유료이며 워크스페이스에서 별도로 활성화해야 합니다. 도구는 항상 목록에 보이지만 호출할 때 요금제와 활성화 상태를 확인합니다. 다음 두 조건을 모두 충족해야 위키를 사용할 수 있습니다. 1. **자격 있는 요금제**: 워크스페이스의 구독이 Pro, Max, Team, Enterprise 중 하나입니다. Free와 Lite는 자격이 없습니다. 2. **활성화됨**: 워크스페이스 관리자가 해당 워크스페이스에서 위키를 켰습니다. 호출이 게이트에 걸리면, 도구는 기계 판독 가능한 `error_code`와 함께 오류 엔벨로프(HTTP `402`)를 반환합니다. | `error_code` | 의미 | 호출자가 취할 조치 | | -------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `WIKI_PLAN_REQUIRED` | 요금제에 위키가 포함되어 있지 않음(Free/Lite/구독 없음/비활성). | 업그레이드. `action_url`은 요금제(B2C) 또는 팀 결제(팀 관리자) 페이지를 가리킵니다. 팀 구성원의 경우 `null`이며, 관리자에게 요청하라는 메시지가 표시됩니다. | | `WIKI_NOT_ACTIVATED` | 요금제 자격은 있으나 관리자가 위키를 활성화하지 않음. | 워크스페이스 설정에서 위키를 활성화하거나(관리자), 관리자에게 요청(구성원). 업셀 없음. `required_plans`는 `null`입니다. | 엔벨로프 형태(백엔드에서 그대로 전달됨): ```json theme={"system"} { "success": false, "error_code": "WIKI_PLAN_REQUIRED", "message": "위키 기능은 Pro 이상 요금제에서 사용할 수 있어요. 웹에서 로그인 후 요금제를 업그레이드해 주세요.", "current_plan": "Lite", "required_plans": ["pro", "max", "team", "enterprise"], "action_url": "https://tiro.ooo/#pricing", "status_code": 402 } ``` * `current_plan`: 워크스페이스의 현재 요금제 표시 이름, 구독이 없을 경우 `null`. * `required_plans`: `WIKI_PLAN_REQUIRED`의 업그레이드 대상. `WIKI_NOT_ACTIVATED`에서는 `null`. (Team Free Trial은 의도적으로 제외됩니다. 이미 보유 중인 체험이지 업그레이드 대상이 아니기 때문입니다.) * `action_url`: 조치를 취할 웹 링크, 호출자가 직접 조치할 수 없을 때(팀 구성원이거나 관리자에 의한 활성화)는 `null`. **워크스페이스 선택.** 기본적으로 위키 도구는 API Key로부터 워크스페이스를 암묵적으로 결정합니다. 워크스페이스 바인딩 키나 팀 키는 직접 결정되고, 개인 또는 OAuth 토큰은 **기본** 워크스페이스로 결정됩니다. 노트 도구의 범위 지정 방식과 동일합니다. 계정이 **여러 워크스페이스**에 속해 있다면 [`list_workspaces`](#list_workspaces)를 호출해 목록을 나열하고(각각 `guid`와 위키 활성화 여부 포함), 선택한 `workspaceGuid`를 임의의 위키 도구에 전달하여 해당 워크스페이스를 명시적으로 대상으로 지정하세요. `workspaceGuid`를 생략하면 기본 워크스페이스 동작이 유지됩니다. 백엔드는 전달한 워크스페이스의 구성원인지 검증합니다. ## `list_workspaces` API Key가 접근할 수 있는 워크스페이스 목록을 각각의 `guid`, `name`, 위키 활성화 여부와 함께 반환합니다. 계정이 둘 이상의 워크스페이스에 속해 있을 때 위키 도구에 사용할 `workspaceGuid`를 고르는 데 사용하세요. 이 도구는 매개변수를 받지 않습니다. 다음을 반환합니다. ```json theme={"system"} { "workspaces": [ { "guid": "ws_abc", "name": "Acme", "isWikiEnabled": true }, { "guid": "ws_def", "name": "Personal", "isWikiEnabled": false } ] } ``` * 개인/OAuth 토큰은 구성원으로 속한 모든 워크스페이스를 나열하고, 워크스페이스 바인딩 키나 팀 키는 해당 워크스페이스 하나만 나열합니다. * `isWikiEnabled`는 해당 워크스페이스에서 위키가 요금제 자격이 있고 **동시에** 활성화되어 있는지를 반영합니다. `true`인 워크스페이스를 골라 그 `guid`를 `workspaceGuid`로 전달하세요. ## `search_wiki` 키워드로 위키 페이지를 검색합니다. 가장 먼저 사용하세요. 반환된 `pageGuid`를 다른 도구에 전달합니다. | 매개변수 | 타입 | 필수 여부 | 설명 | | --------------- | ------ | ------ | --------------------------------------------------------------- | | `keyword` | string | **필수** | 페이지 이름과 매칭되는 검색어. | | `workspaceGuid` | string | 선택 | 특정 워크스페이스를 대상으로 지정(`list_workspaces`에서 가져옴). 생략하면 기본 워크스페이스 사용. | 순위가 매겨진 페이지 결과를 반환하며, 각각 `pageGuid`, `name`, `pageType`(예: `CONCEPT`, `ENTITY`), 관련도 점수를 포함합니다. ## `get_wiki_page` `pageGuid`(`search_wiki`에서 가져옴)로 위키 페이지 하나를 가져옵니다. | 매개변수 | 타입 | 필수 여부 | 설명 | | --------------- | ------ | ------ | --------------------------------------------------------------- | | `pageGuid` | string | **필수** | `search_wiki`가 반환한 페이지 식별자. | | `workspaceGuid` | string | 선택 | 특정 워크스페이스를 대상으로 지정(`list_workspaces`에서 가져옴). 생략하면 기본 워크스페이스 사용. | 페이지 **본문**(설명 + 생성 상태)과 **메타데이터**(제목, 타입, mention/alias/link 수, 타임스탬프), 그리고 페이지의 구조화된 `mentions`, `aliases`, `links`를 반환합니다. 이어서 `list_wiki_mentions`로 페이지가 노트 전체에서 어디에 참조되는지 확인하세요. ## `list_wiki_mentions` 위키 페이지를 언급하는 노트 단락들을 나열합니다. | 매개변수 | 타입 | 필수 여부 | 설명 | | --------------- | ------ | ------ | --------------------------------------------------------------- | | `pageGuid` | string | **필수** | 페이지 식별자(`search_wiki` / `get_wiki_page`에서 가져옴). | | `cursor` | string | 선택 | 이전 응답에서 받은 페이지네이션 커서. | | `workspaceGuid` | string | 선택 | 특정 워크스페이스를 대상으로 지정(`list_workspaces`에서 가져옴). 생략하면 기본 워크스페이스 사용. | 언급 레코드(소스 노트, 단락, 추출된 텍스트, kind)와 페이지네이션 커서를 반환합니다. ## `get_wiki_graph` 위키 지식 그래프의 노드+엣지 단면을 가져옵니다. `{ nodes, edges }`를 반환하며, 각 엣지는 두 페이지 사이의 타입이 지정된 관계를 담습니다. | 매개변수 | 타입 | 필수 여부 | 설명 | | ---------------------- | --------- | ------ | ------------------------------------------------------------------------------------------ | | `mode` | string | **필수** | `seed`, `expand`, `around`, `links` 중 하나(아래 참조). | | `pageGuid` | string | 조건부 | `expand` / `around`의 기준 페이지. | | `pageGuids` | string\[] | 조건부 | `links`를 위한 명시적 페이지 집합. | | `depth` | number | 선택 | `expand`의 탐색 깊이. | | `radius` | number | 선택 | `around`의 이웃 반경. | | `limit` | number | 선택 | 반환되는 최대 노드 수. 기본값 `50`, 최대 `200`. | | `q` / `type` / `since` | — | 선택 | `seed`를 위한 개요 필터. | | `folderId` | number | 선택 | `seed` 전용: 이 폴더(하위 폴더 포함, 재귀) 내 노트가 언급한 페이지로 그래프를 제한합니다. 비어 있거나 접근할 수 없는 폴더는 빈 그래프를 반환합니다. | | `workspaceGuid` | string | 선택 | 특정 워크스페이스를 대상으로 지정(`list_workspaces`에서 가져옴). 생략하면 기본 워크스페이스 사용. | | `mode` | 반환 | | -------- | ------------------------------------------------------------------ | | `seed` | 워크스페이스에 대한 개요 그래프(선택적으로 `q` / `type` / `since` / `folderId`로 필터링). | | `expand` | `pageGuid`에서 `depth`만큼 바깥으로의 탐색. | | `around` | `radius`로 정한 페이지의 이웃. | | `links` | 명시적인 `pageGuids` 집합 간의 링크들. | **결과 상한.** `get_wiki_graph`는 최대 `limit`개의 노드(기본값 `50`, 최대 `200`)와 그 반환된 노드들 **사이의** 엣지만 반환합니다(연결되지 않은 엣지는 제거되므로 모든 엣지의 양 끝점이 `nodes`에 존재합니다). 기반 그래프가 상한보다 컸던 경우, 응답에 `truncated: true`가 설정됩니다. `mode` / `q` / `type` 또는 더 작은 `radius` / `depth`로 좁혀 집중된 단면을 얻으세요. 이를 통해 허브 페이지의 이웃이 무한정 큰 페이로드를 반환하는 것을 방지합니다. **클러스터 기반 탐색은 아직 노출되지 않았습니다.** 웹 앱의 최신 그래프 탐색 뷰(overview/context/cluster)는 내부 전용입니다. MCP `get_wiki_graph` 도구는 `seed` / `expand` / `around` / `links` 모드를 노출합니다. 클러스터 탐색의 외부 노출은 로드맵에 있습니다. ## 권장 체인 * **워크스페이스 먼저 선택(여러 워크스페이스):** `list_workspaces` → 선택한 `workspaceGuid`를 아래의 임의 도구에 전달. * **위키가 어떤 주제에 대해 아는 내용 찾기:** `search_wiki` → `get_wiki_page`. * **페이지가 노트에서 어디에 근거하는지 찾기:** `search_wiki` → `list_wiki_mentions`. * **개념들이 어떻게 연결되는지 탐색하기:** `search_wiki` → `get_wiki_graph`(`mode: "around"`, `pageGuid`). # 트러블슈팅 Source: https://docs.tiro.ooo/ko/developers/mcp/troubleshooting Tiro MCP 연결·인증·검색 문제 해결 방법. MCP 설정 문제는 주로 인증 헤더, 전송 방식, 클라이언트 캐시에서 생겨요. 아래 순서대로 확인하고 설정을 바꾼 뒤에는 클라이언트를 재시작하세요. ## 연결 문제 ### 서버를 찾을 수 없음 MCP 서버 URL이 `https://mcp.tiro.ooo/mcp`인지 확인하세요. * 경로 끝의 `/mcp` 누락 * `https://` 대신 `http://` 사용 다음 명령으로 연결을 확인하세요. ```bash theme={"system"} curl https://mcp.tiro.ooo/mcp ``` 예상 응답: `405 Method Not Allowed` (GET 요청에선 정상이에요). ### 도구가 안 보임 1. MCP 클라이언트를 완전히 재시작하세요(창 새로고침 말고) 2. AI에게 "List all available MCP servers"라고 물어 Tiro가 나오는지 확인하세요 3. 그래도 없으면 [클라이언트 설정](/ko/developers/mcp/setup)을 다시 진행하세요 ## 인증 에러 ### API Key 문제 **잘못된 API Key 형식** API Key는 `{id}.{secret}` 형식(점으로 구분된 두 부분)을 따라야 해요. 자주 하는 실수: * key의 일부만 복사(점 앞이나 뒤 부분 누락) * key에 공백이나 줄바꿈 문자가 섞임 * 실제 key 대신 placeholder 값 사용 ```bash theme={"system"} # Correct format TIRO_API_KEY=abc123.xyz789secretvalue # Wrong — missing the dot separator TIRO_API_KEY=abc123xyz789secretvalue ``` **만료되거나 폐기된 Key** API Key는 Tiro Dashboard에서 만료되거나 폐기될 수 있어요. 이전에 쓰던 API key로 `401 UNAUTHORIZED` 에러가 나면: 1. [Tiro Platform API Keys](https://platform.tiro.ooo/me/api-keys)로 가세요 2. key가 아직 활성인지 확인하고, 필요하면 새로 발급하세요 3. MCP 클라이언트 설정을 새 key로 업데이트하세요 ### 401 Unauthorized / 403 Forbidden **API Key 사용 시:** key가 유효하고 만료되지 않았으며 호출하려는 도구에 필요한 scope를 가졌는지 확인하세요. 전체 scope 표는 [Setup 페이지](/ko/developers/mcp/setup)를 보세요. **OAuth 사용 시:** MCP 클라이언트를 재시작해 새 OAuth 흐름을 트리거하세요. * **Claude Code**: CLI 세션 재시작 * **Claude Desktop**: 앱을 완전히 종료 후 재실행 * **Cursor**: 에디터 재시작 또는 MCP extension 리로드 * **VS Code**: 에디터 재시작 또는 MCP extension 리로드 OAuth는 올바른 scope로 새 token을 자동 발급해요. token은 **180일** 동안 유효해요. ## 설정 문제 ### Claude Code 연결 실패 1. 설정이 [Claude Code setup](/ko/developers/mcp/setup)과 맞는지 확인하세요 2. CLI 세션을 재시작하세요 3. OAuth를 쓰는데 브라우저 창이 안 열리면 기본 브라우저 설정을 확인하세요 4. API Key를 쓴다면 key 값에 끝 공백이 없는지 확인하세요 ### Claude Desktop 연결 실패 1. 설정이 [Claude Desktop setup](/ko/developers/mcp/setup)과 맞는지 확인하세요 2. JSON 문법을 검증하세요 — 누락된 쉼표, 안 맞는 괄호, 누락된 따옴표 확인([JSONLint](https://jsonlint.com/)) 3. [Node.js](https://nodejs.org/)가 설치돼 있는지 확인하세요(터미널에서 `npx`가 동작해야 함) 4. Claude Desktop을 완전히 종료 후 재시작하세요(macOS는 Cmd+Q, 창만 닫지 말고) ### Cursor 연결 실패 1. Cursor 설정에서 MCP 서버 설정을 확인하세요 2. 서버 URL이 `https://mcp.tiro.ooo/mcp`인지 확인하세요 3. API Key를 쓴다면 설정에 올바르게 들어갔는지 확인하세요(따옴표·공백 없이) 4. Cursor를 완전히 재시작하고 MCP 패널에서 연결 상태를 확인하세요 ### VS Code 연결 실패 1. MCP extension 설정을 확인하세요(예: Continue 설정 또는 Copilot MCP config) 2. 서버 URL이 `https://mcp.tiro.ooo/mcp`인지 확인하세요 3. API Key를 쓴다면 올바른 config 필드에 들어갔는지 확인하세요 4. VS Code 창을 리로드하고(`Cmd+Shift+P` → "Reload Window") extension 로그에서 에러를 확인하세요 ## 검색 & 데이터 문제 * **결과가 없나요?** 더 넓은 검색 조건을 써보세요 — `content`에 일반 키워드 하나만 쓰거나 `createdAt` 날짜 범위를 넓히세요 * **날짜 형식 에러?** timezone 포함 ISO 8601을 쓰세요: `2025-11-22T00:00:00Z` (날짜만 있는 형식은 안 돼요) * **최근 노트가 안 보이나요?** 캐싱 때문에 노트가 나타나기까지 최대 15분 걸릴 수 있어요. [Tiro Dashboard](https://tiro.ooo)에서 노트가 "Completed"인지 확인하세요 * **요청 timeout?** 긴 회의에는 `get_note_transcript` 대신 `get_note(include: ['summary'])`를 쓰세요 ## 에러 레퍼런스 | Code | HTTP | 설명 | 해결 | | ----------------------- | ---- | ---------------------------------- | ------------------------------------------------------------------------ | | `UNAUTHORIZED` | 401 | 유효한 인증 없음 | API key 확인 또는 클라이언트 재시작해 OAuth 재인증 | | `TOKEN_EXPIRED` | 401 | token 만료됨 | 새 API key 발급 또는 클라이언트 재시작해 OAuth 재인증 | | `FORBIDDEN` | 403 | 필요한 scope 없음 | API key scope 확인 또는 클라이언트 재시작해 OAuth 재인증 | | `INSUFFICIENT_SCOPE` | 403 | 인증된 key/token에 이 도구에 필요한 scope가 없음 | [Setup 페이지](/ko/developers/mcp/setup)의 scope 표를 확인하고 올바른 scope의 key를 쓰세요 | | `MISSING_PARAMETERS` | 400 | 필수 param 누락 | param 요건 확인 | | `INVALID_NOTE_ID` | 400 | 잘못된 note ID | 양의 정수 사용 | | `INVALID_DATE_FORMAT` | 400 | 잘못된 날짜 형식 | ISO 8601 datetime 사용 | | `NOTE_NOT_FOUND` | 404 | 노트가 없음 | note ID 확인 | | `INTERNAL_SERVER_ERROR` | 500 | 서버 에러 | 재시도 또는 지원 문의 | | `REQUEST_TIMEOUT` | 504 | 요청 timeout | summary 사용 또는 재시도 | ## 도움 받기 [GitHub](https://github.com/plato-corp/tiro-mcp-server/issues)에 이슈를 열거나 [support@tiro.ooo](mailto:support@tiro.ooo)로 메일 주세요. # MCP 활용 사례 Source: https://docs.tiro.ooo/ko/developers/mcp/use-cases Tiro MCP로 노트를 찾고 내용을 읽는 작업 흐름. 먼저 메타데이터를 확인하고 필요한 내용만 가져오세요. 아래 예제는 토큰을 아끼면서 MCP 도구를 조합하는 방법을 보여줘요. 처음이라면 [MCP 개요](/ko/developers/mcp/mcp-overview)를 읽고 [클라이언트](/ko/developers/mcp/setup)를 연결하세요. *** ## 미팅을 찾고 논의 내용을 읽는 방법 `list_notes`로 시작하고 문서 내용이 필요하면 `search_notes`, 정확한 발화가 필요하면 `get_note_transcript`를 호출하세요. 대부분의 질문은 앞의 두 단계에서 답할 수 있어요. ### 단계별 안내 [`list_notes`](/ko/developers/mcp/tools/list-notes)를 선택적 `query.keyword`와 `filter`와 함께 호출해 결과를 좁히세요. 메타데이터만 반환해요(노트당 약 50 tokens). ```json theme={"system"} { "query": { "keyword": "product roadmap" }, "filter": { "createdAtFrom": "2026-04-01T00:00:00Z" }, "pagination": { "size": 20 } } ``` `filter.folderId`로 특정 폴더로 범위를 좁히거나, `query.keyword`를 아예 생략해 날짜순으로 폴더를 둘러보세요. 어떤 노트가 매칭되는지 보는 것을 넘어 논의 내용을 **이해**해야 한다면, 필수 `keyword`와 함께 [`search_notes`](/ko/developers/mcp/tools/search-notes)를 호출하세요. 응답에는 매칭된 각 노트의 주요 문서(one-pager, custom)가 HTML이 제거된 채 문서당 최대 5KB로 인라인 포함돼요. ```json theme={"system"} { "keyword": "product roadmap", "filter": { "createdAtFrom": "2026-04-01T00:00:00Z" }, "pagination": { "size": 10 } } ``` 매칭된 노트를 최대 10개까지 문서와 함께 반환해요(노트당 약 1,500 tokens). **대부분의 쿼리는 여기서 끝나요.** 정제된 문서가 보통 팀의 결정 사항과 action item을 담고 있거든요. 요약 개요가 필요하면 [`get_note`](/ko/developers/mcp/tools/get-note)를 `include: ["summary"]`와 함께 호출하세요. ```json theme={"system"} { "noteGuid": "f8a2c1e4-9b3d-4e7f-a6c8-1d2e3f4a5b6c", "include": ["summary"] } ``` 핵심 결정 사항, action item, 하이라이트를 반환해요(200\~800 tokens). **정확한 인용**이나 특정 발화가 필요할 때만 [`get_note_transcript`](/ko/developers/mcp/tools/get-transcript)를 호출하세요. 타임스탬프가 붙은 문단과 markdown 친화적인 전사 문자열을 반환해요(미팅 1시간당 약 3,000\~5,000 tokens). ```json theme={"system"} { "noteGuid": "f8a2c1e4-9b3d-4e7f-a6c8-1d2e3f4a5b6c" } ``` ### Token 사용량 | 방식 | Tokens | 속도 | | ------------------------------------- | ------------------ | ----- | | `list_notes`만 (후보 찾기) | 노트당 약 50 | 가장 빠름 | | `list_notes` → `search_notes` (문서 읽기) | 노트당 약 1,500 | 빠름 | | `get_note_transcript` 직접 불러오기 | 시간당 약 3,000\~5,000 | 가장 느림 | | **transcript 대비 절감** | **70\~80%** | — | ### 자주 묻는 질문 더 넓은 조건으로 시도하세요. * `query.keyword`를 빼거나 짧게 줄이세요. * `filter.createdAtFrom` / `createdAtTo` 범위를 넓히거나 제거하세요. * [Tiro Dashboard](https://tiro.ooo)에서 노트가 "Completed" 상태인지 확인하세요. 완료되지 않은 노트는 자동으로 제외돼요. 타임존이 포함된 ISO 8601 datetime이에요: `2026-04-01T00:00:00Z`. `2026-04-01`처럼 날짜만 있는 형식은 받지 않아요. 범위는 반열린 구간 `[from, to)`예요. 네. `list_notes`와 `search_notes`는 사용자 범위와 워크스페이스 범위 API Key를 모두 지원해요. 워크스페이스 범위 API Key는 연결된 워크스페이스만 검색해요. 특정 워크스페이스를 지정하려면 `list_workspaces`에서 확인한 `workspaceGuid`를 전달하세요. *** ## 미팅 노트의 구조화된 문서를 조회하는 방법 AI 에이전트는 Tiro에서 이미 생성된 템플릿 기반 문서를 읽을 수 있어요. 문서에는 action item, 결정 사항, 핵심 요점이 템플릿의 섹션 구조에 맞춰 들어 있어요. ### 단계별 안내 [`list_document_templates`](/ko/developers/mcp/tools/get-note)를 호출해 어떤 문서 유형이 있는지 확인하세요. ```json theme={"system"} {} ``` "Meeting Minutes", "Action Items", "Decision Log" 같은 템플릿을 반환하며, 각각 `id`, `title`, `description`을 포함해요. [`list_notes`](/ko/developers/mcp/tools/list-notes)를 호출해 키워드(또는 폴더, 날짜 범위)로 미팅을 찾으세요. ```json theme={"system"} { "query": { "keyword": "sprint planning" } } ``` [`get_note`](/ko/developers/mcp/tools/get-note)를 `include: ["documents"]`와 함께 호출해 해당 노트의 생성된 모든 문서를 한 번에 가져오세요. ```json theme={"system"} { "noteGuid": "f8a2c1e4-9b3d-4e7f-a6c8-1d2e3f4a5b6c", "include": ["documents"] } ``` 미팅에 대해 생성된 모든 문서를 구조화된 섹션(예: "Decisions", "Action Items", "Next Steps")과 함께 반환해요. ### 자주 묻는 질문 먼저 [`list_document_templates`](/ko/developers/mcp/tools/get-note)를 호출하세요. 각 템플릿에는 용도를 설명하는 `description` 필드가 있어요. 문서를 요청하기 전에 [`get_document_template`](/ko/developers/mcp/tools/get-note)를 특정 `templateId`와 함께 사용해 전체 섹션 구조를 확인하세요. `get_note(include: ["documents"])`는 빈 배열을 반환해요. 문서는 먼저 Tiro 앱에서 생성해야 해요. MCP 서버는 기존 문서에 대한 읽기 접근만 제공해요. 노트 소유자에게 Tiro에서 문서를 생성해 달라고 요청하세요. *** *** ## AI 에이전트 개발자를 위한 팁 ### 토큰 사용량 줄이기 * `pagination.size`로 결과 수를 제한하세요. `list_notes`는 기본 `20`(최대 `100`), `search_notes`는 기본 `10`(최대 `30`, 각 결과에 문서가 포함되어 더 작음)이에요. * 요약과 문서는 `MARKDOWN` 형식으로 요청하세요. ### 오류 처리 * `401`과 `403` 응답에는 `action_url`과 `docs_url` 필드가 포함돼요. 사용자가 스스로 해결할 수 있도록 이를 노출하세요. * `429` 응답에는 `Retry-After` 헤더가 포함돼요. 재시도하기 전에 이를 준수하세요. * 전체 오류 레퍼런스는 [문제 해결](/ko/developers/mcp/troubleshooting)을 참고하세요. ### 올바른 도구 고르기 | 사용자 의도 | 시작 도구 | 다음 | | -------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------- | | "X 주제로 어떤 미팅이 있지?" | [`list_notes`](/ko/developers/mcp/tools/list-notes) | — (메타데이터로 충분) | | "이 미팅에서 무슨 얘기가 나왔지?" | [`search_notes`](/ko/developers/mcp/tools/search-notes) | (문서 인라인 포함, 보통 충분) | | "실제로 한 말을 인용해줘" | [`list_notes`](/ko/developers/mcp/tools/list-notes) | [`get_note_transcript`](/ko/developers/mcp/tools/get-transcript) | | "action item 알려줘" | [`list_notes`](/ko/developers/mcp/tools/list-notes) | [`get_note`](/ko/developers/mcp/tools/get-note), `include: ["documents"]` | | "어떤 문서 템플릿이 있지?" | [`list_document_templates`](/ko/developers/mcp/tools/get-note) | [`get_document_template`](/ko/developers/mcp/tools/get-note) | | "내가 인증되어 있나?" | [`auth_status`](/ko/developers/mcp/tools/auth-status) | — | 전체 도구 목록은 [Tool Reference](/ko/developers/mcp/tools/overview)에서 둘러보세요. # External Viewers Source: https://docs.tiro.ooo/ko/developers/reference/external-viewers Tiro OpenAPI 명세를 Redoc·Swagger에서 확인하거나 다운로드. * [Redoc에서 보기](https://redocly.github.io/redoc/?url=https://docs.tiro.ooo/openapi.yaml) * [OpenAPI 명세 다운로드](https://docs.tiro.ooo/openapi.yaml) ## Swagger Editor Swagger Editor는 CORS 제한 때문에 수동 import가 필요해요. [openapi.yaml 다운로드](https://docs.tiro.ooo/openapi.yaml) [editor.swagger.io](https://editor.swagger.io)로 이동하세요 **File → Import file**을 선택하고 다운로드한 파일을 고르세요 # 용어집 Source: https://docs.tiro.ooo/ko/developers/resources/glossary Tiro 화면과 API에서 다르게 쓰는 용어. Tiro 화면과 API에서 같은 개념을 다른 이름으로 부르는 경우를 정리했어요. ## 이름이 다른 것부터 확인 화면 라벨과 API 이름이 가장 헷갈리는 두 가지예요. | 화면에서 보이는 이름 | API에서 쓰는 이름 | 같은 개념 | | ----------- | ------------ | -------------------------------------------------------------------- | | **한페이지 문서** | `summary` | AI가 만든 노트 요약. 노트를 가져올 때 `include: ["summary"]`로 받아요. | | **스크립트** | `transcript` | 음성을 받아쓴 발화 기록. `include: ["transcript"]`로 받고, 문단 단위는 `paragraphs`예요. | 화면의 "한페이지 문서"를 API에서 찾으면 안 나와요. API에서는 `summary`예요. 마찬가지로 화면의 "스크립트"는 API에서 `transcript`(문단은 `paragraphs`)로 불러요. ## 전체 용어 대응 | 화면에서 보이는 이름 | API에서 쓰는 이름 | 비고 | | ----------- | ----------------------------- | --------------------------------------------- | | 노트 | `note` (`noteGuid`로 식별) | 화면·API 동일 | | 한페이지 문서 | `summary` | 이름 다름 (위 참고) | | 스크립트 | `transcript` · `paragraphs` | 이름 다름 (위 참고) | | 문서 | `document` | 템플릿으로 생성한 문서 | | 템플릿 | `documentTemplate` | | | 폴더 | `folder` | 화면·API 동일. 내부 구현 명칭은 다름 (아래 참고) | | 공유 링크 | `shareLink` | | | 단어장 | `wordMemory` | | | 위키 | `wiki` · `wikiPage` | | | 음성 파일 | `voiceFile` | 업로드한 오디오·영상 파일 | | 워크스페이스 | `workspace` (`workspaceGuid`) | 일부 응답에 레거시 `isTeamFolder` 등 "team" 표현이 남아 있어요 | 화면과 API 모두 폴더를 `folder`라고 불러요. 다만 Tiro 내부 구현에서는 `thread`라고 해서, 일부 레거시 필드(예: `legacyThreadId`)에 그 흔적이 보일 수 있어요. 새로 작성하는 코드에서는 `folder` 관련 필드만 쓰면 돼요. # 사용 정책 & 요금 Source: https://docs.tiro.ooo/ko/developers/resources/usage-policy REST API·MCP·CLI의 인증, 요금, 요청 제한. REST API, MCP, CLI의 인증 방식과 요금, 요청 제한을 정리했어요. ## 인증 REST API·MCP·CLI는 모두 같은 자격 증명 체계를 써요. * **API Key**: `{id}.{secret}` 형식의 Bearer 토큰. REST·MCP·CLI에서 모두 동작해요. * **JWT**: MCP는 OAuth로 발급된 JWT도 받아요. (대화형 AI 클라이언트용) 가입할 때 사용한 로그인 방식과 관계없이 유효한 API Key나 토큰으로 인증할 수 있어요. 자세한 발급·사용법은 [인증](/ko/developers/fundamentals/authentication)을 참고하세요. ### 키는 누가 발급하나요 [platform.tiro.ooo/me/api-keys](https://platform.tiro.ooo/me/api-keys)에서 **어떤 플랜에서든** 계정 API Key를 발급할 수 있어요. 계정 API Key는 현재 접근 가능한 워크스페이스에서 사용자와 같은 권한으로 동작해요. 워크스페이스·조직 API Key는 해당 워크스페이스나 조직의 관리자만 발급할 수 있어요. ## 무엇이 무료이고 무엇이 유료인가 노트·폴더·공유 링크·문서 템플릿·스크립트·단어장 조회에는 크레딧이 들지 않아요. 위키 엔드포인트는 유료 플랜이 필요해요. 개인 워크스페이스는 **Pro 이상** 플랜, 팀 워크스페이스는 **Team 이상** 플랜이어야 해요. 자격이 없는 플랜에서 호출하면 `402 Payment Required`를 받아요. 위키 게이트는 REST와 MCP에 동일하게 적용돼요 (MCP `search_wiki`·`get_wiki_page`·`list_wiki_mentions`·`get_wiki_graph`). | 응답 코드 | 발생 조건 | 해결 | | -------------------------- | ---------------------------------------------- | ------------------------------ | | `402` `WIKI_PLAN_REQUIRED` | 워크스페이스 플랜이 위키를 쓸 수 없는 등급 (Free·Lite·구독 없음·비활성) | 개인은 Pro 이상, 팀은 Team 이상으로 업그레이드 | | `402` `WIKI_NOT_ACTIVATED` | 플랜은 되지만 관리자가 위키를 켜지 않음 | 워크스페이스 관리자가 위키 기능을 활성화 | 음성 인식(STT)과 대량 LLM 처리에 대한 과금은 아직 API·MCP를 통해서는 발생하지 않아요. ## Rate limit API Key 하나당 **60초에 600 요청**까지 보낼 수 있어요. 초과하면 `429 Too Many Requests`를 받고, 응답에 다시 시도할 시점을 알려주는 `Retry-After`와 `X-RateLimit-*` 헤더가 담겨요. 자세한 응답 형식은 [에러 처리](/ko/developers/fundamentals/error-handling)를 참고하세요. # 개요 Source: https://docs.tiro.ooo/ko/developers/voice-file/overview Voice File Job 생성, 업로드, 상태 확인, 결과 조회·삭제 방법. Voice File Job은 생성 → 업로드 → upload-complete 호출 → 상태 확인 → 결과 조회 순서로 처리해요. upload-complete는 클라이언트가 직접 호출하며 S3 이벤트는 사용하지 않아요. ## 필요한 것 * 계정 API Key 또는 워크스페이스 API Key: `Authorization: Bearer {id}.{secret}` * Tiro 관리자가 해당 워크스페이스의 Voice File Job 정책을 활성화해야 해요. * transcriptLocaleHints: 최대 1개 (선택) * **제공하지 않으면 언어가 자동으로 감지돼요** * translationLocales: 최대 5개 (선택) ## 전체 체크리스트 1. Job 생성 → `{ id, uploadUri }` 수신 2. `uploadUri`에 오디오 업로드 3. `PUT /v1/external/voice-file/jobs/{jobId}/upload-complete` 호출 4. 완료될 때까지 job 상태 폴링 5. transcript 및 (선택적으로) translations 가져오기 6. 콘텐츠를 더 잘 이해하기 위해 paragraph summary 가져오기 ## 웹훅으로 상태 변경을 받고 작업을 삭제하려면 어떻게 하나요? 폴링 대신 작업 상태 변경을 받으려면 `voice_file_job.created`, `voice_file_job.completed`, `voice_file_job.failed`, `voice_file_job.deleted`를 구독하세요. 웹훅 페이로드는 작업 메타데이터만 포함해요. Tiro는 전사 본문을 웹훅으로 전송하지 않으므로 `GET /v1/external/voice-file/jobs/{jobId}/transcript`로 가져오세요. 어떤 상태의 작업이든 `DELETE /v1/external/voice-file/jobs/{jobId}`로 삭제할 수 있어요. Tiro는 오디오와 생성된 결과를 삭제하고, 삭제 뒤 도착하는 처리 콜백은 무시해요. ## 오디오와 전사 데이터는 어떻게 보관되나요? Tiro는 업로드한 오디오를 객체 저장소에, 전사·번역 결과를 서비스 데이터베이스에 저장해요. API에는 자동 보관 기간을 설정하는 기능이 없으므로, 데이터가 더 필요하지 않으면 `DELETE /v1/external/voice-file/jobs/{jobId}`를 호출하세요. 계정 API Key는 자신이 만든 작업만, 워크스페이스 API Key는 같은 워크스페이스의 모든 작업에 접근해요. 작업을 삭제하면 오디오와 전사·번역 결과도 지워져 다시 조회할 수 없어요. ## 폴링 전략 (권장) * `GET /v1/external/voice-file/jobs/{jobId}`를 exponential backoff로 폴링해요 * 1\~2s 간격으로 시작해서 4s, 8s, 최대 30s까지 늘려요 * 중단 조건: * 성공: `status` = `COMPLETED` * 실패: `status` = `FAILED` * 성공 후: * 항상 transcript를 가져와요: `GET /v1/external/voice-file/jobs/{jobId}/transcript` * translations를 요청했다면: `GET /v1/external/voice-file/jobs/{jobId}/translations` 또는 locale별 endpoint * paragraph summary 가져오기: * transcript의 경우: `GET /v1/external/voice-file/jobs/{jobId}/transcript/paragraph-summary` * translations의 경우: `GET /v1/external/voice-file/jobs/{jobId}/translations/{locale}/paragraph-summary` 처리가 성공했을 때의 최종 상태는 `COMPLETED`예요. 이는 transcript, translation(요청한 경우), 그리고 둘 다에 대한 paragraph summary를 포함한 모든 처리가 완료되었다는 의미예요. ## 파일 제한 및 요구사항 ### 지원하는 오디오 포맷 지원하는 파일 형식은 다음과 같아요. **오디오 포맷:** | Format | MIME Type | Extension | | ------- | ---------- | --------- | | **MP3** | audio/mpeg | .mp3 | | **WAV** | audio/wav | .wav | | **M4A** | audio/mp4 | .m4a | **비디오 포맷 (오디오 추출):** | Format | MIME Type | Extension | | ------- | --------- | --------- | | **MP4** | video/mp4 | .mp4 | ### 파일 크기 및 길이 제한 | 제한 종류 | 값 | 비고 | | ------------ | -------------- | ----------- | | **최대 파일 크기** | 500 MB | | | **최대 길이** | 4시간 | | | **최소 샘플레이트** | 8 kHz | 음성 인식 최소 기준 | | **권장 샘플레이트** | 16 kHz+ | | | **최대 샘플레이트** | 48 kHz | | | **채널** | Mono 또는 Stereo | 다중 화자 지원 | ### 처리 시간 예상치 파일 길이별 예상 처리 시간은 다음과 같아요. | 파일 길이 | 일반적인 처리 시간 | | ------ | ---------- | | 5분 미만 | 45-75초 | | 5-20분 | 1-3분 | | 20-60분 | 3-6분 | | 1-4시간 | 6-18분 | ## Paragraph Summary 기능 Paragraph Summary는 전사 또는 번역 결과를 단락별로 요약해요. ### 동작 방식 전사 텍스트를 단락으로 나눈 뒤 각 단락의 요약을 만들어요. 번역을 요청했다면 번역 결과에도 같은 과정을 적용해요. 요약은 전사·번역 처리가 끝난 뒤 비동기로 생성돼요. ## 시퀀스 ```mermaid theme={"system"} sequenceDiagram participant Client participant API as Tiro API participant Storage as File Storage participant Worker as Tiro Worker participant STT as STT Engine participant TR as Translation Engine participant WH as Webhook Service %% Job creation Client->>API: POST /v1/external/voice-file/jobs (transcriptLocaleHints, translationLocales) API->>Storage: Generate upload URL API-->>Client: 201 Created {id, uploadUri} %% File upload Client->>Storage: PUT audio file Client->>API: PUT /v1/external/voice-file/jobs/{jobId}/upload-complete %% Pipeline API->>Worker: Enqueue job (start processing) Worker->>STT: Speech-to-text STT-->>Worker: transcript alt translations requested Worker->>TR: Translate to requested locales TR-->>Worker: translations end Worker->>API: mark job = COMPLETED or FAILED opt Webhook configured API-->>WH: POST {jobId, status=COMPLETED} end %% Results Client->>API: GET /v1/external/voice-file/jobs/{jobId} API-->>Client: status, timestamps Client->>API: GET /v1/external/voice-file/jobs/{jobId}/transcript API-->>Client: transcript Client->>API: GET /v1/external/voice-file/jobs/{jobId}/translations API-->>Client: translations[] ``` 전체 예시는 [단계별 튜토리얼](/ko/developers/voice-file/tutorial)을 참고하세요. # Tutorial Source: https://docs.tiro.ooo/ko/developers/voice-file/tutorial Step-by-step guide to process audio files with transcription and translation ## Overview This tutorial walks you through the complete process of uploading an audio file, getting it transcribed, and translated into multiple languages using the Tiro API. ## Prerequisites * Valid Tiro API key * Audio file (MP3, WAV, M4A) * Max file size: 500MB * Max duration: 4 hours ## Step 1: Create a Voice File Job Start by creating a job with your desired transcription and translation settings: ```bash cURL theme={"system"} curl -X POST https://api.tiro.ooo/v1/external/voice-file/jobs \ -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "transcriptLocaleHints": ["ko_KR"], "translationLocales": ["en_US"] }' ``` ```javascript Node.js theme={"system"} async function createVoiceFileJob() { const response = await fetch('https://api.tiro.ooo/v1/external/voice-file/jobs', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ transcriptLocaleHints: ['ko_KR'], translationLocales: ['en_US'] }) }); if (!response.ok) { throw new Error(`Failed to create job: ${response.status}`); } const job = await response.json(); console.log('Job created:', job.id); console.log('Upload URL:', job.uploadUri); return job; } ``` ```python Python theme={"system"} import requests import os def create_voice_file_job(): response = requests.post( 'https://api.tiro.ooo/v1/external/voice-file/jobs', headers={ 'Authorization': f'Bearer {os.environ["TIRO_API_KEY"]}', 'Content-Type': 'application/json' }, json={ 'transcriptLocaleHints': ['ko_KR'], 'translationLocales': ['en_US'] } ) response.raise_for_status() job = response.json() print(f'Job created: {job["id"]}') print(f'Upload URL: {job["uploadUri"]}') return job ``` ```go Go theme={"system"} package main import ( "bytes" "encoding/json" "fmt" "net/http" "os" ) type CreateJobRequest struct { TranscriptLocaleHints []string `json:"transcriptLocaleHints"` TranslationLocales []string `json:"translationLocales"` } type CreateJobResponse struct { ID string `json:"id"` UploadUri string `json:"uploadUri"` } func createVoiceFileJob() (*CreateJobResponse, error) { reqBody := CreateJobRequest{ TranscriptLocaleHints: []string{"ko_KR"}, TranslationLocales: []string{"en_US"}, } jsonBody, _ := json.Marshal(reqBody) req, _ := http.NewRequest("POST", "https://api.tiro.ooo/v1/external/voice-file/jobs", bytes.NewBuffer(jsonBody)) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", os.Getenv("TIRO_API_KEY"))) req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var job CreateJobResponse json.NewDecoder(resp.Body).Decode(&job) fmt.Printf("Job created: %s\n", job.ID) fmt.Printf("Upload URL: %s\n", job.UploadUri) return &job, nil } ``` ```kotlin Kotlin + Spring theme={"system"} import org.springframework.beans.factory.annotation.Value import org.springframework.http.* import org.springframework.web.client.RestTemplate data class CreateJobRequest( val transcriptLocaleHints: List, val translationLocales: List ) data class CreateJobResponse( val id: String, val uploadUri: String ) @Service class VoiceFileService { @Value("\${tiro.api.key}") private lateinit var apiKey: String private val restTemplate = RestTemplate() fun createVoiceFileJob(): CreateJobResponse { val headers = HttpHeaders().apply { set("Authorization", "Bearer $apiKey") contentType = MediaType.APPLICATION_JSON } val request = CreateJobRequest( transcriptLocaleHints = listOf("ko_KR"), translationLocales = listOf("en_US") ) val entity = HttpEntity(request, headers) val response = restTemplate.exchange( "https://api.tiro.ooo/v1/external/voice-file/jobs", HttpMethod.POST, entity, CreateJobResponse::class.java ) val job = response.body!! println("Job created: ${job.id}") println("Upload URL: ${job.uploadUri}") return job } } ``` **Example Response:** ```json theme={"system"} { "id": "b2d1ab32-3fe2-4201-b0b4-391abdbaa023", "uploadUri": "https://storage.example.com/upload/signed-url" } ``` ## Step 2: Upload Your Audio File Upload your audio file to the provided signed URL: ```bash cURL theme={"system"} # Upload audio file to the signed URL (replace UPLOAD_URI with the uploadUri from Step 1) curl -X PUT "$UPLOAD_URI" \ -H "Content-Type: audio/mpeg" \ --data-binary @/path/to/your/audio.mp3 ``` ```javascript Node.js theme={"system"} async function uploadAudioFile(uploadUri, audioFile) { const response = await fetch(uploadUri, { method: 'PUT', body: audioFile, headers: { 'Content-Type': audioFile.type || 'audio/mpeg' } }); if (!response.ok) { throw new Error(`Upload failed: ${response.status}`); } console.log('File uploaded successfully'); } // For Node.js with file system const fs = require('fs'); async function uploadAudioFileNode(uploadUri, filePath) { const fileBuffer = fs.readFileSync(filePath); const response = await fetch(uploadUri, { method: 'PUT', body: fileBuffer, headers: { 'Content-Type': 'audio/mpeg' } }); if (!response.ok) { throw new Error(`Upload failed: ${response.status}`); } console.log('File uploaded successfully'); } ``` ```python Python theme={"system"} def upload_audio_file(upload_uri, file_path): with open(file_path, 'rb') as audio_file: response = requests.put( upload_uri, data=audio_file, headers={'Content-Type': 'audio/mpeg'} ) response.raise_for_status() print('File uploaded successfully') ``` ```go Go theme={"system"} func uploadAudioFile(uploadUri, filePath string) error { file, err := os.Open(filePath) if err != nil { return err } defer file.Close() req, _ := http.NewRequest("PUT", uploadUri, file) req.Header.Set("Content-Type", "audio/mpeg") client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("upload failed: %d", resp.StatusCode) } fmt.Println("File uploaded successfully") return nil } ``` ```kotlin Kotlin + Spring theme={"system"} fun uploadAudioFile(uploadUri: String, filePath: String) { val file = File(filePath) val headers = HttpHeaders().apply { contentType = MediaType.parseMediaType("audio/mpeg") } val resource = FileSystemResource(file) val entity = HttpEntity(resource, headers) val response = restTemplate.exchange( uploadUri, HttpMethod.PUT, entity, String::class.java ) if (response.statusCode.is2xxSuccessful) { println("File uploaded successfully") } else { throw RuntimeException("Upload failed: ${response.statusCode}") } } ``` ## Step 3: Notify Upload Completion Tell the API that the upload is complete: ```bash cURL theme={"system"} curl -X PUT "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/upload-complete" \ -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" ``` ```javascript Node.js theme={"system"} async function notifyUploadComplete(jobId) { const response = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}/upload-complete`, { method: 'PUT', headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}`, 'Content-Type': 'application/json' } } ); if (!response.ok) { throw new Error(`Failed to notify upload: ${response.status}`); } console.log('Upload notification sent'); } ``` ```python Python theme={"system"} def notify_upload_complete(job_id): response = requests.put( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}/upload-complete', headers={ 'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}', 'Content-Type': 'application/json' } ) response.raise_for_status() print('Upload notification sent') ``` ```go Go theme={"system"} func notifyUploadComplete(jobId string) error { url := fmt.Sprintf("https://api.tiro.ooo/v1/external/voice-file/jobs/%s/upload-complete", jobId) req, _ := http.NewRequest("PUT", url, nil) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", os.Getenv("TIRO_API_KEY"))) req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() fmt.Println("Upload notification sent") return nil } ``` ```kotlin Kotlin + Spring theme={"system"} fun notifyUploadComplete(jobId: String) { val headers = HttpHeaders().apply { set("Authorization", "Bearer $apiKey") contentType = MediaType.APPLICATION_JSON } val entity = HttpEntity(headers) restTemplate.exchange( "https://api.tiro.ooo/v1/external/voice-file/jobs/$jobId/upload-complete", HttpMethod.PUT, entity, String::class.java ) println("Upload notification sent") } ``` ## Step 4: Poll for Job Completion Monitor the job status until processing is complete: ```bash cURL theme={"system"} # Check job status (poll until status is COMPLETED or FAILED) curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID" \ -H "Authorization: Bearer $TIRO_API_KEY" # Example response: # { # "id": "job_abc123", # "status": "COMPLETED", # "fileUploadedAt": "2024-01-01T12:00:20Z", # "processStartedAt": "2024-01-01T12:01:00Z", # "processCompletedAt": "2024-01-01T12:02:30Z" # } ``` ```javascript Node.js theme={"system"} async function waitForJobCompletion(jobId) { let delay = 2000; // Start with 2 seconds const maxDelay = 30000; // Max 30 seconds const maxAttempts = 60; // 30 minutes max let attempts = 0; while (attempts < maxAttempts) { try { const response = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}`, { headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}` } } ); if (!response.ok) { throw new Error(`Failed to get job status: ${response.status}`); } const job = await response.json(); console.log(`Job status: ${job.status}`); if (job.status === 'COMPLETED') { console.log('Job completed successfully!'); return job; } if (job.status === 'FAILED') { throw new Error(`Job failed: ${job.errorMessage || 'Unknown error'}`); } // Still processing - wait with exponential backoff await new Promise(resolve => setTimeout(resolve, delay)); delay = Math.min(delay * 1.2, maxDelay); attempts++; } catch (error) { console.error('Error checking job status:', error); attempts++; await new Promise(resolve => setTimeout(resolve, delay)); delay = Math.min(delay * 1.5, maxDelay); } } throw new Error('Job did not complete within timeout'); } ``` ```python Python theme={"system"} import time import asyncio async def wait_for_job_completion(job_id): delay = 2 # Start with 2 seconds max_delay = 30 # Max 30 seconds max_attempts = 60 # 30 minutes max attempts = 0 while attempts < max_attempts: try: response = requests.get( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}', headers={ 'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}' } ) response.raise_for_status() job = response.json() print(f'Job status: {job["status"]}') if job['status'] == 'COMPLETED': print('Job completed successfully!') return job if job['status'] == 'FAILED': error_msg = job.get('errorMessage', 'Unknown error') raise Exception(f'Job failed: {error_msg}') # Still processing - wait with exponential backoff await asyncio.sleep(delay) delay = min(delay * 1.2, max_delay) attempts += 1 except Exception as e: print(f'Error checking job status: {e}') attempts += 1 await asyncio.sleep(delay) delay = min(delay * 1.5, max_delay) raise Exception('Job did not complete within timeout') ``` ```go Go theme={"system"} type JobStatus struct { ID string `json:"id"` Status string `json:"status"` ErrorMessage string `json:"errorMessage,omitempty"` } func waitForJobCompletion(jobId string) (*JobStatus, error) { delay := 2 * time.Second maxDelay := 30 * time.Second maxAttempts := 60 client := &http.Client{} url := fmt.Sprintf("https://api.tiro.ooo/v1/external/voice-file/jobs/%s", jobId) for attempts := 0; attempts < maxAttempts; attempts++ { req, _ := http.NewRequest("GET", url, nil) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", os.Getenv("TIRO_API_KEY"))) resp, err := client.Do(req) if err != nil { time.Sleep(delay) delay = time.Duration(float64(delay) * 1.5) if delay > maxDelay { delay = maxDelay } continue } var job JobStatus json.NewDecoder(resp.Body).Decode(&job) resp.Body.Close() fmt.Printf("Job status: %s\n", job.Status) if job.Status == "COMPLETED" { fmt.Println("Job completed successfully!") return &job, nil } if job.Status == "FAILED" { return nil, fmt.Errorf("job failed: %s", job.ErrorMessage) } time.Sleep(delay) delay = time.Duration(float64(delay) * 1.2) if delay > maxDelay { delay = maxDelay } } return nil, fmt.Errorf("job did not complete within timeout") } ``` ```kotlin Kotlin + Spring theme={"system"} import java.util.concurrent.TimeUnit data class JobStatus( val id: String, val status: String, val errorMessage: String? = null ) fun waitForJobCompletion(jobId: String): JobStatus { var delay = 2000L // 2 seconds val maxDelay = 30000L // 30 seconds val maxAttempts = 60 repeat(maxAttempts) { attempt -> try { val headers = HttpHeaders().apply { set("Authorization", "Bearer $apiKey") } val entity = HttpEntity(headers) val response = restTemplate.exchange( "https://api.tiro.ooo/v1/external/voice-file/jobs/$jobId", HttpMethod.GET, entity, JobStatus::class.java ) val job = response.body!! println("Job status: ${job.status}") when (job.status) { "COMPLETED" -> { println("Job completed successfully!") return job } "FAILED" -> { throw RuntimeException("Job failed: ${job.errorMessage}") } } TimeUnit.MILLISECONDS.sleep(delay) delay = minOf((delay * 1.2).toLong(), maxDelay) } catch (e: Exception) { println("Error checking job status: ${e.message}") TimeUnit.MILLISECONDS.sleep(delay) delay = minOf((delay * 1.5).toLong(), maxDelay) } } throw RuntimeException("Job did not complete within timeout") } ``` ## Step 5: Retrieve Results Once the job is completed, fetch the transcript and translations: ```bash cURL theme={"system"} # Get transcript curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/transcript" \ -H "Authorization: Bearer $TIRO_API_KEY" # Get all translations curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/translations" \ -H "Authorization: Bearer $TIRO_API_KEY" # Get specific translation (e.g., English) curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/translations/en_US" \ -H "Authorization: Bearer $TIRO_API_KEY" # Get transcript paragraph summary curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/transcript/paragraph-summary" \ -H "Authorization: Bearer $TIRO_API_KEY" # Get translation paragraph summary curl -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/translations/en_US/paragraph-summary" \ -H "Authorization: Bearer $TIRO_API_KEY" ``` ```javascript Node.js theme={"system"} async function getJobResults(jobId) { // Get transcript const transcriptResponse = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}/transcript`, { headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}` } } ); if (!transcriptResponse.ok) { throw new Error(`Failed to get transcript: ${transcriptResponse.status}`); } const transcript = await transcriptResponse.json(); console.log('Transcript:', transcript.text); // Get available translations const translationsResponse = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}/translations`, { headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}` } } ); if (!translationsResponse.ok) { throw new Error(`Failed to get translations: ${translationsResponse.status}`); } const translations = await translationsResponse.json(); // Get each translation const translationResults = {}; for (const translation of translations) { translationResults[translation.locale] = translation.text; } // Get paragraph summaries const transcriptSummaryResponse = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}/transcript/paragraph-summary`, { headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}` } } ); let transcriptSummary = null; if (transcriptSummaryResponse.ok) { transcriptSummary = await transcriptSummaryResponse.json(); } // Get translation summaries const translationSummaries = {}; for (const translation of translations) { const summaryResponse = await fetch( `https://api.tiro.ooo/v1/external/voice-file/jobs/${jobId}/translations/${translation.locale}/paragraph-summary`, { headers: { 'Authorization': `Bearer ${process.env.TIRO_API_KEY}` } } ); if (summaryResponse.ok) { const summaryData = await summaryResponse.json(); translationSummaries[translation.locale] = summaryData.summary; } } return { transcript: transcript.text, translations: translationResults, transcriptSummary: transcriptSummary?.summary, translationSummaries }; } ``` ```python Python theme={"system"} def get_job_results(job_id): # Get transcript transcript_response = requests.get( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}/transcript', headers={'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}'} ) transcript_response.raise_for_status() transcript = transcript_response.json() print(f'Transcript: {transcript["text"]}') # Get available translations translations_response = requests.get( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}/translations', headers={'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}'} ) translations_response.raise_for_status() translations = translations_response.json() # Get each translation translation_results = {} for translation in translations: translation_results[translation['locale']] = translation['text'] # Get paragraph summaries transcript_summary = None try: transcript_summary_response = requests.get( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}/transcript/paragraph-summary', headers={'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}'} ) if transcript_summary_response.ok: transcript_summary_data = transcript_summary_response.json() transcript_summary = transcript_summary_data['summary'] except: pass # Get translation summaries translation_summaries = {} for translation in translations: try: summary_response = requests.get( f'https://api.tiro.ooo/v1/external/voice-file/jobs/{job_id}/translations/{translation["locale"]}/paragraph-summary', headers={'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}'} ) if summary_response.ok: summary_data = summary_response.json() translation_summaries[translation['locale']] = summary_data['summary'] except: pass return { 'transcript': transcript['text'], 'translations': translation_results, 'transcript_summary': transcript_summary, 'translation_summaries': translation_summaries } ``` ```go Go theme={"system"} type Transcript struct { JobId string `json:"jobId"` Locales []string `json:"locales"` Text string `json:"text"` } type Translation struct { JobId string `json:"jobId"` Locale string `json:"locale"` Text string `json:"text"` } type JobResults struct { Transcript string Translations map[string]string } func getJobResults(jobId string) (*JobResults, error) { client := &http.Client{} apiKey := os.Getenv("TIRO_API_KEY") // Get transcript transcriptUrl := fmt.Sprintf("https://api.tiro.ooo/v1/external/voice-file/jobs/%s/transcript", jobId) req, _ := http.NewRequest("GET", transcriptUrl, nil) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var transcript Transcript json.NewDecoder(resp.Body).Decode(&transcript) fmt.Printf("Transcript: %s\n", transcript.Text) // Get translations translationsUrl := fmt.Sprintf("https://api.tiro.ooo/v1/external/voice-file/jobs/%s/translations", jobId) req, _ = http.NewRequest("GET", translationsUrl, nil) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) resp, err = client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var translations []Translation json.NewDecoder(resp.Body).Decode(&translations) translationResults := make(map[string]string) for _, t := range translations { translationResults[t.Locale] = t.Text } return &JobResults{ Transcript: transcript.Text, Translations: translationResults, }, nil } ``` ```kotlin Kotlin + Spring theme={"system"} data class Transcript( val jobId: String, val locales: List, val text: String ) data class Translation( val jobId: String, val locale: String, val text: String ) data class JobResults( val transcript: String, val translations: Map ) fun getJobResults(jobId: String): JobResults { val headers = HttpHeaders().apply { set("Authorization", "Bearer $apiKey") } val entity = HttpEntity(headers) // Get transcript val transcriptResponse = restTemplate.exchange( "https://api.tiro.ooo/v1/external/voice-file/jobs/$jobId/transcript", HttpMethod.GET, entity, Transcript::class.java ) val transcript = transcriptResponse.body!! println("Transcript: ${transcript.text}") // Get translations val translationsResponse = restTemplate.exchange( "https://api.tiro.ooo/v1/external/voice-file/jobs/$jobId/translations", HttpMethod.GET, entity, object : ParameterizedTypeReference>() {} ) val translations = translationsResponse.body!! val translationResults = translations.associate { it.locale to it.text } return JobResults( transcript = transcript.text, translations = translationResults ) } ``` ## Complete Example Here's a complete example that processes an audio file from start to finish: ```bash cURL theme={"system"} #!/bin/bash # Complete Voice File Processing Script # Set your API key export TIRO_API_KEY="your_api_key_here" AUDIO_FILE="/path/to/your/audio.mp3" # Step 1: Create job echo "Creating voice file job..." RESPONSE=$(curl -s -X POST https://api.tiro.ooo/v1/external/voice-file/jobs \ -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "transcriptLocaleHints": ["ko_KR"], "translationLocales": ["en_US"] }') JOB_ID=$(echo $RESPONSE | jq -r '.id') UPLOAD_URI=$(echo $RESPONSE | jq -r '.uploadUri') echo "Job created: $JOB_ID" # Step 2: Upload file echo "Uploading audio file..." curl -s -X PUT "$UPLOAD_URI" \ -H "Content-Type: audio/mpeg" \ --data-binary @"$AUDIO_FILE" echo "File uploaded successfully" # Step 3: Notify upload complete echo "Notifying upload completion..." curl -s -X PUT "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/upload-complete" \ -H "Authorization: Bearer $TIRO_API_KEY" \ -H "Content-Type: application/json" # Step 4: Poll for completion echo "Waiting for processing to complete..." while true; do STATUS=$(curl -s -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID" \ -H "Authorization: Bearer $TIRO_API_KEY" | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "COMPLETED" ]; then echo "Job completed successfully!" break elif [ "$STATUS" = "FAILED" ]; then echo "Job failed!" exit 1 fi sleep 5 done # Step 5: Get results echo "Retrieving results..." echo "=== Transcript ===" curl -s -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/transcript" \ -H "Authorization: Bearer $TIRO_API_KEY" | jq '.text' echo "=== Translation (en_US) ===" curl -s -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/translations/en_US" \ -H "Authorization: Bearer $TIRO_API_KEY" | jq '.text' echo "=== Paragraph Summary ===" curl -s -X GET "https://api.tiro.ooo/v1/external/voice-file/jobs/$JOB_ID/transcript/paragraph-summary" \ -H "Authorization: Bearer $TIRO_API_KEY" | jq '.summary' echo "Processing completed!" ``` ```javascript Node.js theme={"system"} async function processAudioFile(audioFile) { try { // Step 1: Create job console.log('Creating voice file job...'); const job = await createVoiceFileJob(); // Step 2: Upload file console.log('Uploading audio file...'); await uploadAudioFile(job.uploadUri, audioFile); // Step 3: Notify upload complete console.log('Notifying upload completion...'); await notifyUploadComplete(job.id); // Step 4: Wait for processing console.log('Waiting for processing to complete...'); const completedJob = await waitForJobCompletion(job.id); // Step 5: Get results console.log('Retrieving results...'); const results = await getJobResults(job.id); console.log('Processing completed!'); console.log('Transcript:', results.transcript); console.log('Translations:', results.translations); console.log('Transcript Summary:', results.transcriptSummary); console.log('Translation Summaries:', results.translationSummaries); return results; } catch (error) { console.error('Error processing audio file:', error); throw error; } } // Usage processAudioFile(myAudioFile) .then(results => { // Handle successful processing displayResults(results); }) .catch(error => { // Handle error showError(error.message); }); ``` ```python Python theme={"system"} async def process_audio_file(file_path): try: # Step 1: Create job print('Creating voice file job...') job = create_voice_file_job() # Step 2: Upload file print('Uploading audio file...') upload_audio_file(job['uploadUri'], file_path) # Step 3: Notify upload complete print('Notifying upload completion...') notify_upload_complete(job['id']) # Step 4: Wait for processing print('Waiting for processing to complete...') completed_job = await wait_for_job_completion(job['id']) # Step 5: Get results print('Retrieving results...') results = get_job_results(job['id']) print('Processing completed!') print(f'Transcript: {results["transcript"]}') print(f'Translations: {results["translations"]}') print(f'Transcript Summary: {results["transcript_summary"]}') print(f'Translation Summaries: {results["translation_summaries"]}') return results except Exception as e: print(f'Error processing audio file: {e}') raise # Usage if __name__ == '__main__': asyncio.run(process_audio_file('path/to/audio.mp3')) ``` ## Step 6: Understanding Paragraph Summaries The Paragraph Summary feature provides intelligent content summarization that helps you quickly understand the key points from your audio files. ### What are Paragraph Summaries? Paragraph summaries are automatically generated overviews of your transcript or translation content, broken down into logical sections. Each summary provides: * **Concise Overview**: Key points from each paragraph in markdown format * **Language-Specific**: Summaries generated for both transcript and translations * **Structured Content**: Easy to parse and integrate into your applications ### Example Response When you fetch paragraph summaries, you'll receive a response like this: ```json theme={"system"} { "jobId": "job-123", "locale": "ko_KR", "summary": [ { "type": "markdown", "content": "### 회의는 프로젝트 진행 상황을 점검하고, 다음 단계에 대한 계획을 수립하는 데 중점을 두었습니다." }, { "type": "markdown", "content": "### 팀원들은 각자의 담당 업무에 대한 현재 상태를 보고하고, 발생한 이슈들에 대해 논의했습니다." } ] } ``` ### When are Summaries Available? * **Transcript and Translation Summaries**: Available after job completion (`COMPLETED` status) * `COMPLETED` means all processing is finished: transcript, translation (if requested), and paragraph summaries for both * **Processing Time**: Summaries are generated asynchronously, usually within 30-60 seconds after the main processing ## Polling Best Practices ### Exponential Backoff Strategy * **Start delay**: 2 seconds (processing takes time to start) * **Growth factor**: 1.2x (gentle increase) * **Maximum delay**: 30 seconds (avoid overwhelming the server) * **Maximum attempts**: Based on expected processing time ### Job State Transitions ```mermaid theme={"system"} stateDiagram-v2 [*] --> CREATED: Create job CREATED --> UPLOADED: Upload file UPLOADED --> PROCESSING: Start processing PROCESSING --> COMPLETED: Success PROCESSING --> FAILED: Error occurred COMPLETED --> [*] FAILED --> [*] ``` ### Processing Time Guidelines | File Duration | Expected Processing Time | Recommended Poll Interval | | -------------- | ------------------------ | ------------------------- | | \< 5 minutes | 30-60 seconds | Start: 2s, Max: 10s | | 5-30 minutes | 1-5 minutes | Start: 5s, Max: 20s | | 30-120 minutes | 5-15 minutes | Start: 10s, Max: 30s | | > 2 hours | 15-30 minutes | Start: 30s, Max: 60s | ## Common Issues & Solutions ### Upload Failures * **Issue**: 413 Payload Too Large * **Solution**: Check file size (max 500MB) and compress if needed ### Processing Failures * **Issue**: Low audio quality * **Solution**: Ensure sample rate ≥8kHz and minimal background noise ### Timeout Issues * **Issue**: Job doesn't complete within expected time * **Solution**: Increase timeout for longer files, check job state for errors If you need to revisit the bigger picture, see the [Voice File Overview](/ko/developers/voice-file/overview); for every parameter and response field, jump into the [API Reference](/api-reference/voice-file/create-voice-file-job). # Best Practices Source: https://docs.tiro.ooo/ko/developers/webhooks/best-practices Webhook 이벤트를 처리하기 위한 모범 사례 ## Idempotency 멱등성 있는 처리를 위해 이벤트의 `id`와 리소스의 `resourceId`를 사용하세요. ```javascript Node.js theme={"system"} const processedEvents = new Set(); function processEvent(event) { // Deduplicate by event ID if (processedEvents.has(event.id)) { return; } // Process the event handleEvent(event); processedEvents.add(event.id); } ``` ```python Python theme={"system"} processed_events = set() def process_event(event): # Deduplicate by event ID if event['id'] in processed_events: return # Process the event handle_event(event) processed_events.add(event['id']) ``` ```go Go theme={"system"} var processedEvents = make(map[string]bool) func processEvent(event WebhookEvent) { // Deduplicate by event ID if processedEvents[event.ID] { return } // Process the event handleEvent(event) processedEvents[event.ID] = true } ``` ```kotlin Kotlin + Spring theme={"system"} @Service class WebhookService { private val processedEvents = mutableSetOf() fun processEvent(event: WebhookEvent) { // Deduplicate by event ID if (event.id in processedEvents) { return } // Process the event handleEvent(event) processedEvents.add(event.id) } } ``` ## 에러 처리 항상 적절한 HTTP 상태 코드를 반환하세요. ```javascript Node.js theme={"system"} app.post('/en/developers/webhooks/tiro', (req, res) => { try { const event = req.body; // Process the event processEvent(event); res.status(200).send('OK'); } catch (error) { console.error('Webhook processing error:', error); res.status(500).send('Internal server error'); } }); ``` ```python Python theme={"system"} from flask import Flask, request, jsonify @app.route('/en/developers/webhooks/tiro', methods=['POST']) def handle_webhook(): try: event = request.get_json() # Process the event process_event(event) return '', 200 except Exception as error: print(f'Webhook processing error: {error}') return 'Internal server error', 500 ``` ```go Go theme={"system"} func handleWebhook(w http.ResponseWriter, r *http.Request) { var event WebhookEvent if err := json.NewDecoder(r.Body).Decode(&event); err != nil { http.Error(w, "Bad request", http.StatusBadRequest) return } // Process the event if err := processEvent(event); err != nil { log.Printf("Webhook processing error: %v", err) http.Error(w, "Internal server error", http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } ``` ```kotlin Kotlin + Spring theme={"system"} @RestController class WebhookController { @PostMapping("/en/developers/webhooks/tiro") fun handleWebhook(@RequestBody event: WebhookEvent): ResponseEntity { return try { // Process the event processEvent(event) ResponseEntity.ok("OK") } catch (error: Exception) { logger.error("Webhook processing error", error) ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("Internal server error") } } } ``` ## 재시도 처리 전달에 실패한 요청은 Tiro가 재시도해요. 응답 상태에 따라 다음처럼 처리하세요. * **2xx 상태 코드 반환**: 처리에 성공한 경우 * **4xx 상태 코드 반환**: 영구적인 실패인 경우 (재시도하지 않아요) * **5xx 상태 코드 반환**: 일시적인 실패인 경우 (재시도해요) ## 보안 항상 webhook의 진위 여부를 검증하세요. ```javascript Node.js theme={"system"} function verifyWebhookAuth(authHeader, expectedSecret) { const token = authHeader.replace('Bearer ', ''); return token === expectedSecret; } app.post('/en/developers/webhooks/tiro', (req, res) => { const authHeader = req.headers.authorization; if (!verifyWebhookAuth(authHeader, process.env.WEBHOOK_SECRET)) { return res.status(401).send('Unauthorized'); } // Process webhook event processEvent(req.body); res.status(200).send('OK'); }); ``` ```python Python theme={"system"} import os def verify_webhook_auth(auth_header, expected_secret): if not auth_header or not auth_header.startswith('Bearer '): return False token = auth_header.replace('Bearer ', '') return token == expected_secret @app.route('/en/developers/webhooks/tiro', methods=['POST']) def handle_webhook(): auth_header = request.headers.get('Authorization') if not verify_webhook_auth(auth_header, os.getenv('WEBHOOK_SECRET')): return 'Unauthorized', 401 # Process webhook event event = request.get_json() process_event(event) return 'OK', 200 ``` ```go Go theme={"system"} import ( "os" "strings" ) func verifyWebhookAuth(authHeader, expectedSecret string) bool { if !strings.HasPrefix(authHeader, "Bearer ") { return false } token := strings.TrimPrefix(authHeader, "Bearer ") return token == expectedSecret } func handleWebhook(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if !verifyWebhookAuth(authHeader, os.Getenv("WEBHOOK_SECRET")) { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } // Process webhook event var event WebhookEvent json.NewDecoder(r.Body).Decode(&event) processEvent(event) w.WriteHeader(http.StatusOK) } ``` ```kotlin Kotlin + Spring theme={"system"} @RestController class WebhookController { @Value("\${webhook.secret}") private lateinit var webhookSecret: String private fun verifyWebhookAuth(authHeader: String?, expectedSecret: String): Boolean { if (authHeader?.startsWith("Bearer ") != true) { return false } val token = authHeader.removePrefix("Bearer ") return token == expectedSecret } @PostMapping("/en/developers/webhooks/tiro") fun handleWebhook( @RequestHeader("Authorization") authHeader: String?, @RequestBody event: WebhookEvent ): ResponseEntity { if (!verifyWebhookAuth(authHeader, webhookSecret)) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Unauthorized") } // Process webhook event processEvent(event) return ResponseEntity.ok("OK") } } ``` ### 리소스 라우팅 `resourceType`과 `resourceId`로 이벤트를 라우팅하세요. ```javascript theme={"system"} function routeEvent(event) { const { resourceType, resourceId } = event.data; switch (resourceType) { case 'Note': return handleNoteEvent(event.type, resourceId, event.data.resource); case 'NoteDocument': return handleNoteDocumentEvent(event.type, resourceId, event.data.resource); case 'NoteSummary': return handleNoteSummaryEvent(event.type, resourceId, event.data.resource); case 'FolderNoteRelation': return handleFolderNoteEvent(event.type, resourceId, event.data.resource); default: console.log('Unknown resource type:', resourceType); } } ``` # FolderNote Events Source: https://docs.tiro.ooo/ko/developers/webhooks/events/folder-note-events FolderNoteRelation 리소스에 대한 webhook 이벤트 ## 개요 FolderNoteRelation 리소스에 대한 webhook 이벤트예요. 이 이벤트들은 폴더와 노트 사이의 관계를 추적해요. 모든 FolderNote 이벤트는 `resourceType: "FolderNoteRelation"`을 사용해요. 폴더 이벤트도 노트 이벤트와 같은 범위를 따라요. 워크스페이스 전체 구성원에게 공유된 폴더에서 일어난 변화만 발송되고, 개인 폴더나 일부 구성원에게만 공유한 폴더의 변화는 발송되지 않아요. 자세한 내용은 [시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)를 참고하세요. ## 이벤트 상세 Resource ID 패턴: `folder_{folderId}:note_{noteGuid}` ### folder.note.added * 노트가 폴더에 추가될 때 발생해요 ### folder.note.removed * 노트가 폴더에서 제거될 때 발생해요 ## Payload 예시 ### folder.note.added ### folder.note.removed ## 리소스 데이터 구조 ### FolderNoteRelationExternalEventData 폴더 정보 폴더 ID (문자열 형태) 폴더 제목 팀 폴더 여부 (teamNoteSharingType이 null이 아니면 true) 추가된 노트의 GUID # Note Document Events Source: https://docs.tiro.ooo/ko/developers/webhooks/events/note-document-events NoteDocument 리소스에 대한 webhook 이벤트 ## 개요 NoteDocument 리소스에 대한 webhook 이벤트예요. 모든 note document 이벤트는 `resourceType: "NoteDocument"`를 사용해요. ## 이벤트 상세 ### note\_document.generated * 문서의 모든 섹션이 생성되었을 때 ### note\_document.updated * 사용자가 섹션 내용을 수정할 때 * 문서 메타데이터가 변경될 때 ### note\_document.deleted * 문서가 삭제될 때 ## Payload 예시 ## 리소스 데이터 자세한 스키마 정보는 [API Reference](/api-reference/note-document/get-note-document)의 `NoteDocument` 정의를 참고하세요. # Note Events Source: https://docs.tiro.ooo/ko/developers/webhooks/events/note-events Note 리소스에 대한 webhook 이벤트 ## 개요 Note 리소스에 대한 webhook 이벤트예요. 모든 note 이벤트는 `resourceType: "Note"`를 사용해요. ## 이벤트 상세 ### note.created * 실시간 음성 노트 녹음을 시작할 때 * 녹음 파일로부터 노트를 생성할 때 ### note.deleted * 사용자가 노트를 영구적으로 삭제할 때 ### note.recording.completed (녹음 일시정지) * 실시간 녹음을 일시정지하고, 그 시점까지의 오디오 처리와 텍스트 변환, 문단 생성이 끝났을 때 발생해요 * 한 회의에서 녹음을 여러 번 일시정지할 수 있으므로 같은 노트에서 여러 번 발생할 수 있어요 * 이벤트 이름에는 `completed`가 남아 있지만, 노트가 끝났다는 뜻은 아니에요. 노트의 최종 종료는 `note.ended`로 확인하세요 ### note.user\_content.updated * 사용자가 노트 내용을 직접 편집할 때 ### note.ended * 노트의 모든 처리가 끝나면 발생해요 * `note.recording.completed`와 달리 노트마다 한 번만 발생해요 ### note.participants.updated * 노트에서 회의 참가자가 추가되거나 제거될 때 발생해요 * 기존 참가자의 이름이나 이메일이 변경될 때는 발생하지 **않아요** * `resource` 필드에는 업데이트된 `participants` 배열을 포함한 전체 Note 오브젝트가 담겨요 ## Payload 예시 ## 리소스 데이터 Note 이벤트에는 완전한 Note 리소스 데이터가 포함돼요. 필드 설명은 [Note API](/api-reference/note/get-note)를 참고하세요. **중요**: Note 리소스에는 메타데이터만 담겨 있어요. transcript 내용은 [List Note Paragraphs](/api-reference/note/list-note-paragraphs) API를 사용해 실제 텍스트 데이터를 가져오세요. ## 가이드 ### 실시간 녹음의 일시정지와 종료 구분하기 일시정지 중간 결과는 `note.recording.completed`, 최종 종료는 `note.ended`로 처리하세요. **예시 시나리오:** 1. 회의 시작 → 녹음 시작 2. 녹음 일시정지 → transcript와 요약 처리 → `note.recording.completed` 발생 3. 녹음 재개 → 처리 계속 4. 녹음 일시정지 → `note.recording.completed` 다시 발생 5. 녹음 재개 후 종료 → `note.ended` 발생 **예시 처리:** ```javascript Node.js theme={"system"} async function handleRecordingPaused(event) { const noteId = event.data.resourceId; const note = event.data.resource; const paragraphs = await fetchNoteParagraphs(noteId); processPausedNote(note, paragraphs); } ``` ```python Python theme={"system"} async def handle_recording_paused(event): note_id = event['data']['resourceId'] note = event['data']['resource'] paragraphs = await fetch_note_paragraphs(note_id) process_paused_note(note, paragraphs) ``` ```go Go theme={"system"} func handleRecordingPaused(event WebhookEvent) error { noteID := event.Data.ResourceID note := event.Data.Resource paragraphs, err := fetchNoteParagraphs(noteID) if err != nil { return err } return processPausedNote(note, paragraphs) } ``` ```kotlin Kotlin + Spring theme={"system"} suspend fun handleRecordingPaused(event: WebhookEvent) { val noteId = event.data.resourceId val note = event.data.resource val paragraphs = fetchNoteParagraphs(noteId) processPausedNote(note, paragraphs) } ``` # Note Summary Events Source: https://docs.tiro.ooo/ko/developers/webhooks/events/note-summary-events NoteSummary 리소스에 대한 webhook 이벤트 ## 개요 NoteSummary 리소스에 대한 webhook 이벤트예요. 모든 note summary 이벤트는 `resourceType: "NoteSummary"`를 사용해요. ## 이벤트 상세 ### note\_summary.generated * 요약 생성이 성공적으로 완료될 때 * 요약 생성당 한 번 발생해요 * 요약 내용은 API를 통해 확인할 수 있어요 ### note\_summary.updated * 사용자가 요약 내용을 직접 편집할 때 * 요약 메타데이터가 변경될 때 ### note\_summary.deleted * 요약이 영구적으로 삭제될 때 ## Payload 예시 ## 리소스 데이터 자세한 스키마 정보는 [API Reference](/api-reference/note-summary/get-note-summary)의 NoteSummary 정의를 참고하세요. # Event Structure Source: https://docs.tiro.ooo/ko/developers/webhooks/events/schema Tiro 웹훅 이벤트의 공통 페이로드 구조, 지원 이벤트 타입, 리소스 매핑을 구현 예시와 함께 확인하세요. ## 개요 모든 웹훅 이벤트는 아래 공통 구조를 사용해요. ## 표준 Event Structure ## 필드 설명 ### 최상위 필드 이 webhook 이벤트의 고유 식별자예요. idempotency와 중복 제거에 사용하세요. 이벤트 타입 식별자예요 (예: `note.created`, `note.recording.completed`). 이벤트가 발생한 시각의 ISO-8601 timestamp예요. 이벤트 정렬에 사용하세요. 이벤트가 속한 워크스페이스의 GUID예요. 하나의 endpoint가 여러 워크스페이스의 이벤트를 받을 때 출처를 구분하는 데 사용하세요. 이벤트가 워크스페이스에 연결되지 않은 경우 `null`이에요. 리소스 정보를 담고 있는 이벤트별 데이터예요. ### Data 오브젝트 필드 이벤트를 발생시킨 리소스의 타입이에요. 예: `Note`, `NoteDocument`, `NoteSummary`, `FolderNoteRelation`. 리소스의 고유 식별자예요. 라우팅과 중복 제거에 사용하세요. 실제 리소스 데이터예요. 구조는 리소스 타입에 따라 달라지며 Tiro의 표준 스키마를 따라요. ## 이벤트 타입 지원하는 이벤트 타입 예시예요. ```json theme={"system"} "note.created" "note.deleted" "note.user_content.updated" "note.recording.completed" "note.ended" "note.participants.updated" "note_document.generated" "note_document.updated" "note_document.deleted" "note_summary.generated" "note_summary.updated" "note_summary.deleted" "folder.note.added" "folder.note.removed" "voice_file_job.created" "voice_file_job.completed" "voice_file_job.failed" "voice_file_job.deleted" ``` ## Voice File Job 이벤트에는 어떤 데이터가 포함되나요? `voice_file_job.*` 이벤트의 `data.resource`는 작업 메타데이터만 담아요. Tiro는 오디오와 전사 본문을 웹훅으로 전송하지 않아요. | 필드 | 타입 | 설명 | | -------------------- | -------------- | -------------------------------------------- | | `id` | string | Voice File Job ID예요. | | `workspaceGuid` | string | 작업이 속한 워크스페이스 GUID예요. | | `status` | string | 이벤트 발생 뒤의 상태예요. 삭제 이벤트에서는 `DELETED`예요. | | `processCompletedAt` | string \| null | 처리를 완료했거나 실패한 시각이에요. 아직 완료하지 않았으면 `null`이에요. | | `errorMessage` | string \| null | 실패 이유예요. 실패 이벤트가 아니면 `null`이에요. | ## 리소스 타입 매핑 | Event Type | Resource Type | Schema Reference | | ------------------ | -------------------- | -------------------------------------------------------------------------- | | `note.*` | `Note` | [Note API](/api-reference/note/get-note) | | `note_document.*` | `NoteDocument` | [NoteDocument Events](/ko/developers/webhooks/events/note-document-events) | | `note_summary.*` | `NoteSummary` | [NoteSummary Events](/ko/developers/webhooks/events/note-summary-events) | | `folder.*` | `FolderNoteRelation` | [FolderNote Events](/ko/developers/webhooks/events/folder-note-events) | | `voice_file_job.*` | `VoiceFileJob` | [음성 파일 API 개요](/ko/developers/voice-file/overview) | # Webhook 개요 Source: https://docs.tiro.ooo/ko/developers/webhooks/webhooks-overview 노트·요약·문서·음성 파일 작업 이벤트를 HTTP POST로 받는 Webhook 설정과 검증 방법. ## Webhook 엔드포인트가 뭔가요? Webhook 엔드포인트는 Tiro가 이벤트 발생 시 HTTP POST 요청을 보내는 URL이에요. [Tiro Platform](https://platform.tiro.ooo)에 등록하면 API를 폴링하지 않고 이벤트를 받을 수 있어요. ## Webhook 동작 방식 1. **설정**: 애플리케이션에 webhook endpoint를 마련해요 2. **등록**: 받고 싶은 이벤트를 위해 endpoint를 추가해요 3. **수신**: 이벤트가 발생하면 즉시 알림을 받아요 4. **처리**: 애플리케이션에서 이벤트 데이터를 처리해요 ## 이벤트 & 리소스 구조 Webhook은 **이벤트(Event)** 와 **리소스(Resource)** 를 중심으로 구성돼요. ### 이벤트(Events) 이벤트는 워크스페이스에서 발생하는 동작을 나타내요. 자세한 내용은 [Note Events](/ko/developers/webhooks/events/note-events), [Note Document Events](/ko/developers/webhooks/events/note-document-events), [Note Summary Events](/ko/developers/webhooks/events/note-summary-events), [FolderNote Events](/ko/developers/webhooks/events/folder-note-events), [음성 파일 API 개요](/ko/developers/voice-file/overview)를 참고하세요. Webhook 이벤트는 메타데이터만 포함하며 보통 수백 KB 이하예요. transcript나 스크립트 같은 큰 콘텐츠는 별도 API에서 조회하세요. ### 리소스(Resources) 리소스는 이벤트가 작용할 수 있는 주요 엔터티예요. * `Note`: 개별 노트 리소스 * `NoteDocument`: 노트에서 생성된 템플릿 기반 문서 * `NoteSummary`: 노트에 대한 AI 생성 요약 * `FolderNoteRelation`: 폴더와 노트 사이의 관계 * `VoiceFileJob`: 업로드한 음성 파일의 처리 작업 ## Webhook Payload 구조 모든 webhook 이벤트는 표준 [Event Structure](/ko/developers/webhooks/events/schema) 구조를 따라요. ## 보안 모든 webhook 요청에는 두 가지 검증 수단이 함께 실려요. | 헤더 | 내용 | | ------------------ | ------------------------------------------------------- | | `Authorization` | `Bearer {secret_key}` — endpoint 설정 시 발급된 secret | | `X-Tiro-Signature` | `sha256={HMAC-SHA256 서명}` — 요청 본문을 secret으로 서명한 값 (hex) | 가장 간단한 검증은 `Authorization` 헤더의 secret을 설정해 둔 값과 비교하는 것이에요. 더 강한 검증이 필요하면 `X-Tiro-Signature` 헤더의 HMAC-SHA256 서명을 확인하세요 — secret 자체를 비교하지 않고도 요청 진위와 본문 변조 여부를 함께 확인할 수 있어요. ### 검증 예시 ```javascript Node.js theme={"system"} function verifyWebhookAuth(authHeader, expectedSecret) { const token = authHeader.replace('Bearer ', ''); return token === expectedSecret; } // Usage in your webhook endpoint app.post('/en/developers/webhooks/tiro', (req, res) => { const authHeader = req.headers.authorization; if (!verifyWebhookAuth(authHeader, process.env.WEBHOOK_SECRET)) { return res.status(401).send('Unauthorized'); } // Process webhook event const event = req.body; handleWebhookEvent(event); res.status(200).send('OK'); }); ``` ```python Python theme={"system"} import os from flask import Flask, request def verify_webhook_auth(auth_header, expected_secret): if not auth_header or not auth_header.startswith('Bearer '): return False token = auth_header.replace('Bearer ', '') return token == expected_secret # Usage in your webhook endpoint @app.route('/en/developers/webhooks/tiro', methods=['POST']) def handle_webhook(): auth_header = request.headers.get('Authorization') if not verify_webhook_auth(auth_header, os.getenv('WEBHOOK_SECRET')): return 'Unauthorized', 401 # Process webhook event event = request.get_json() handle_webhook_event(event) return 'OK', 200 ``` ```go Go theme={"system"} import ( "encoding/json" "net/http" "os" "strings" ) func verifyWebhookAuth(authHeader, expectedSecret string) bool { if !strings.HasPrefix(authHeader, "Bearer ") { return false } token := strings.TrimPrefix(authHeader, "Bearer ") return token == expectedSecret } // Usage in your webhook endpoint func handleWebhook(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if !verifyWebhookAuth(authHeader, os.Getenv("WEBHOOK_SECRET")) { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } // Process webhook event var event WebhookEvent json.NewDecoder(r.Body).Decode(&event) handleWebhookEvent(event) w.WriteHeader(http.StatusOK) } ``` ```kotlin Kotlin + Spring theme={"system"} @RestController class WebhookController { @Value("\${webhook.secret}") private lateinit var webhookSecret: String private fun verifyWebhookAuth(authHeader: String?, expectedSecret: String): Boolean { if (authHeader?.startsWith("Bearer ") != true) { return false } val token = authHeader.removePrefix("Bearer ") return token == expectedSecret } // Usage in your webhook endpoint @PostMapping("/en/developers/webhooks/tiro") fun handleWebhook( @RequestHeader("Authorization") authHeader: String?, @RequestBody event: WebhookEvent ): ResponseEntity { if (!verifyWebhookAuth(authHeader, webhookSecret)) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Unauthorized") } // Process webhook event handleWebhookEvent(event) return ResponseEntity.ok("OK") } } ``` ## 전달 & 재시도 * **Method**: HTTP POST * **Content-Type**: `application/json` * **Timeout**: 60초 * **Retries**: exponential backoff로 최대 5회 재시도 (총 6회 시도) * **Success**: 모든 2xx HTTP 상태 코드 ### 재시도 스케줄 1. 15초 2. 30초 3. 5분 4. 30분 5. 2시간 ## 시작하기 1. **endpoint 마련**: POST 요청을 받을 수 있는 HTTP endpoint를 만들어요 2. **webhook 설정**: [Tiro Platform](https://platform.tiro.ooo)에서 webhook endpoint를 등록해요 3. **이벤트 처리**: 애플리케이션에서 들어오는 webhook payload를 처리해요 **계정 Webhook**은 사용자 계정에 연결된 하나의 endpoint로, 사용자가 현재 접근할 수 있는 모든 워크스페이스의 이벤트를 모아 받아요. 노트·요약·문서·폴더 이벤트는 사용자가 접근할 수 있는 리소스에 대해 전달돼요. payload 최상위의 `workspaceGuid`로 이벤트가 발생한 워크스페이스를 구분하세요. **워크스페이스 Webhook**은 워크스페이스 단위로 등록·관리하며, 연결된 워크스페이스 하나의 이벤트를 받아요. 노트 이벤트(`note.*`, `note_summary.*`, `note_document.*`)와 폴더 이벤트(`folder.note.*`)는 워크스페이스 전체 구성원에게 공유된 폴더의 노트만 발송해요. 개인 폴더의 노트, 일부 구성원에게만 공유한 폴더의 노트, 어느 폴더에도 넣지 않은 노트는 이벤트가 발송되지 않아요. 음성 파일 작업 이벤트는 이 범위가 적용되지 않아요. 이 범위가 적용되기 전에 등록한 시스템 endpoint는 당분간 예전처럼 동작하고, 차례로 전환될 예정이에요. 자세한 범위는 [시스템 API Key가 조회하는 노트 범위](/ko/developers/fundamentals/system-key-note-scope)를 참고하세요. 조직(Organization) 계약을 사용 중이라면 **조직 단위 webhook**도 등록할 수 있어요. 조직 endpoint는 조직 소속 워크스페이스 전체의 이벤트를 워크스페이스 구분 없이 받고, payload에 `organizationGuid`가 포함돼요. 자세한 내용은 [조직 단위로 연동하기](/ko/developers/organization/org-integration)를 참고하세요. 엔드포인트를 등록한 뒤 [Event Structure](/ko/developers/webhooks/events/schema)와 [Best Practices](/ko/developers/webhooks/best-practices)를 확인하세요. # Product Updates Source: https://docs.tiro.ooo/ko/updates 티로의 최신 업데이트와 개선사항을 확인해 보세요! **Web** * \[NEW] 한 기기에서 시작한 회원가입을 다른 기기에서도 이어갈 수 있어요 * \[FIXED] 만료된 계정으로 로그인한 상태에서도 랜딩 페이지의 시작 버튼이 정상 동작해요 * \[FIXED] 노트를 공유할 때 워크스페이스 멤버를 이름으로 다시 검색할 수 있어요 * \[FIXED] 개인 폴더를 저장할 때 불필요한 멤버 변경 요청이 발생하지 않아요 * \[FIXED] 인증에 실패한 뒤 재연결이 반복되지 않아요 **Desktop App** * \[FIXED] 노트를 공유할 때 워크스페이스 멤버를 이름으로 다시 검색할 수 있어요 * \[FIXED] 개인 폴더를 저장할 때 불필요한 멤버 변경 요청이 발생하지 않아요 * \[FIXED] 인증에 실패한 뒤 재연결이 반복되지 않아요 **Service Improvements** * \[FIXED] 결제 재시도 중 구독을 취소하면 구독 상태가 즉시 만료로 반영돼요 * \[FIXED] 참여 링크가 올바른 언어 경로로 열려요 *** **Service Improvements** * \[FIXED] 워크스페이스 폴더의 멤버를 오류 없이 변경할 수 있어요 *** **Web** * \[NEW] 텍스트·음성 노트를 Tiro로 가져올 수 있어요 * \[IMPROVED] 레퍼럴 페이지에서 받을 수 있는 혜택을 더 쉽게 확인할 수 있어요 * \[IMPROVED] Android 앱 결제에서 웹 결제로 전환할 때 환불·해지 안내를 더 명확하게 확인할 수 있어요 * \[FIXED] 노트를 가져올 때 읽기 전용 워크스페이스를 선택할 수 없도록 했어요 * \[FIXED] 가져온 전사본에는 불필요한 번역 탭이나 번역 결과가 생기지 않아요 * \[FIXED] 사용량 상한과 무관한 오류가 상한 안내로 표시되지 않아요 **Desktop App 4.7.5** * \[IMPROVED] 공유할 때 언어별 최신 결과를 바로 선택할 수 있어요 * \[IMPROVED] 가져온 전사본 노트를 문서 아이콘으로 쉽게 구분할 수 있어요 * \[FIXED] 텍스트 노트의 시간 정보가 유지되고, 가져온 노트의 원본 날짜도 확인할 수 있어요 **Service Improvements** * \[FIXED] 단어장을 불러오지 못해도 녹음이 끊기거나 문단이 사라지지 않아요 * \[IMPROVED] 원문과 번역 언어가 거의 같으면 불필요한 번역을 건너뛰어요 *** **Mobile App iOS 2.3.10 / Android 2.3.11** * \[IMPROVED] 연간 구독 혜택 배지가 결제 주기에 맞게 표시돼요 * \[FIXED] 스토어 구독이 남아 있는 경우 계정 삭제 전에 안내를 확인할 수 있어요 *** **Desktop App 4.7.2** * \[FIXED] 구버전 데스크톱 앱에서도 로그인이 정상적으로 이어져요 * \[FIXED] 데스크톱 앱에서 Salesforce 연동이 정상적으로 작동해요 **Service Improvements** * \[FIXED] 연체된 결제를 완료한 뒤 만료된 구독이 정상적으로 복구돼요 *** **Web** * \[IMPROVED] 구독 전환 화면의 중복 안내와 불필요한 정산 정보가 정리됐어요 * \[FIXED] 이전 전환의 미정산 내역이 새 구독 전환의 경고로 잘못 표시되지 않아요 **Desktop App** * \[NEW] 노트를 Google Drive로 내보내고 저장할 폴더를 직접 선택할 수 있어요 * \[IMPROVED] 내보내기 완료 안내와 다음 동작이 더 간결하고 명확해졌어요 **Mobile App Android 2.3.11 / iOS 2.3.10** * \[NEW] 모바일 앱에서 로그인 방법을 추가하거나 삭제할 수 있어요 * \[IMPROVED] 다시 듣기 음성의 보관 기간이 끝났을 때 필요한 안내를 확인할 수 있어요 * \[IMPROVED] 결제 완료 화면이 편지처럼 따뜻한 디자인으로 바뀌었어요 * \[IMPROVED] 시스템 글씨 크기를 최대 150%까지 앱에 반영해요 * \[FIXED] iOS에서 SSO 로그인 중 일시적인 네트워크 오류가 발생하면 한 번 더 시도해요 **Service Improvements** * \[IMPROVED] 개인정보를 가린 답변에서도 문맥이 더 자연스럽게 이어져요 * \[FIXED] 좌석을 줄이면 다음 구독 갱신일부터 정확히 반영돼요 * \[FIXED] 결제 통화를 바꿔 다시 결제할 때 기존 결제 세션과 충돌하지 않아요 * \[FIXED] 일부 음원 주소에 문제가 있어도 음성을 안정적으로 불러와요 * \[FIXED] 위키의 개인 설명을 만드는 동안 직접 수정한 내용이 덮어써지지 않아요 *** **Web** * \[NEW] 결제를 마치면 친구를 초대할 수 있는 안내가 표시돼요 * \[FIXED] 내보낸 파일이 어디에 저장됐는지 바로 확인할 수 있어요 * \[FIXED] 앱 스토어 구독이 남아 있으면 계정 삭제 전에 안내를 확인할 수 있어요 **Desktop App** * \[NEW] 결제를 마치면 친구를 초대할 수 있는 안내가 표시돼요 * \[FIXED] 앱 스토어 구독이 남아 있으면 계정 삭제 전에 안내를 확인할 수 있어요 **Mobile App 2.3.9** * \[FIXED] iOS에서 앱을 완전히 종료한 뒤 SSO로 로그인할 때도 정상적으로 앱으로 돌아와요 **Service Improvements** * \[IMPROVED] 업로드한 음성 파일에도 더 넓은 범위의 단어장이 적용돼요 * \[IMPROVED] 업로드한 음성 파일의 변환과 요약이 더 안정적으로 완료돼요 * \[FIXED] 유료 워크스페이스의 화자 분리 권한이 정확하게 적용돼요 * \[FIXED] 일부 노트 문단이 검색되지 않던 문제를 해결했어요 *** **Desktop App** * \[FIXED] 폴더에서 시작한 오프라인 녹음이 해당 폴더에 저장돼요 *** **Web** * \[IMPROVED] 이용 시간을 모두 썼을 때 이용 상태에 맞는 안내를 확인할 수 있어요 * \[IMPROVED] ‘추가 기록’ 설정을 플랜 관리에서 바로 변경할 수 있어요 * \[FIXED] 워크스페이스에서 공유된 문서 템플릿이 템플릿 선택 목록에 보여요 * \[FIXED] 노트 공유 링크의 미리보기 이미지가 일본어 환경에서도 제대로 보여요 **Desktop App 4.7.3** * \[IMPROVED] 이용 시간을 모두 썼을 때 이용 상태에 맞는 안내를 확인할 수 있어요 * \[IMPROVED] ‘추가 기록’ 설정을 플랜 관리에서 바로 변경할 수 있어요 * \[FIXED] 워크스페이스에서 공유된 문서 템플릿이 템플릿 선택 목록에 보여요 * \[FIXED] 마이크 구성 요소가 손상되지 않도록 해 녹음 안정성을 높였어요 **Service Improvements** * \[FIXED] 구독 취소나 좌석 축소 시 환불 금액이 더 정확히 계산돼요 *** **Web** * \[IMPROVED] 초대 리워드 유효기간이 7일로 적용되고 안내에도 정확히 표시돼요 * \[IMPROVED] 결제 수단 변경 창에서 정산 기준을 바로 확인할 수 있어요 * \[FIXED] 인용 클립의 재생·이동·하이라이트와 팝업 동작이 제대로 작동해요 * \[FIXED] 조직 구독이 없어도 개요 페이지가 정상적으로 보여요 **Desktop App** * \[FIXED] 구버전 데스크탑 앱에서도 로그인이 정상적으로 이어져요 **Service Improvements** * \[NEW] 처리가 끝난 뒤 로컬 음성 파일을 삭제할지 선택할 수 있어요 * \[IMPROVED] 실시간 번역이 이전 번역이 없는 첫 구간에서도 더 안정적으로 작동해요 *** **Web** * \[IMPROVED] 보안 인증 배지가 더 선명하고 일관되게 보여요 **Desktop App 4.7.2** * \[IMPROVED] 보안 인증 배지가 더 선명하고 일관되게 보여요 * \[FIXED] 데스크탑 앱에서 녹음이 시작되지 않던 문제를 고쳤어요 **Service Improvements** * \[IMPROVED] 노트 음성 재생의 접근 보호가 강화됐어요 * \[FIXED] 파일 전사가 누락되거나 대기 상태에 머무르던 문제를 고쳤어요 * \[FIXED] 중복 청구 회수 과정에서 기존 크레딧이 차감되거나 안내가 일찍 사라지던 문제를 고쳤어요 *** **Web** * \[NEW] 중요한 소식을 Tiro 안의 공지 배너에서 확인할 수 있어요 * \[NEW] 버그 제보 양식을 한국어·영어·일본어로 이용할 수 있어요 * \[NEW] 노트 요약에서 참고한 내용을 확인할 수 있어요 * \[IMPROVED] 로그인 화면과 Trust Center의 SOC 2 인증 정보가 더 명확해졌어요 * \[IMPROVED] 이메일 로그인과 가입 과정의 계정 보호가 강화됐어요 * \[FIXED] 캘린더 연결 인증이 더 안정적으로 작동해요 * \[FIXED] 구버전 데스크탑 앱에서도 다시 로그인할 수 있어요 * \[FIXED] 폴더 공유 범위 안내가 실제 동작에 맞게 더 정확해졌어요 **Desktop App** * \[NEW] 중요한 소식을 Tiro 안의 공지 배너에서 확인할 수 있어요 * \[IMPROVED] 로그인 화면과 Trust Center의 SOC 2 인증 정보가 더 명확해졌어요 * \[FIXED] 캘린더 연결 인증이 더 안정적으로 작동해요 **Mobile App 2.3.10 Android / 2.3.9 iOS** * \[FIXED] Android 바텀시트의 제목과 손잡이가 겹치지 않아요 * \[FIXED] Android 친구 초대 안내가 의도치 않게 전체 화면으로 확장되지 않아요 **Service Improvements** * \[IMPROVED] 공유된 노트와 실시간 연결의 접근 보호가 강화됐어요 * \[FIXED] 앱 언어를 바꾸면 푸시 알림 언어도 올바르게 동기화돼요 * \[FIXED] 워크스페이스 초대 이메일이 올바른 계정을 기준으로 처리돼요 *** **Web** * \[NEW] 계정에 연결된 로그인 방법을 관리할 수 있어요 * \[NEW] 워크스페이스 프로필 이미지를 업로드할 수 있어요 * \[NEW] 조직의 권한 변경 이력을 확인할 수 있어요 * \[NEW] 노트를 QR 코드로 공유하고 이미지 저장과 링크 복사를 할 수 있어요 * \[IMPROVED] 앱 결제에서 웹 결제로 전환하거나 해지·해지 확인을 할 때 안내가 더 명확해졌어요 * \[IMPROVED] 친구 초대 안내가 더 유용한 시점에 표시돼요 * \[FIXED] 마이크를 다시 연결한 뒤 무음 녹음 경고가 정상적으로 복구돼요 * \[FIXED] 결제 전환이 끝난 뒤에도 중복 결제 환불 안내가 계속 표시돼요 **Desktop App** * \[NEW] 계정에 연결된 로그인 방법을 관리할 수 있어요 * \[NEW] 워크스페이스 프로필 이미지를 업로드할 수 있어요 * \[NEW] 노트를 QR 코드로 공유하고 이미지 저장과 링크 복사를 할 수 있어요 * \[FIXED] VPN이나 네트워크 정책으로 일반 경로가 차단돼도 노트 공유가 더 안정적으로 대체 경로를 사용해요 **Mobile App 2.3.10 Android / 2.3.9 iOS** * \[NEW] 친구 초대 팝업에서 초대 성과와 리워드를 확인할 수 있어요 * \[NEW] 노트를 QR 코드로 공유하고 이미지로 저장할 수 있어요 * \[NEW] 저장한 워크스페이스 아이콘이 앱에 표시돼요 * \[IMPROVED] 녹음이 차단된 이유와 이용 시간 소진 상태에 맞는 안내가 표시돼요 * \[FIXED] 템플릿이 없는 빈 문서도 더 안정적으로 열려요 **Service Improvements** * \[FIXED] 팀 플랜 결제 시 활성 Member 수를 기준으로 좌석 수를 계산해요 * \[FIXED] 결제 전환 리워드가 기존 크레딧에 영향을 주지 않고 Android에서도 더 안정적으로 재시도돼요 *** **Web** * \[IMPROVED] 조직의 보안 정책으로 제한된 설정의 잠금 상태와 안내를 더 명확하게 확인할 수 있어요 * \[FIXED] 공유 스트림 연결이 더 안정적으로 유지돼요 **Service Improvements** * \[IMPROVED] 팩스·050X·0303 전화번호도 개인정보 마스킹에 포함돼요 *** **Web** * \[NEW] Safari에서 Tiro 앱 다운로드 안내를 바로 확인할 수 있어요 * \[NEW] 초대받은 사용자가 선물 혜택 화면에 다시 들어가 선물가로 플랜을 이용할 수 있어요 * \[IMPROVED] 공유 링크의 앱 설치 안내가 더 이해하기 쉬워졌어요 * \[FIXED] 모바일에서 로그인 창이 깨져 보이던 문제를 수정했어요 * \[FIXED] 온보딩 중 자동 녹음을 시작할 때 무료 체험 안내와 기록 시작 힌트가 겹치지 않아요 * \[FIXED] 다양한 형태의 공유 링크를 더 안정적으로 열 수 있어요 * \[FIXED] 캘린더 연결 오류를 설정 화면에서 바로 확인할 수 있어요 **Desktop App 4.7.1** * \[IMPROVED] 마이크와 화면 녹화 권한을 설정하는 온보딩 화면과 안내가 더 이해하기 쉬워졌어요 **Service Improvements** * \[NEW] Outlook 캘린더 변경 사항을 Tiro에 실시간으로 동기화할 수 있어요 * \[IMPROVED] 음성 인식 연결이 지연될 때 서비스가 더 안정적으로 대응해요 * \[FIXED] 음성 인식 결과에 불필요한 긴 대시(—)가 나타날 수 있던 문제를 수정했어요 *** **Web** * \[NEW] 캘린더 노트에서 거절한 사람을 제외한 초대 참석자 전원을 확인할 수 있어요 * \[NEW] 컨퍼런스 라이브 공유 화면에서 Tiro 가입과 앱 설치로 바로 이어갈 수 있어요 * \[NEW] 공유 노트에서 전사 언어를 선택하고 원본 내용을 끝까지 스크롤할 수 있어요 * \[NEW] 온보딩에서 바로 노트를 만들면 실시간 기록이 자동으로 시작돼요 * \[IMPROVED] 공유 노트 화면이 내용을 더 편하게 읽고 Tiro를 시작할 수 있도록 새로워졌어요 * \[IMPROVED] 맥락 입력창이 넓어져 긴 내용도 더 편하게 작성할 수 있어요 * \[IMPROVED] 녹음을 시작할 수 없을 때 원인에 맞는 안내를 확인할 수 있어요 **Service Improvements** * \[FIXED] 이름이 같은 참석자가 있어도 참석자 정보를 정상적으로 편집할 수 있어요 * \[FIXED] 화자 분리 결과의 일부가 업로드 과정에서 누락되던 문제를 수정했어요 * \[FIXED] 한국어 번역 내용을 불러오지 못하던 문제를 수정했어요 * \[FIXED] 결제 후 구독 정보가 연결되지 않은 경우에도 자동으로 복구돼요 *** **Web** * \[NEW] 친구 추천 리워드가 적립되면 실시간 알림으로 바로 확인할 수 있어요 * \[IMPROVED] 노트 공유 링크가 열리지 않을 때 원인에 맞는 안내를 확인할 수 있어요 * \[IMPROVED] 휴지통 안내 문구가 더 알아보기 쉬워졌어요 * \[FIXED] 마이크 시작에 실패하면 안내가 표시되고 기록 상태가 올바르게 복구돼요 **Service Improvements** * \[FIXED] 실시간 기록·자막 연결이 간헐적으로 끊기던 문제가 해결되어 더 안정적으로 이어져요 * \[FIXED] 캘린더 연동이 끊겨 일정이 동기화되지 않던 문제를 수정했어요 * \[FIXED] 추천 코드 입력 시 간헐적으로 오류가 나던 문제를 수정했어요 *** **Mobile App 2.3.8 (iOS) / 2.3.9 (Android)** * \[FIXED] 자동화 설정이 없는 폴더의 노트에서 문서 탭을 열 때 앱이 종료되지 않아요 **Service Improvements** * \[IMPROVED] 휴지통에서 노트가 삭제된 시점과 영구 삭제 예정일을 더 정확히 확인할 수 있어요 *** **Desktop App** * \[IMPROVED] 온보딩 권한 요청 화면이 더 밝고 편안한 디자인으로 바뀌었어요 * \[IMPROVED] macOS 14.2 이상에서 시스템 오디오 녹음 권한을 앱 재시작 없이 설정할 수 있어요 *** **Mobile App 2.3.7 (iOS) / 2.3.8 (Android)** * \[IMPROVED] 티로 선물하기 화면에서 초대 리워드를 더 쉽게 확인하고 이용할 수 있어요 * \[IMPROVED] 실시간 번역이 중복 없이 더 잘 보이고 스크롤도 안정적으로 유지돼요 * \[IMPROVED] 노트의 문서·원본 탭과 화자별 기록을 더 일관되고 읽기 편하게 확인할 수 있어요 * \[IMPROVED] 노트 요약과 문서를 서식 그대로 복사하고 이메일로 내보낼 수 있어요 * \[IMPROVED] 사용량 한도로 녹음이 제한된 이유를 상황에 맞는 안내로 확인할 수 있어요 * \[FIXED] 폴더 권한이 설정된 정책대로 적용돼요 * \[FIXED] 워크스페이스 정책에서 허용하지 않은 음성 다시 듣기가 켜지지 않아요 * \[FIXED] 일본어 화자 분리 결과의 불필요한 공백이 사라졌어요 * \[FIXED] Viewer가 새 탭을 열어도 노트 언어가 바뀌지 않아요 *** **Service Improvements** * \[NEW] 친구를 초대해 리워드를 받고 결제할 때 자동으로 할인받을 수 있어요 * \[IMPROVED] 초대 링크에서 가입을 완료한 친구 수를 확인할 수 있어요 * \[IMPROVED] 화자 분리 진행 상태를 더 정확하게 확인할 수 있어요 * \[FIXED] 편집 권한이 있는 사용자도 화자 지정에서 새 참석자를 추가할 수 있어요 * \[FIXED] 실시간 음성 인식 연결이 더 안정적으로 유지돼요 * \[FIXED] 워크스페이스 공유 폴더의 노트에서 실시간 기록과 번역을 정상적으로 받아볼 수 있어요 *** **Web** * \[IMPROVED] 새 워크스페이스를 만들면 플랜 화면이 바로 열려요 * \[FIXED] 녹음 중 문서 언어 선택기가 중복으로 보이지 않고 새 문서에도 선택한 언어가 유지돼요 **Desktop App** * \[IMPROVED] 새 워크스페이스를 만들면 플랜 화면이 바로 열려요 * \[FIXED] 녹음이 끝난 뒤에도 문서 탭과 선택한 문서 언어가 그대로 유지돼요 **Service Improvements** * \[FIXED] 요약과 문서를 만들 때 선택한 언어가 정확하게 반영돼요 *** **Web** * \[FIXED] 사용량 그래프의 Y축 숫자가 잘리지 않고 모두 보여요 **Desktop App** * \[FIXED] 사용량 그래프의 Y축 숫자가 잘리지 않고 모두 보여요 * \[FIXED] 마이크 권한 온보딩이 막히지 않고 정상적으로 진행돼요 *** **Web** * \[NEW] 캘린더 연동이 차단된 경우 설정에서 상태를 바로 확인할 수 있어요 * \[IMPROVED] Slack 연동 설정 화면이 더 일관되고 보기 편해졌어요 * \[FIXED] 컨퍼런스 모드의 QR 공유 화면이 비로그인 상태에서도 실시간으로 계속 업데이트돼요 **Desktop App** * \[NEW] 캘린더 연동이 차단된 경우 설정에서 상태를 바로 확인할 수 있어요 * \[IMPROVED] Slack 연동 설정 화면이 더 일관되고 보기 편해졌어요 * \[FIXED] 플랜 관리에서 지원하지 않는 결제 통화 정보를 받아도 앱이 종료되지 않아요 **Service Improvements** * \[IMPROVED] 녹음 중인 노트도 상태를 유지한 채 옮길 수 있어요 * \[FIXED] 제한 공유 폴더의 구성원 권한이 저장한 설정대로 유지돼요 *** **Web** * \[IMPROVED] 실시간 번역 토글이 언어 설정과 관계없이 일관되게 보여요 * \[FIXED] Ask Tiro 패널이 더 빠르게 닫히고 상단 바가 올바르게 정렬돼요 * \[FIXED] 위키 그래프에서 노드를 놓으면 움직임이 바로 멈춰요 **Mobile App 2.3.6 (iOS) / 2.3.7 (Android)** * \[IMPROVED] 활성화 화면에서 다른 워크스페이스로 전환할 수 있어요 * \[FIXED] 녹음을 재개할 때 시작 부분이 누락되지 않아요 * \[FIXED] 로그아웃 후 이전 계정의 데이터가 남지 않아요 * \[FIXED] iOS에서 지원하지 않는 오디오 입력으로 인한 앱 종료를 방지해요 **Service Improvements** * \[IMPROVED] 기록 언어와 번역 언어가 다르면 완성된 문단 번역이 안정적으로 제공돼요 * \[FIXED] 빈 폴더로 노트를 한꺼번에 옮길 때 오류가 발생하지 않아요 * \[FIXED] 컨퍼런스 모드의 QR 공유 화면이 비어 보이지 않아요 *** **Web** * \[IMPROVED] 위키 그래프가 큰 규모에서도 더 읽기 쉽고 노드를 부드럽게 옮길 수 있어요 * \[IMPROVED] 파일 업로드 화면이 더 일관되고 보기 편해졌어요 * \[IMPROVED] 팝오버와 드롭다운 등 선택 메뉴의 테두리와 그림자가 일관되게 표시돼요 * \[IMPROVED] 모바일에서 음성 파일을 올릴 때 필요한 화면만 간결하게 보여요 * \[IMPROVED] 앱 다운로드 페이지에서 항상 최신 버전을 받을 수 있어요 **Desktop App 4.6.9** * \[IMPROVED] 위키 그래프가 큰 규모에서도 더 읽기 쉽고 노드를 부드럽게 옮길 수 있어요 * \[IMPROVED] 파일 업로드 화면과 선택 메뉴가 더 일관되고 보기 편해졌어요 * \[IMPROVED] 삭제 확인 창의 버튼과 노트 목록의 체크박스가 더 일관되게 보여요 * \[FIXED] 워크스페이스 이름을 바꾸면 변경 내용이 바로 반영돼요 *** **Web** * \[FIXED] 일본어 화면에서 보안 설정과 위키가 올바른 언어로 표시돼요 * \[FIXED] 폴더 공유 설정에서 소유자와 구성원 목록을 빠짐없이 확인할 수 있어요 * \[FIXED] 폴더 공유 설정에서 개인 폴더가 비공개로만 유지돼요 * \[FIXED] 조직 기반 워크스페이스에서도 워크스페이스 기능을 정상적으로 사용할 수 있어요 * \[FIXED] 녹음을 일시정지한 뒤 마이크가 예기치 않게 다시 켜지지 않아요 * \[FIXED] 오디오를 시작하지 못해도 녹음 상태가 정상적으로 초기화돼요 **Desktop App 4.6.9** * \[FIXED] 일본어 화면에서 보안 설정과 위키가 올바른 언어로 표시돼요 * \[FIXED] 폴더 공유 설정에서 소유자와 구성원 목록을 빠짐없이 확인할 수 있어요 * \[FIXED] 폴더 공유 설정에서 개인 폴더가 비공개로만 유지돼요 * \[FIXED] 조직 기반 워크스페이스에서도 워크스페이스 기능을 정상적으로 사용할 수 있어요 * \[FIXED] 오디오를 시작하지 못해도 녹음 상태가 정상적으로 초기화돼요 *** **Web** * \[IMPROVED] 워크스페이스 구성원과 관리 화면을 더 편하게 확인할 수 있어요 * \[IMPROVED] tiro.ooo 푸터에서 사업자 정보를 확인할 수 있어요 * \[FIXED] 실시간 녹음 중 이전 노트의 오디오 조각이 섞이지 않아요 * \[FIXED] 녹음 무음 경고가 일시정지나 대화 공백 상황에서 덜 잘못 떠요 **Desktop App** * \[FIXED] 실시간 녹음 중 이전 노트의 오디오 조각이 섞이지 않아요 * \[FIXED] 녹음 무음 경고가 일시정지나 대화 공백 상황에서 덜 잘못 떠요 **Service Improvements** * \[FIXED] 노트를 열 때 최신 내용이 더 안정적으로 표시돼요 *** **Web** * \[IMPROVED] 여러 노트를 한 번에 폴더에 넣거나 워크스페이스로 옮기기가 더 편해졌어요 * \[IMPROVED] 노트 문서 탭이 더 보기 좋게 개선됐어요 * \[IMPROVED] 플랜 관리 화면이 구독 상태와 인원에 맞게 정리됐어요 * \[IMPROVED] 화자 지정 창이 더 보기 편해졌어요 * \[IMPROVED] 컨퍼런스 자막이 더 읽기 좋게 정렬되고 기록 버튼이 항상 보여요 * \[FIXED] 컨퍼런스 모드에서 QR 코드를 스캔할 때 화면이 비어 보이던 문제가 해결됐어요 * \[FIXED] 폴더를 개인·팀 최상위로 옮길 때 이동이 무시되던 문제가 해결됐어요 * \[FIXED] 긴 노트 제목이 흔들리지 않고 안정적으로 표시돼요 * \[FIXED] 취소 버튼 모양이 화면마다 통일됐어요 **Service Improvements** * \[IMPROVED] 개인 플랜은 혼자 쓰는 워크스페이스에서만 결제되도록 정리됐어요 * \[FIXED] 문단 요약에서 화자 이름을 잘못 지어내던 문제가 개선됐어요 *** **Web** * \[IMPROVED] 조직 사용량 카드가 항상 표시돼요 * \[FIXED] 실시간 번역 자막이 깜빡이던 현상이 크게 줄었어요 * \[FIXED] 일시정지 버튼을 눌러도 반응하지 않던 문제가 해결됐어요 **Desktop App 4.6.8** * \[NEW] 화상 회의가 끝나면 자동으로 감지해요 * \[FIXED] 실시간 번역 자막 깜빡임이 크게 줄었어요 * \[FIXED] 녹음 오버레이가 잠금 해제 후 전체 화면으로 커지던 문제가 해결됐어요 * \[FIXED] 업데이트 대기 중 앱이 실행되지 않던 문제가 해결됐어요 * \[FIXED] 일시정지 버튼을 눌러도 반응하지 않던 문제가 해결됐어요 *** **Mobile App 2.3.5** * \[FIXED] 전체 음성 파일 화면에서 모든 오디오 파일을 복구할 수 있어요 * \[FIXED] 전체 음성 파일 화면에서 노트로 업로드할 때 올바른 유형으로 저장돼요 **Service Improvements** * \[FIXED] 실시간 번역이 더 안정적으로 동작해요 *** **Web** * \[FIXED] 위키 검색 후 결과 클릭 시 상세 화면이 정상적으로 열�려요 * \[FIXED] 위키 그래프에서 겹친 노드 클릭이 더 정확해졌어요 **Desktop App** * \[FIXED] Windows에서 마이크 녹음이 더 안정적으로 동작해요 *** **Web** * \[NEW] 위키 페이지의 공개 범위를 직접 설정할 수 있어요 * \[IMPROVED] AskTiro가 참고 정보를 더 풍부하게 보여줘요 * \[FIXED] 녹음 종료 후 연결이 끊기지 않고 안정적으로 유지돼요 **Desktop App 4.6.7** * \[NEW] 위키 페이지의 공개 범위를 직접 설정할 수 있어요 * \[IMPROVED] AskTiro가 참고 정보를 더 풍부하게 보여줘요 * \[FIXED] 녹음 종료 후 연결이 끊기지 않고 안정적으로 유지돼요 * \[FIXED] 단어장 중복 추가 시 안내 메시지가 표시돼요 **Mobile App 2.3.6** * \[NEW] 저장 공간이 부족할 때 오프라인 녹음 경고를 받아요 * \[FIXED] iOS에서 오디오 파일 충돌로 인한 크래시가 줄어들어요 * \[FIXED] 오프라인 녹음 저장 실패 시 알림을 받아요 **Service Improvements** * \[FIXED] 실시간 번역 설정이 정상적으로 유지돼요 *** **Web** * \[NEW] 추가 기록 사용자를 위한 사이드바 배너가 추가됐어요 * \[FIXED] 기록 종료 시 연결이 끊기지 않고 안정적으로 완료돼요 **Mobile App 2.3.5** * \[NEW] 자동 노트 요약 설정 옵션이 추가됐어요 * \[FIXED] 인증 시간 초과 시 강제 로그아웃 대신 다시 시도해요 * \[IMPROVED] 인증 실패 시 재로그인 버튼이 나타나요 * \[FIXED] 오프라인 녹음이 더 안정적으로 시작돼요 * \[FIXED] 공유받은 노트의 권한이 올바르게 적용돼요 *** **Web** * \[IMPROVED] 인증 코드가 오지 않을 때 안내 문구가 더 명확해졌어요 *** **Web** * \[NEW] 실시간 능동형 AI 보좌관을 사용할 수 있어요 * \[IMPROVED] AskTiro에서 참조 정보가 더 정확하게 표시돼요 * \[NEW] 위키 그래프에서 폴더 필터를 사용할 수 있어요 * \[IMPROVED] 위키 그래프의 노드 겹침이 줄어들었어요 * \[FIXED] 빈 위키 그래프 상태 안내가 추가됐어요 **Desktop App** * \[NEW] 실시간 능동형 AI 보좌관을 사용할 수 있어요 * \[IMPROVED] AskTiro에서 참조 정보가 더 정확하게 표시돼요 * \[NEW] 위키 그래프에서 폴더 필터를 사용할 수 있어요 * \[IMPROVED] 위키 그래프의 노드 겹침이 줄어들었어요 * \[FIXED] 빈 위키 그래프 상태 안내가 추가됐어요 **Service Improvements** * \[IMPROVED] 구독 변경 시 사용하지 않은 요금이 자동으로 환불돼요 * \[FIXED] 위키 목록과 검색 결과의 정보가 정확하게 표시돼요 * \[FIXED] 의사결정 추출이 누락되지 않도록 개선됐어요 *** **Service Improvements** * \[FIXED] 폴더를 삭제할 때 하위 항목이 더 정확하게 정리돼요 * \[FIXED] 위키 목록과 검색에서 추출 상태와 멘션 수가 정확하게 표시돼요 *** **Web** * \[NEW] 워크스페이스를 삭제할 수 있어요 * \[IMPROVED] 워크스페이스 간 노트 이동이 실패하면 이유와 해결 방법을 안내해요 * \[IMPROVED] 입력 장치(마이크) 선택 창이 더 깔끔해졌어요 * \[IMPROVED] 위키에서 원본 노트를 열면 전체 화면으로 바로 이동해요 * \[FIXED] 읽기 전용으로 공유받은 노트에서는 편집 화면이 감춰지고 내보내기만 할 수 있어요 * \[FIXED] 화자를 지정한 직후 복사해도 화자 이름이 정확히 들어가요 * \[FIXED] 템플릿을 복제하면 복제본으로 바로 이동해요 * \[FIXED] 실시간 전사 중 화면 출렁임이 줄고 공유 화면이 더 넓어졌어요 * \[FIXED] 컨퍼런스·공유 화면에서 실시간 번역이 더 안정적으로 표시돼요 * \[FIXED] 로그아웃 후 빈 화면에 갇히던 문제가 해결됐어요 * \[FIXED] AskTiro 참조 개수가 정확하게 표시돼요 **Desktop App 4.6.6** * \[NEW] 워크스페이스를 삭제할 수 있어요 * \[IMPROVED] 위키에서 원본 노트를 열면 전체 화면으로 바로 이동해요 * \[FIXED] 읽기 전용으로 공유받은 노트에서는 편집 화면이 감춰지고 내보내기만 할 수 있어요 * \[FIXED] 화자를 지정한 직후 복사해도 화자 이름이 정확히 들어가요 * \[FIXED] 데스크톱에서 예기치 않게 로그아웃되던 문제가 개선됐어요 * \[FIXED] 오디오 출력 장치를 바꿔도 시스템 소리 녹음이 유지돼요 * \[FIXED] macOS에서 창 관리 앱과의 호환성이 개선됐어요 * \[FIXED] 위키 노트를 전체 화면으로 열 때 오류 페이지가 뜨던 문제가 해결됐어요 **Mobile App 2.3.4** * \[IMPROVED] 로그인 화면에서 SSO와 이메일 로그인 진입점이 분리돼 더 명확해요 * \[IMPROVED] 결제 안내 화면 디자인이 개선됐어요 * \[FIXED] 일부 안드로이드 기기에서 로그인 토큰을 읽지 못해 로그인이 실패하던 문제가 개선됐어요 **Service Improvements** * \[IMPROVED] 무료 체험에서 노트 미리보기가 50분까지 가능해요 * \[IMPROVED] 팀·폴더 초대 안내가 더 간결해졌어요 * \[FIXED] 실시간 번역 켜짐 상태가 서버 설정과 일치해요 *** **Service Improvements** * \[IMPROVED] 위키 페이지가 불필요하게 많이 생성되지 않도록 개선됐어요 * \[FIXED] 위키 페이지 접근 권한이 더 정확하게 지켜져요 *** **Web** * \[NEW] 청각장애인을 위한 보이스패드 TTS 헬퍼 페이지가 추가됐어요 *** **Web** * \[FIXED] 실시간 녹음이 끝난 뒤 '업로드 중...'이 무한히 표시되던 문제가 해결됐어요 * \[IMPROVED] 플랜 카드에 사용량 초기화 주기와 시각이 표시돼요 * \[IMPROVED] 무료 체험 만료 및 사용량 경고가 모든 팀원에게 보여요 **Desktop App** * \[FIXED] 실시간 녹음 연결이 끊겼다가 다시 연결될 때 자동으로 이어서 녹음돼요 **Mobile App 2.3.2** * \[NEW] 마이페이지에서 앱 업데이트를 한 번에 확인할 수 있어요 * \[NEW] 워크스페이스 사용량이 언제 초기화되는지 확인할 수 있어요 * \[FIXED] 워크스페이스에 접근할 수 없을 때 자동 로그인이 안 되던 문제를 해결했어요 *** **Web** * \[NEW] 플랜 카드에 사용량 초기화 주기와 시각이 표시돼요 * \[IMPROVED] AskTiro를 사용할 때 화면이 더 깔끔해졌어요 * \[IMPROVED] AskTiro 질문 입력창 크기가 적절하게 조정됐어요 * \[IMPROVED] 플랜 활성화 시 환영 화면이 더 자연스러워졌어요 * \[IMPROVED] 무료체험 만료와 사용량 경고가 모든 팀원에게 표시돼요 * \[FIXED] 문서의 수식 렌더링이 올바르게 보존됩니다 * \[FIXED] 실시간 녹음 종료 후 '업로드 중...' 상태가 무한히 표시되는 문제가 해결됐어요 * \[FIXED] 녹음 경고 배너가 컨트롤 바를 가로지르는 문제가 수정됐어요 **Desktop App 4.6.5** * \[NEW] 플랜 카드에 사용량 초기화 주기와 시각이 표시돼요 * \[IMPROVED] AskTiro를 사용할 때 화면이 더 깔끔해졌어요 * \[IMPROVED] AskTiro 질문 입력창 크기가 적절하게 조정됐어요 * \[IMPROVED] 플랜 활성화 시 환영 화면이 더 자연스러워졌어요 * \[IMPROVED] 무료체험 만료와 사용량 경고가 모든 팀원에게 표시돼요 * \[FIXED] 음성 인식 연결이 끊어졌다가 복구될 때 녹음이 자동으로 이어져요 * \[FIXED] 앱 업데이트가 더 안정적으로 설치돼요 * \[FIXED] 실시간 녹음 종료 후 '업로드 중...' 상태가 무한히 표시되는 문제가 해결됐어요 * \[FIXED] 녹음 경고 배너가 컨트롤 바를 가로지르는 문제가 수정됐어요 *** **Web** * \[FIXED] 온보딩 팝업에서 뒤로가기를 닫을 수 있게 됐어요 * \[FIXED] 사이드바 배너가 더 깔끔하게 표시돼요 * \[IMPROVED] Ask Tiro 질문 입력창이 더 작고 깔끔해졌어요 **Desktop App 4.6.4** * \[NEW] 녹음 중 마이크가 무음이거나 권한이 없을 때 경고 배너가 나타나요 * \[IMPROVED] 노트 목록에 통화나 Watch 출처 아이콘이 표시되고 색상이 통일됐어요 * \[IMPROVED] 세션 만료 시 이유에 따라 더 명확한 안내가 표시돼요 * \[FIXED] 온보딩 팝업에서 뒤로가기를 닫을 수 있게 됐어요 * \[FIXED] 사이드바 배너가 더 깔끔하게 표시돼요 * \[FIXED] 플랜 사용량이 실제 초과분까지 정확히 보여요 * \[FIXED] Ask Tiro 응답이 잘리지 않고 전체 표시돼요 **Service Improvements** * \[FIXED] 계정을 탈퇴할 때 팀 노트가 실수로 삭제되는 문제가 해결됐어요 *** **Mobile App 2.3.1** * \[NEW] 다른 기기에서 원격으로 로그아웃할 수 있어요 * \[NEW] 실시간 번역을 켜고 끌 수 있는 토글 버튼이 추가됐어요 * \[NEW] 스크린샷 방지 기능이 추가됐어요 * \[FIXED] 오프라인 녹음 제목이 변경되지 않던 문제가 해결됐어요 * \[FIXED] 안드로이드에서 노트 상세 화면의 폴더 추가 바텀시트가 제대로 스크롤되지 않던 오류가 수정됐어요 * \[FIXED] 이용약관과 개인정보처리방침이 사용 언어에 맞게 표시돼요 **Service Improvements** * \[FIXED] 실시간 번역 토글을 끌 때 제대로 반영되지 않던 문제가 해결됐어요 * \[FIXED] 구독 이전이 더 안정적으로 처리돼요 *** **Web** * \[FIXED] Ask Tiro 응답이 잘리지 않고 온전히 표시돼요 * \[IMPROVED] 노트 목록에서 통화나 Watch로 녹음한 항목을 아이콘으로 쉽게 구분할 수 있어요 * \[FIXED] 비밀번호 재설정 안내 문구가 더 읽기 편하게 개선됐어요 **Desktop App 4.6.3** * \[FIXED] 녹음 종료 버튼을 눌러도 버튼이 사라지지 않던 문제가 해결됐어요 * \[FIXED] 실시간 번역을 꺼도 자동으로 켜지던 문제가 없어졌어요 * \[FIXED] 녹음 파일 다운로드 시 빈 파일이 생성되던 문제가 해결됐어요 * \[NEW] 노트 화면에서 키보드 단축키를 사용할 수 있어요 * \[NEW] 워크스페이스 사이드바에 배너를 표시할 수 있어요 * \[IMPROVED] 캘린더가 실시간으로 동기화돼요 * \[IMPROVED] 참석자 추가 화면이 더 깔끔하게 정리됐어요 * \[IMPROVED] 폴더 선택 팝오버가 더 사용하기 편해졌어요 *** **Web** * \[FIXED] 컨퍼런스 실시간 번역이 누락되는 문제가 해결됐어요 * \[FIXED] AskTiro 진행 상태가 실시간으로 제대로 표시돼요 * \[IMPROVED] 캘린더가 실시간으로 더 잘 동기화돼요 **Desktop App** * \[IMPROVED] 캘린더가 실시간으로 더 잘 동기화돼요 **Mobile App 2.3.0** * \[NEW] 실시간 번역을 켜고 끌 수 있는 토글 버튼이 추가됐어요 **Service Improvements** * \[IMPROVED] AskTiro가 더 안정적으로 응답하고 진행 상황을 잘 표시해요 *** **Web** * \[NEW] 위키 기능이 모든 사용자에게 공개됐어요 **Mobile App 2.3.0** * \[NEW] 다른 기기에서 원격으로 로그아웃할 수 있어요 * \[FIXED] 오프라인 녹음 제목이 변경되지 않던 문제가 해결됐어요 * \[FIXED] 로그인 시 무한 로딩이 발생하던 문제가 해결됐어요 **Service Improvements** * \[IMPROVED] 위키 페이지 목록이 더 정확하게 표시돼요 *** **Web** * \[IMPROVED] 위키 그래프의 색상과 겹침이 개선되어 더 보기 편해요 * \[IMPROVED] 위키 로딩 상태 위치와 문구가 일관되게 표시돼요 **Service Improvements** * \[FIXED] 화자 분리가 중단된 경우에도 더 안정적으로 복구돼요 *** **Web** * \[IMPROVED] 노트 미리보기에서 공유 버튼이 추가돼 더 쉽게 링크를 공유할 수 있어요 * \[FIXED] 조직 멤버 목록에서 텍스트를 선택하거나 복사할 때 시트가 의도치 않게 열리지 않아요 **Desktop App 4.6.1** * \[IMPROVED] 노트 미리보기에서 공유 버튼이 추가돼 더 쉽게 링크를 공유할 수 있어요 * \[FIXED] 다국어 모드에서 녹음을 일시정지할 때 문단 텍스트가 잘리지 않아요 * \[IMPROVED] 기기 관리 화면에서 로그아웃 동작이 더 명확해졌어요 *** **Mobile App 2.2.1** * \[NEW] 잠긴 문단이 있는 노트가 목록에서 “일부 잠김”으로 표시돼요 * \[NEW] 일시정지된 실시간 기록을 노트 목록에서 바로 이어서 진행할 수 있어요 * \[IMPROVED] 잠긴 문단의 스크립트와 요약을 한두 문장으로 미리 볼 수 있어요 * \[FIXED] 실시간 기록을 시작할 때 노트가 중복 생성되지 않도록 개선했어요 * \[FIXED] 길이를 알 수 없는 오디오 파일도 업로드할 수 있도록 허용해 업로드 실패 가능성을 줄였어요 * \[FIXED] 문단 오디오 다시 듣기 버튼이 재생 가능한 구간에서만 활성화되도록 수정했어요 *** **Web** * \[IMPROVED] Ask Tiro 빈 화면이 깔끔하게 재디자인되었어요 * \[IMPROVED] 노트 공유 UI가 더 보기 좋게 개선되었어요 **Desktop App 4.6.0** * \[IMPROVED] 업데이트 배지가 사이드바에서 더 잘 보이는 위치로 이동했어요 * \[FIXED] 라이브 녹음 연결이 프록시나 인증서 환경에서도 안정적으로 작동해요 * \[FIXED] 노트를 이메일로 내보내기가 정상적으로 작동해요 * \[IMPROVED] Ask Tiro 빈 화면이 중앙 정렬과 추천 질문으로 보기 편해졌어요 * \[IMPROVED] 워크스페이스 초대 알림이 더 깔끔해졌어요 * \[FIXED] 탭 선택 시 깜빡임이 사라졌어요 * \[IMPROVED] 컨퍼런스 모드 실시간 번역 경험이 더 부드러워졌어요 * \[FIXED] 노트 전체 화면에서 불필요한 구분선이 제거되었어요 * \[FIXED] 윈도우에서 캘린더 알림을 닫아도 앱이 종료되지 않아요 * \[FIXED] 시스템 사운드 녹음 실패 시 안내 문구와 해결 방법이 더 명확해졌어요 *** **Web** * \[IMPROVED] 위키 그래프 뷰에서 위치가 유지되고 검색으로 빠르게 이동할 수 있어요 * \[FIXED] 위키 활성화 전 그래프 요청과 리스트 검색이 올바르게 동작해요 * \[FIXED] 노트 목록에서 무한 스크롤이 정상적으로 작동해요 * \[IMPROVED] 위키 리스트 타임라인 사용 경험이 개선됐어요 * \[IMPROVED] 위키 리스트뷰가 새롭게 디자인됐어요 **Desktop App** * \[FIXED] 이메일 내보내기가 정상적으로 동작해요 **Mobile App 2.2.2** * \[NEW] 잠긴 문단이 있는 노트가 목록에서 “일부 잠김”으로 표시돼요 * \[IMPROVED] 잠긴 문단의 스크립트와 요약을 한두 문장으로 미리 볼 수 있어요 * \[NEW] 일시정지된 실시간 기록을 노트 목록에서 바로 이어서 진행할 수 있어요 *** **Web** * \[IMPROVED] 워크스페이스 초대 알림이 더 보기 좋게 개선됐어요 * \[NEW] Ask Tiro 빈 화면이 중앙 정렬과 추천 질문으로 깔끔하게 바뀌었어요 * \[FIXED] 탭 선택 시 인디케이터가 깜빡이던 문제가 해결됐어요 * \[IMPROVED] 위키 그래프에서 노드를 더 쉽게 펼칠 수 있어요 * \[IMPROVED] 위키 그래프의 노드들이 덜 뭉쳐 보이도록 개선됐어요 **Desktop App** * \[IMPROVED] 설정의 프로필 탭이 웹과 동일하게 정렬됐어요 * \[IMPROVED] 앱 업데이트 확인 주기가 5분으로 짧아져 더 빨리 새 버전을 알 수 있어요 *** **Web** * \[NEW] 위키 그래프 탐색 기능을 사용할 수 있어요 * \[IMPROVED] 컨퍼런스 모드의 자동 스크롤과 재생 표시가 더 자연스럽게 동작해요 * \[FIXED] 팀 플랜 가격 페이지의 무료 체험 안내가 정리됐어요 **Desktop App** * \[IMPROVED] 컨퍼런스 모드에서 실시간 번역 경험이 개선됐어요 **Mobile App 2.2.2** * \[NEW] 잠긴 노트에 안내 알림과 잠금 해제 옵션이 추가됐어요 * \[FIXED] 녹음 업로드 후 노트가 Untitled로 남는 문제가 해결됐어요 * \[FIXED] Android에서 잠금 해제 화면 터치가 정상 작동해요 * \[FIXED] 길이가 알려지지 않은 오디오 파일도 업로드할 수 있어요 * \[FIXED] 통화 녹음 목록이 많아도 안정적으로 불러와요 *** **Web** * \[IMPROVED] 위키 그래프에서 검색과 드래그가 더 안정적으로 작동해요 **Desktop App 4.5.1** * \[FIXED] 업데이트 중 앱이 강제로 종료되는 문제를 해결했어요 *** **Web** * \[NEW] 푸터에 Trust Center 링크가 추가됐어요 * \[IMPROVED] Confluence 공유 시 space 코드 대신 이름이 표시돼요 * \[IMPROVED] 이메일 회원가입 화면이 개선됐어요 * \[IMPROVED] 노트 선택 액션바와 토스트 스타일이 정리됐어요 * \[IMPROVED] 폴더·노트 권한 오류 안내가 더 명확해졌어요 * \[IMPROVED] 툴팁 표시와 플랜 오버레이 경험이 좋아졌어요 **Desktop App 4.5.1** * \[NEW] macOS와 Windows 앱 메뉴에 '업데이트 확인'이 추가됐어요 * \[FIXED] Squirrel 업데이트 중 앱이 강제 종료되는 문제가 해결됐어요 * \[FIXED] Confluence 공유 시 space 이름이 제대로 표시돼요 * \[FIXED] 노트 기록 종료 후 목록에 '기록 중'이 남는 문제가 해결됐어요 * \[FIXED] 플랜 및 사용량 안내 문구가 정확해졌어요 **Mobile App 2.2.1** * \[FIXED] 백그라운드에서 녹음할 때 발생하던 예외가 방지돼요 * \[IMPROVED] 중단 감지가 강화되어 자동 정지/재시작이 더 안정적이에요 * \[IMPROVED] 알림 권한 안내가 추가되어 방해 금지 기능을 더 잘 활용할 수 있어요 **Service Improvements** * \[FIXED] 크레딧이 중복 차감되는 문제가 해결됐어요 * \[FIXED] 실시간 녹음 세션 처리 안정성이 개선됐어요 *** **Web** * \[IMPROVED] 위키 그래프 탐색이 더 편리해졌어요 * \[FIXED] 위키 피드백이 더 안정적으로 반영돼요 * \[FIXED] Share with me 노트의 재생 시간이 올바르게 표시돼요 * \[FIXED] 폴더 수정 시 색상과 설명이 저장돼요 * \[IMPROVED] 노트 헤더가 좁은 화면에서도 보기 좋아졌어요 * \[IMPROVED] 툴팁이 더 자연스럽게 표시돼요 **Service Improvements** * \[FIXED] 위키 출처가 중복되거나 설명이 반복되는 문제가 줄었어요 *** **Web** * \[NEW] 추가 기록 정책을 설정할 수 있는 UI가 추가됐어요 * \[IMPROVED] 멤버 초대 경험이 더 편리해졌어요 * \[IMPROVED] 컨퍼런스 모드 실시간 번역 경험이 개선됐어요 * \[IMPROVED] 위키 상세 UI가 더 깔끔해졌어요 * \[IMPROVED] AskTiro 인용문이 더 정확하게 표시돼요 * \[FIXED] 위키 그래프의 라벨, 호버, 색상, 필터가 더 잘 보이고 자연스럽게 동작해요 * \[FIXED] 노트 기록 종료 후에도 '기록 중' 상태가 남아있던 문제가 해결됐어요 * \[FIXED] 멤버 테이블에서 메모 입력과 저장이 다시 정상적으로 작동해요 * \[FIXED] 만료된 인앱 구독이 팀 플랜 결제를 막는 문제가 해결됐어요 **Desktop App** * \[IMPROVED] 멤버 초대 경험이 더 편리해졌어요 * \[FIXED] 만료된 인앱 구독이 팀 플랜 결제를 막는 문제가 해결됐어요 **Mobile App 2.2.0** * \[FIXED] 워크스페이스 업데이트 후 로그인할 수 없던 문제가 해결됐어요 *** **Desktop App 4.4.0** * \[FIXED] Windows에서 Google 로그인 후 앱으로 돌아오지 않는 문제가 해결됐어요 **Service Improvements** * \[FIXED] 요약이 항상 올바른 언어로 생성돼요 *** **Web** * \[FIXED] 위키 그래프, 빈 상태, 머지 다이얼로그, 출처 UX가 개선됐어요 * \[FIXED] 컨퍼런스 모드의 넛지, 로고, 리사이즈, 번역, 공유 뷰 문제가 해결됐어요 * \[FIXED] 녹음 컨트롤바에서 맥락 입력창이 바깥으로 삐져나오는 문제가 수정됐어요 * \[FIXED] 기록 종료 후 맞춤문서 생성 버튼이 사라지는 문제가 해결됐어요 * \[FIXED] 워크스페이스 전환 시 언어 설정이 올바르게 표시돼요 * \[FIXED] 브레드크럼 표시가 깔끔하게 정리됐어요 **Desktop App 4.3.1** * \[NEW] macOS DMG 설치 화면에 배경 이미지가 추가됐어요 * \[FIXED] 컨퍼런스 모드의 UX와 문구가 개선됐어요 * \[FIXED] Windows에서 Ctrl+Q 단축키로 앱을 종료할 수 있어요 * \[FIXED] 녹음 컨트롤바에서 맥락 입력창이 바깥으로 삐져나오는 문제가 수정됐어요 * \[FIXED] 기록 종료 후 맞춤문서 생성 버튼이 사라지는 문제가 해결됐어요 * \[FIXED] 워크스페이스 전환 시 언어 설정이 올바르게 표시돼요 * \[FIXED] 브레드크럼 표시가 깔끔하게 정리됐어요 **Service Improvements** * \[FIXED] 단락 요약이 '내용 없음'으로 표시되는 문제가 해결됐어요 * \[FIXED] 한국어 등 띄어쓰기 언어의 트랜스크립트 공백이 올바르게 표시돼요 * \[FIXED] 위키 링크와 멘션 표시가 정확해졌어요 * \[FIXED] 위키 머지 후 발생하던 문제가 해결됐어요 * \[FIXED] 위키 검색이 다시 정상적으로 동작해요 * \[FIXED] 구독 갱신이 올바르게 처리돼요 *** **Web** * \[FIXED] 위키 패널 머지와 설명 편집이 정상적으로 동작해요 * \[IMPROVED] 위키 그래프 레이아웃이 더 보기 좋게 조정됐어요 * \[FIXED] 위키 상세 페이지 디자인 문제가 해결됐어요 * \[FIXED] 워크스페이스 내 폴더 간 노트 일괄 이동이 다시 정상 작동해요 * \[FIXED] Share to Notion 클릭 시 로그인이 풀리는 문제가 해결됐어요 * \[FIXED] 오디오 재생 시 탐색이 더 안정적으로 작동해요 * \[IMPROVED] 위키 그래프와 리스트 UX가 개선됐어요 * \[FIXED] 삭제된 노트 재개 시 무한 루프가 발생하지 않아요 * \[NEW] 위키 분석 중에도 기존 위키를 볼 수 있고 알림이 표시돼요 * \[IMPROVED] 위키 디자인이 적용돼 더 깔끔해졌어요 * \[FIXED] 위키 동기화와 그래프 시뮬레이션이 더 안정적이에요 * \[IMPROVED] 위키 빈 상태와 출처 노트 경험이 개선됐어요 **Desktop App** * \[FIXED] 워크스페이스 내 폴더 간 노트 일괄 이동이 다시 정상 작동해요 * \[FIXED] Share to Notion 클릭 시 로그인이 풀리는 문제가 해결됐어요 * \[FIXED] 오디오 재생 시 탐색이 더 안정적으로 작동해요 * \[FIXED] 삭제된 노트 재개 시 무한 루프가 발생하지 않아요 **Mobile App 2.2.0** * \[FIXED] 누락된 번역 텍스트가 추가됐어요 **Service Improvements** * \[FIXED] Ask Tiro 답변이 무한 로딩되지 않고 실패 시 정상 종료돼요 *** **Web** * \[NEW] 워크스페이스가 도입돼요. 팀원과 노트, 폴더를 공유하고 관리할 수 있어요 * \[NEW] 실시간 기록 모드에서 실시간 번역을 켜고 끌 수 있어요 * \[NEW] 음성 파일 업로드 시 화자 수를 입력할 수 있어요 * \[NEW] 컨퍼런스 모드에 맥락 관리 기능이 추가됐어요 * \[IMPROVED] 컨퍼런스 모드 UX가 전반적으로 개선됐어요 * \[FIXED] 워크스페이스 관련 여러 버그가 수정됐어요 **Desktop App 4.3.0** * \[NEW] 워크스페이스가 도입돼요. 팀원과 노트, 폴더를 공유하고 관리할 수 있어요 * \[NEW] 실시간 기록 모드에서 실시간 번역을 켜고 끌 수 있어요 * \[NEW] 음성 파일 업로드 시 화자 수를 입력할 수 있어요 * \[NEW] 컨퍼런스 모드에 맥락 관리 기능이 추가됐어요 * \[IMPROVED] 컨퍼런스 모드 UX가 전반적으로 개선됐어요 * \[FIXED] 시스템 오디오 설정이 필요할 때 안내하고, 컨퍼런스 모드 크래시가 줄었어요 * \[FIXED] 워크스페이스 변경 시 오버레이가 제대로 표시돼요 **Mobile App 2.2.0** * \[NEW] 모바일 앱에서도 워크스페이스를 사용할 수 있어요 *** **Web** * \[NEW] 위키 그래프 색상·간격·드래그 조작이 더 편해졌어요 * \[NEW] NotePeek가 떠 있는 서랍 형태로 더 편하게 열고 닫을 수 있어요 * \[IMPROVED] 위키 그래프에서 연결선이 더 잘 보이고 클릭·드래그를 구분해요 * \[FIXED] 위키 그래프 사용 중 오류가 발생하는 문제가 해결됐어요 *** **Web** * \[FIXED] 폴더 트리 메뉴가 일관된 디자인으로 개선됐어요 * \[FIXED] Ask Tiro 사용 중 노트가 예기치 않게 peek 뷰로 전환되는 문제가 해결됐어요 *** **Service Improvements** * \[FIXED] 사용자가 선택한 언어가 음성 인식에 제대로 적용돼요 * \[FIXED] 삭제된 노트를 다시 열 때 무한 루프에 빠지던 문제가 해결됐어요 *** **Web** * \[NEW] 위키 온보딩이 더 부드럽게 진행되고 상태를 쉽게 확인할 수 있어요 **Desktop App 4.2.0** * \[FIXED] 윈도우 실시간 녹음과 시스템 사운드 캡처 문제가 해결됐어요 *** **Web** * \[FIXED] 기록 종료 후 추천 템플릿 탭이 올바르게 표시돼요 * \[FIXED] 무료 체험 배너의 '구독 시작하기' 버튼이 잘 눌려요 * \[FIXED] 사이드바 폴더 목록의 글자 크기가 일정해요 * \[IMPROVED] 상단 언어 선택기가 더 깔끔하고 반응형으로 통일됐어요 **Desktop App 4.1.0** * \[NEW] 네이티브 오디오 캡처를 지원해 더 안정적으로 녹음할 수 있어요 * \[IMPROVED] 노트 미리보기가 떠 있는 카드 형태로 바뀌어 보기 편해요 * \[IMPROVED] Windows에서 기본 창 제목 표시줄을 사용해요 * \[FIXED] macOS 전체 화면에서 노트 목록이 빈 화면으로 보이는 문제가 사라졌어요 * \[FIXED] 노트 상세 보기에서 단축키(⌘N, ⌘O, ⌘U)가 다시 작동해요 * \[FIXED] 웨이브폼 애니메이션이 더 부드럽게 움직여요 **Mobile App 2.1.25** * \[FIXED] 실시간 대화 기록 텍스트가 끊김 없이 부드럽게 표시돼요 * \[FIXED] 모든 기록에 자동으로 본인이 참석자로 추가돼요 * \[IMPROVED] 언어 관련 UI 문구가 일관되게 통일됐어요 * \[IMPROVED] 신규 사용자의 기본 음성 인식이 다국어 모드로 설정돼요 *** **Web** * \[FIXED] 특정 페이지 접속 시 발생하던 404 오류가 해결됐어요 *** **Service Improvements** * \[FIXED] 음성 인식 오류가 크게 줄어들어 녹음 내용이 더 안정적으로 처리돼요 *** **Mobile App 2.1.25** * \[NEW] Apple Watch에서 바로 녹음을 시작하고 Tiro에 업로드할 수 있어요 * \[IMPROVED] '공유받은 노트' 화면에서 공유받은 노트를 더 쉽게 찾을 수 있어요 * \[IMPROVED] 공유 노트에서 소유자 정보가 더 명확하게 보여요 * \[IMPROVED] 폴더 목록 화면의 들여쓰기와 가독성이 개선됐어요 **Service Improvements** * \[FIXED] 번역이 항상 일관된 말투로 표시돼요 *** **Web** * \[IMPROVED] 노트 사이드바, 목록, Ask Tiro UI가 더 깔끔해졌어요 * \[IMPROVED] 전체 UI 디자인 시스템이 일관성 있게 정돈됐어요 * \[IMPROVED] 온보딩 팝업 디자인 새로워졌어요 * \[FIXED] 에러 페이지 메인 이동과 푸터 링크가 제대로 작동해요 * \[FIXED] 실시간 녹음에서 컨퍼런스 모드 버튼이 표시돼요 * \[FIXED] 폴더 페이지 헤더 설정 아이콘이 권한에 맞게 보여요 * \[FIXED] Ask Tiro 입력창이 여러 줄에서도 레이아웃이 안정적이에요 * \[FIXED] 노트 동기화가 누락 없이 반영돼요 * \[FIXED] 폴더 삭제 시 하위 폴더 안내가 명확해졌어요 * \[NEW] 노트/문단 다중 선택 시 Shift+클릭으로 범위 지정 가능해요 * \[NEW] 노트 내용을 마크다운 형식으로 복사할 수 있어요 **Desktop App 4.0.0** * \[NEW] 자동 노트 요약 기능을 설정에서 켜고 끌 수 있어요 * \[NEW] 노트/문단 다중 선택 시 Shift+클릭으로 범위 지정 가능해요 * \[NEW] 노트 내용을 마크다운 형식으로 복사할 수 있어요 * \[IMPROVED] 노트 사이드바, 목록, Ask Tiro UI가 더 직관적으로 개선됐어요 * \[IMPROVED] 폴더 추가/수정 모달과 설정 화면이 세련되게 바뀌었어요 * \[IMPROVED] 노트 상세 페이지 디자인이 일관성 있게 정돈됐어요 * \[IMPROVED] 온보딩과 결제 환영 팝업이 새 디자인으로 업데이트됐어요 * \[IMPROVED] 폴더 EDITOR 권한으로 사이드바 메뉴와 드래그가 가능해요 * \[FIXED] 에러 페이지 이전/메인 페이지 버튼이 제대로 동작해요 * \[FIXED] 실시간 녹음 Tablet 헤더 컨퍼런스 버튼이 표시돼요 * \[FIXED] macOS 도크 아이콘 크기가 정상으로 고쳐졌어요 * \[FIXED] Slack 자동화 채널 아이콘과 비공개 채널 안내가 일관돼요 * \[FIXED] Ask Tiro 입력창 레이아웃이 여러 줄에서도 안정적이에요 * \[FIXED] 노트 동기화가 즉시 반영돼요 **Service Improvements** * \[IMPROVED] 문단 요약이 더 자연스럽고 정확해졌어요 * \[IMPROVED] 공유 노트 실시간 업데이트가 더 빠르고 안정적이에요 * \[FIXED] 구독 생성과 갱신이 안정적으로 동기화돼요 * \[FIXED] 무료 체험 만료 알림 이메일이 정확히 발송돼요 *** **Web** * \[NEW] 보안 페이지가 추가되어 개인정보 보호 정보를 쉽게 확인할 수 있어요 * \[IMPROVED] 노트 페이지 헤더 버튼과 타이틀-본문 간격이 더 자연스럽게 조정됐어요 * \[IMPROVED] 온보딩 팝업에 새 브랜딩 디자인이 적용됐어요 * \[FIXED] 실시간 녹음 노트의 태블릿 헤더에서 컨퍼런스 모드 버튼이 이제 제대로 표시돼요 * \[FIXED] 공유 페이지 복사 드롭다운 UI 문제점이 수정됐어요 **Desktop App** * \[IMPROVED] 온보딩 팝업에 새 브랜딩 디자인이 적용됐어요 * \[FIXED] 실시간 녹음 노트의 태블릿 헤더에서 컨퍼런스 모드 버튼이 이제 제대로 표시돼요 **Service Improvements** * \[IMPROVED] 실시간 자막 수정이 더 정확하고 안정적으로 이뤄져요 * \[FIXED] AI 응답 처리 과정에서 발생하던 오류가 해결됐어요 * \[FIXED] 노트 검색 결과가 더 일관되게 표시돼요 * \[FIXED] 공유 노트 로딩 중 오류가 사라졌어요 *** **Web** * \[IMPROVED] 탭 활성 표시선 레이아웃이 더 깔끔해졌어요 * \[FIXED] HubSpot 공유 시 정보가 제대로 업데이트돼요 * \[FIXED] Confluence 공유에서 Cloud/Space 선택이 즉시 반영돼요 * \[FIXED] 폴더 페이지 헤더 설정 아이콘이 권한에 맞게 표시돼요 **Desktop App** * \[FIXED] macOS 도크에서 Tiro 아이콘 크기가 정상으로 표시돼요 * \[FIXED] 폴더 페이지 헤더 설정 아이콘이 권한에 맞게 표시돼요 **Mobile App 2.1.24** * \[IMPROVED] 데스크톱 앱을 더 쉽게 확인하고 사용할 수 있도록 안내를 개선했어요 **Service Improvements** * \[IMPROVED] 한국어와 일본어 음성 인식 정확도가 높아졌어요 * \[FIXED] 노트 단락 요약 후 전체 처리 과정이 안정적으로 완료돼요 *** **Web** * \[IMPROVED] 폴더 편집자 권한으로 사이드바 메뉴와 드래그 이동이 가능해졌어요 * \[FIXED] Slack 자동화 채널 아이콘이 일관되게 표시되고 비공개 채널 안내가 추가됐어요 **Service Improvements** * \[NEW] 일본어 음성 인식이 지원돼요 * \[NEW] 폴더 편집자 권한으로 폴더 수정, 삭제, 이동이 가능해졌어요 * \[IMPROVED] 노트 검색에서 날짜 범위 필터를 사용할 수 있고 결과가 더 많아졌어요 * \[IMPROVED] 검색 결과가 최근순으로 정렬돼요 * \[IMPROVED] 실시간 음성 인식이 더 부드럽고 정확해졌어요 * \[IMPROVED] 검색 속도와 정확도가 향상됐어요 * \[FIXED] Slack 봇 채널 변경이 즉시 반영돼요 * \[FIXED] 음성 인식 중복 텍스트가 사라졌어요 * \[FIXED] 음성 재생 시 라벨이 일관되게 표시돼요 *** **Service Improvements** * \[FIXED] 공유 노트가 더 안정적으로 열리며 오류가 사라졌어요 * \[FIXED] 번역 결과에서 화자 라벨(A:, B:)이 제거되어 깔끔해졌어요 * \[FIXED] 음성 인식 재처리 시 시간과 순서가 정확해졌어요 *** **Web** * \[NEW] 노트 자동 요약 기능을 간편하게 켜고 끌 수 있는 토글을 추가했어요 * \[IMPROVED] 노트 상세 페이지의 디자인이 더 세련되고 일관되게 개선됐어요 **Desktop App** * \[NEW] 데스크톱 결제 후 환영 팝업이 더 부드럽게 열리게 됐어요 **Mobile App 2.1.23** * \[IMPROVED] 무료 체험과 구독 페이월 화면이 더 명확하고 사용하기 쉽게 개선됐어요 * \[FIXED] Android에서 문서 탭 추가 바텀 시트가 이제 스크롤돼요 * \[FIXED] 데스크톱 사용자는 모바일에서 데스크톱 다운로드 배너를 더 이상 보지 않아요 *** **Service Improvements** * \[NEW] 노트 자동 요약 기능을 이제 켜고 끌 수 있어요 * \[FIXED] 자동 요약을 끈 상태에서 음성 파일 처리 진행률이 멈추는 문제가 해결됐어요 *** **Service Improvements** * \[FIXED] 무료 체험 기간이 시간대에 맞게 정확히 계산돼요 * \[FIXED] 트리거 목록에 팀 스레드 트리거가 모두 제대로 표시돼요 * \[FIXED] 긴 녹음 파일의 음성 처리와 재생이 한도 없이 더 안정적이에요 * \[FIXED] AI 응답 오류 시 입력 내용이 안전하게 보호돼요 *** **Web** * \[IMPROVED] 설정 화면이 더 직관적이고 일관되게 바뀌었어요 *** **Web** * \[IMPROVED] 기본 언어를 영어로 변경하고 한국어 URL을 /ko로 통일해 언어 선택이 더 간편해졌어요 *** **Service Improvements** * \[IMPROVED] 검색 기능이 이제 안정적으로 작동해요 * \[IMPROVED] 저장되지 않은 변경 사항이 더 정확하게 표시돼요 *** **Web** * \[NEW] 노트나 문단 여러 개 선택 시 Shift+클릭으로 범위 선택이 가능해요 * \[NEW] 노트를 마크다운(.md) 형식으로 복사할 수 있어요 * \[IMPROVED] UI가 더 일관되고 세련되게 개선됐어요 * \[IMPROVED] 캘린더 배경이 더 깔끔하게 통일됐어요 * \[FIXED] Ask Tiro 입력창 다중 줄 레이아웃 깨짐 문제 수정됐어요 * \[FIXED] 노트 동기화 누락으로 변경 사항이 미반영되는 문제 해결됐어요 * \[FIXED] 폴더 삭제 시 하위 폴더 안내가 더 명확해졌어요 **Desktop App 3.16.3** * \[NEW] 노트나 문단 여러 개 선택 시 Shift+클릭으로 범위 선택이 가능해요 * \[NEW] 노트를 마크다운(.md) 형식으로 복사할 수 있어요 * \[IMPROVED] UI가 더 일관되고 세련되게 개선됐어요 * \[IMPROVED] 캘린더 배경이 더 깔끔하게 통일됐어요 * \[FIXED] Ask Tiro 입력창 다중 줄 레이아웃 깨짐 문제 수정됐어요 * \[FIXED] 노트 동기화 누락으로 변경 사항이 미반영되는 문제 해결됐어요 * \[FIXED] 폴더 삭제 시 하위 폴더 안내가 더 명확해졌어요 * \[FIXED] 업데이트 알림과 Windows 자동 업데이트가 더 안정적으로 작동해요 *** **Service Improvements** * \[IMPROVED] AI 응답의 코드 블록이 깨짐 없이 제대로 표시돼요 * \[FIXED] 노트 단락 요약 생성 시 동시 접근으로 인한 데이터 덮어쓰기 문제가 해결됐어요 *** **Service Improvements** * \[IMPROVED] 실시간 연결이 더 안정적으로 유지돼요 * \[IMPROVED] 노트 요약이 더 빨리 로드돼요 * \[FIXED] AI 응답이 더 일관성 있게 동작해요 *** **Web** * \[NEW] Notion 저장 위치에 페이지/데이터베이스 뱃지 추가됐어요 * \[IMPROVED] Confluence 다중 사이트 사용자용 클라우드 선택 UI가 추가됐어요 * \[IMPROVED] 템플릿 관리 모달을 X 버튼이나 ESC 키로 쉽게 닫을 수 있어요 * \[FIXED] Notion 저장 위치 배지가 비어 보이는 문제 수정됐어요 * \[FIXED] Confluence 페이지 검색 시 스페이스 전환 버그 수정됐어요 * \[FIXED] 접근 불가 상위 폴더 아래 접근 가능 하위 폴더가 제대로 표시돼요 * \[FIXED] Notion 공유 팝업에서 대상 페이지 변경이 즉시 반영돼요 **Desktop App** * \[NEW] Notion 저장 위치에 페이지/데이터베이스 뱃지 추가됐어요 * \[IMPROVED] Confluence 다중 사이트 사용자용 클라우드 선택 UI가 추가됐어요 * \[IMPROVED] 템플릿 관리 모달을 X 버튼이나 ESC 키로 쉽게 닫을 수 있어요 * \[FIXED] Notion 저장 위치 배지가 비어 보이는 문제 수정됐어요 * \[FIXED] Confluence 페이지 검색 시 스페이스 전환 버그 수정됐어요 * \[FIXED] 접근 불가 상위 폴더 아래 접근 가능 하위 폴더가 제대로 표시돼요 **Service Improvements** * \[IMPROVED] AI 제목 생성, 속성 추출, 사전, 채팅 답변이 더 안정적으로 작동해요 * \[IMPROVED] Confluence 페이지 검색 정확도와 안정성이 향상됐어요 * \[FIXED] Slack 공유 시 중복 URL 제거와 사용자 메시지 누락이 수정됐어요 * \[FIXED] 음성 전사 오류 코드가 제대로 저장돼요 * \[FIXED] 팀 구독 만료 시 청구와 좌석 동기화가 올바르게 처리돼요 *** **Web** * \[NEW] 친구 초대 혜택에서 무료 이용 시간을 확인할 수 있어요 * \[FIXED] 녹음 중 마이크나 스피커를 바꿔도 오디오가 자동으로 복구돼요 **Desktop App** * \[NEW] 친구 초대 혜택에서 무료 이용 시간을 확인할 수 있어요 * \[FIXED] 녹음 중 마이크나 스피커를 바꿔도 오디오가 자동으로 복구돼요 *** **Web** * \[IMPROVED] 문단 요약 완료 시 애니메이션과 반짝임 효과가 더 부드럽고 세련되게 개선됐어요 * \[FIXED] 신규 사용자 새 디자인 안내 팝업과 온보딩 팝업이 겹치는 문제가 해결됐어요 **Desktop App** * \[IMPROVED] 문단 요약 완료 시 애니메이션과 반짝임 효과가 더 부드럽고 세련되게 개선됐어요 * \[FIXED] 신규 사용자 새 디자인 안내 팝업과 온보딩 팝업이 겹치는 문제가 해결됐어요 **Service Improvements** * \[IMPROVED] 번역 처리 속도와 품질이 더 가볍고 빠르게 향상됐어요 * \[IMPROVED] 문단 요약 속도가 최적화되어 더 빨라졌어요 * \[IMPROVED] 한국어 텍스트의 한자 혼입 오류가 더 잘 처리돼 깨끗해졌어요 * \[FIXED] 구독 갱신 시 중복 기록 문제가 해결돼 안정적으로 동작해요 * \[FIXED] 구독 전환 과정이 원활하게 처리돼요 *** **Web** * \[IMPROVED] 공유 페이지에서 컨퍼런스 모드 버튼이 제거되어 더 깔끔해졌어요 **Desktop App 3.16.2** * \[FIXED] 설정 창 깜빡임이 사라지고 업데이트가 더 안정적으로 이뤄져요 **Mobile App 2.1.21** * \[FIXED] 맞춤 문서가 제대로 렌더링돼요 * \[FIXED] 맞춤 문서 생성 시 페이지 이동 오류가 수정됐어요 * \[FIXED] 맞춤 문서 페이지 진입 시 불필요한 자동 스크롤이 사라졌어요 **Service Improvements** * \[FIXED] 기록 종료 후 화자 분리가 안정적으로 진행돼요 *** **Web** * \[NEW] 공유 컨퍼런스 뷰에 설정 패널이 추가됐어요 * \[IMPROVED] 다국어 뷰 헤더가 더 깔끔해지고 나가기 버튼이 생겼어요 * \[IMPROVED] 컨퍼런스 모드 UI가 부드럽고 직관적으로 개선됐어요 * \[FIXED] 공유 라이브 컨퍼런스 뷰가 더 안정적으로 표시돼요 **Desktop App 3.16.2** * \[NEW] 실시간 공유 노트 스트리밍과 컨퍼런스 모드가 한층 업그레이드됐어요 * \[IMPROVED] 설정 창 디자인과 선물하기 배경이 새로워졌어요 * \[IMPROVED] 템플릿 관리 아이콘이 깔끔하게 업데이트됐어요 * \[IMPROVED] 트레이 아이콘과 메뉴가 더 세련되게 바뀌었어요 * \[FIXED] 폴더 설정에서 본인 이름이 제대로 표시돼요 * \[FIXED] 노트 제목 편집 중 Space 키로 채팅 포커스가 이동하지 않아요 * \[FIXED] 녹음 중 서버 추천 제목이 즉시 반영돼요 * \[FIXED] 앱 바깥쪽 흰색 여백이 사라져서 화면이 꽉 차요 * \[FIXED] 설정 창이 깜빡이지 않고 안정적으로 열어요 * \[FIXED] 스크롤 인디케이터가 필요할 때만 보이고 배경이 깨끗해졌어요 **Service Improvements** * \[IMPROVED] 공유 노트가 실시간으로 모두에게 동기화돼요 * \[IMPROVED] 이메일 발송이 더 안정적이고 빠르게 처리돼요 *** **Web** * \[IMPROVED] 실시간 공유 노트 스트리밍과 컨퍼런스 모드가 더 부드럽게 작동해요 * \[IMPROVED] 티로 설정 창과 선물하기 배경이 새롭게 업데이트됐어요 * \[FIXED] 폴더 설정에서 내 이름이 제대로 표시돼요 * \[FIXED] 실시간 연결이 끊겨도 자동으로 복구돼요 **Desktop App** * \[IMPROVED] 실시간 공유 노트 스트리밍과 컨퍼런스 모드가 더 부드럽게 작동해요 * \[IMPROVED] 티로 설정 창과 선물하기 배경이 새롭게 업데이트됐어요 * \[IMPROVED] 트레이 아이콘이 새롭게 디자인됐고 메뉴가 더 보기 좋아졌어요 * \[FIXED] 폴더 설정에서 내 이름이 제대로 표시돼요 *** **Web** * \[FIXED] 노트 제목 편집 중 스페이스바를 눌러도 Ask Tiro 채팅으로 포커스가 이동하지 않아요 * \[FIXED] 노트 기록 중 추천 제목이 제목 영역에 바로 표시돼요 * \[FIXED] 공유 미리보기 이미지에서 긴 제목이 참가자 정보와 겹치지 않아요 **Desktop App** * \[FIXED] 노트 제목 편집 중 스페이스바를 눌러도 Ask Tiro 채팅으로 포커스가 이동하지 않아요 * \[FIXED] 노트 기록 중 추천 제목이 제목 영역에 바로 표시돼요 **Mobile App 2.1.20 / 2.1.21** * \[FIXED] 맥락 입력 중 엔터를 누를 때 커서 위치에 맞춰 스크롤이 제대로 이동해요 *** **Mobile App 2.1.21** * \[IMPROVED] 음성파일 업로드 안정성이 높아졌어요 * \[FIXED] 표가 더 정확하게 보여지게 됐어요 *** **Web** * \[FIXED] 랜딩 페이지가 모바일 브라우저에서 더 깔끔하게 보이게 됐어요 * \[FIXED] 상단 헤더 메뉴 링크가 정확하게 작동해요 *** **Web** * \[NEW] 사용량 한도를 초과하면 알림으로 바로 알려줘요 * \[IMPROVED] 새로운 폰트와 아이콘으로 UI가 더 세련되게 바뀌었어요 * \[IMPROVED] 색상 톤을 조정해 더 조화로운 느낌이에요 * \[FIXED] 랜딩 페이지가 모바일에서 더 잘 보여요 **Desktop App 3.16.0** * \[NEW] 사용량 한도를 초과하면 알림으로 바로 알려줘요 * \[IMPROVED] 새로운 폰트와 아이콘으로 UI가 더 세련되게 바뀌었어요 * \[IMPROVED] 색상 톤을 조정해 더 조화로운 느낌이에요 **Mobile App 2.1.19** * \[NEW] 빈 음성 파일을 업로드하려 하면 미리 알려줘요 * \[IMPROVED] 설정 페이지 플랜 섹션 디자인이 깔끔해지고 텍스트 잘림이 없어요 * \[FIXED] 팝업의 위험 버튼이 선명한 빨간색으로 표시돼요 *** **Mobile App 2.1.19** * \[IMPROVED] 새로운 브랜드 디자인으로 앱이 업데이트됐어요 *** **Web** * \[NEW] 사용량 한도를 초과할 때 명확한 알림이 표시돼요 * \[IMPROVED] 일본어 랜딩 페이지가 글로벌 페이지로 전환되어 더 일관된 첫인상을 줘요 **Desktop App** * \[NEW] 사용량 한도를 초과할 때 명확한 알림이 표시돼요 *** **Web** * \[IMPROVED] 새로운 폰트와 아이콘으로 인터페이스가 더 세련돼졌어요 * \[FIXED] 템플릿 관리 모달에서 노트 밖 접근 시 우측 패널이 빈 화면으로 보이지 않아요 * \[FIXED] 음성 인식 언어 변경 중에도 녹음 시작이 안정적으로 진행돼요 **Desktop App** * \[NEW] 오프라인 녹음 종료 후 노트 진입 시 프로그레스 바가 표시돼요 * \[IMPROVED] 새로운 폰트와 아이콘으로 인터페이스가 더 세련돼졌어요 * \[FIXED] Ask Tiro 응답 실패 버그가 수정됐어요 * \[FIXED] 템플릿 관리 모달에서 노트 밖 접근 시 우측 패널이 빈 화면으로 보이지 않아요 * \[FIXED] 음성 인식 언어 변경 중에도 녹음 시작이 안정적으로 진행돼요 *** **Web** * \[IMPROVED] 노트 폴더 추가나 제거 시 화면이 즉시 업데이트돼요 * \[IMPROVED] 녹음 시작 전에 마이크 감도를 조절할 수 있어요 * \[IMPROVED] 맥락 추가 후 변환하기 버튼이 바로 반응해요 * \[FIXED] 템플릿 관리 모달 우측 패널이 빈 화면으로 안 보여요 * \[FIXED] 음성 인식 언어 변경 후 녹음 시작이 안정적이 됐어요 * \[FIXED] Peek 뷰에서 전체 뷰 전환 시 불필요한 깜빡임이 사라졌어요 * \[FIXED] HubSpot 내보내기에서 문서 템플릿이 제대로 포함돼요 * \[FIXED] 문서 삭제 모달 텍스트 사라짐과 늦은 닫힘 문제 해결됐어요 * \[FIXED] 노트 공유 권한 설정 팝업이 제대로 동작해요 * \[FIXED] 음성 파일 업로드 시 녹음 뷰 깜빡임이 없어요 **Desktop App 3.15.10** * \[NEW] 오프라인 녹음 중 취소 기능이 추가됐어요 * \[NEW] 오프라인 녹음 플로팅 토스트에서 마이크와 시스템 오디오 설정이 가능해요 * \[IMPROVED] 오프라인 녹음 종료 후 노트 진입 시 프로그레스 바가 표시돼요 * \[IMPROVED] 오프라인 업로드 실패 시 사용자에게 더 나은 에러 메시지 보여줘요 * \[FIXED] Ask Tiro 응답 실패 버그가 수정됐어요 * \[FIXED] 데스크탑 앱 좌측 상단 트래픽 라이트 버튼 중복 표시가 사라졌어요 * \[FIXED] 오프라인 녹음 화면 최소화 시 파형이 실제 오디오에 맞게 움직여요 * \[FIXED] 오프라인 녹음 종료 직후 노트 목록에 바로 표시돼요 * \[FIXED] 현재 버전에서 불필요한 업데이트 알림이 뜨지 않아요 * \[FIXED] 노트 페이지 하단 가로 스크롤 문제가 해결됐어요 * \[FIXED] Slack 채널 검색에서 한글 입력이 동작해요 * \[FIXED] 사람 태그 추가 시 중복 이메일 표시가 제거됐어요 **Mobile App 2.1.19** * \[FIXED] 모바일에서 대화와 요약 언어 변경이 안정적으로 저장되고 우선 적용돼요 *** **Web** * \[IMPROVED] 노트 폴더 추가나 제거 시 변경이 즉시 화면에 반영돼요 * \[FIXED] 실시간 녹음 종료 후 스트리밍이 안정적으로 끝나고 화면 전환이 부드럽게 이뤄져요 * \[FIXED] Ask Tiro 세션 초기화 버튼이 첫 클릭부터 바로 작동해요 * \[FIXED] 노트 페이지가 더 빠르고 안정적으로 열리게 됐어요 **Desktop App** * \[IMPROVED] 노트 폴더 추가나 제거 시 변경이 즉시 화면에 반영돼요 * \[FIXED] 노트 페이지가 더 빠르고 안정적으로 열리게 됐어요 *** **Web** * \[FIXED] 사람 태그 추가 시 중복 이메일 표시가 사라졌어요 **Mobile App 2.1.19** * \[NEW] 노트를 이메일로 간편하게 내보낼 수 있어요 * \[IMPROVED] 이메일 내보내기 포맷팅이 더 깔끔해졌어요 * \[FIXED] 위젯으로 기록 시작 시 오류가 해결됐어요 * \[FIXED] 오프라인 녹음 중 백그라운드에서 포그라운드로 전환할 때 시간이 --:--로 보이던 문제가 고쳐졌어요 *** **Mobile App 2.1.17 (iOS) / 2.1.18 (Android)** * \[NEW] 오프라인 녹음이나 음성 파일 모드에서 이전 맥락을 불러올 수 있어요 * \[NEW] 사용량을 프로그레스 바로 한눈에 확인할 수 있어요 * \[IMPROVED] 기록 컨트롤러에서 선택된 모드의 배경색이 강조돼요 * \[IMPROVED] 배경 색상이 더 선명해 가독성이 좋아졌어요 * \[FIXED] 오프라인 모드가 기록 컨트롤러 중앙으로 이동해 더 쉽게 선택할 수 있어요 * \[FIXED] 노트 상세 페이지의 공유와 옵션 드롭다운 메뉴가 깔끔하게 정리됐어요 *** **Web** * \[NEW] 로그인 화면에 마지막으로 사용한 로그인 방식 배지가 표시돼요 * \[IMPROVED] 녹음 시작 전에 마이크 감도를 미리 조절할 수 있어요 * \[IMPROVED] 맥락 추가 시 스피너가 빨리 사라지고 변환 버튼이 즉시 반응해요 * \[IMPROVED] 구독/결제 관리 버튼이 더 직관적으로 바뀌었어요 * \[FIXED] Slack 채널 검색에서 한글 입력이 정상 작동해요 * \[FIXED] 화자 분리 켜진 상태에서 형광펜 하이라이트가 저장돼요 * \[FIXED] 공유 링크 미리보기 이미지의 한글이 깨지지 않아요 * \[FIXED] Peek 뷰에서 전체 뷰로 전환 시 더 부드럽게 바뀌어요 * \[FIXED] HubSpot 내보내기에 문서 템플릿이 제대로 포함돼요 * \[FIXED] 문서 삭제 모달에서 텍스트 누락과 지연 문제 해결됐어요 * \[FIXED] 캘린더 다가오는 일정에 1시간 내 끝나는 이벤트도 보여요 * \[FIXED] 노트 초대 시 권한 설정 팝업이 제대로 동작해요 * \[FIXED] 작업 오류 발생 시 알림이 누락되지 않아요 * \[FIXED] 한 페이지 문서 생성 후 로딩 아이콘이 빨리 사라져요 **Desktop App** * \[NEW] 오프라인 녹음 최소화 토스트에서 마이크/시스템 오디오 설정 가능해졌어요 * \[NEW] 로그인 화면에 마지막으로 사용한 로그인 방식 배지가 표시돼요 * \[IMPROVED] 오프라인 녹음 종료 후 노트 목록에 즉시 표시돼요 * \[IMPROVED] 녹음 시작 전에 마이크 감도를 미리 조절할 수 있어요 * \[FIXED] 오프라인 업로드 실패 시 더 명확한 에러 메시지와 안정적 처리 * \[FIXED] 현재 버전에서 업데이트 알림이 뜨지 않아요 * \[FIXED] 오프라인 녹음 최소화 시 파형이 실제 소리에 맞게 움직여요 * \[FIXED] 노트 페이지 하단 가로 스크롤 문제 해결됐어요 * \[FIXED] 음성 파일 업로드 시 녹음 뷰 깜빡임이 사라졌어요 *** **Mobile App 2.1.18** * \[FIXED] 온보딩 완료 후 녹음이 예상대로 시작돼요 *** **Mobile App 2.1.15** * \[FIXED] 오디오 파일 전체 페이지에서 오디오를 바로 다운로드할 수 있어요 **Service Improvements** * \[FIXED] 긴 영문 대화 전사에서 단락 중복이 사라졌어요 *** **Mobile App 2.1.17** * \[NEW] 이전 맥락을 불러와서 대화를 이어갈 수 있어요 * \[NEW] 내용을 간편하게 공유할 수 있어요 * \[IMPROVED] '참고자료'가 '맥락 추가'로 바뀌어 더 직관적이에요 * \[IMPROVED] 실시간 입력 중에만 자동 스크롤이 동작해 더 자연스러워요 * \[IMPROVED] 문단 편집 애니메이션이 더 부드럽고 빨라졌어요 * \[FIXED] 노트는 소유자만 삭제할 수 있게 안전해졌어요 * \[FIXED] 영어 UI에서 메시지 누락이 수정됐어요 *** **Service Improvements** * \[FIXED] 영어 음성 인식에서 텍스트가 중복되지 않아요 *** **Web** * \[NEW] 화자 분리를 간편하게 토글할 수 있고 색상이 더 직관적이 됐어요 * \[IMPROVED] 팀 관리에서 팀원 검색이 더 빠르고 정확해졌어요 * \[IMPROVED] 프로필 사진 없는 기본 아바타가 더 자연스러워졌어요 * \[IMPROVED] 공유 음성 파일에 스크립트처럼 타임스탬프가 표시돼요 * \[FIXED] 복사 버튼 메뉴가 노트 내용과 겹쳐도 안 닫혀요 * \[FIXED] 스트리밍 중 뷰 전환 시 빈 화면이 안 보여요 * \[FIXED] 공유 링크에서 편집 권한 없으면 참석자 수정이 안 돼요 * \[FIXED] 참석자 목록의 첫 번째 항목이 자동 선택 안 돼요 * \[FIXED] One Pager 저장 시 다른 노트에 내용이 안 섞여요 **Desktop App 3.15.9** * \[NEW] 검색 모달에 키워드 강조, 정밀 스크롤, 다중 검색/바꾸기 기능이 추가됐어요 * \[NEW] OAuth 로그인 중 안내 페이지가 생겨 더 편리해졌어요 * \[NEW] 팀 사용량을 CSV로 쉽게 내보낼 수 있어요 * \[NEW] 화자 분리를 간편하게 토글할 수 있고 색상이 더 직관적이 됐어요 * \[IMPROVED] 앱 최소화 시 파형 애니메이션이 실제 오디오에 맞춰 움직여요 * \[IMPROVED] 오프라인 모드 폴더 선택 UI가 통일되고 여러 개 선택 가능해졌어요 * \[IMPROVED] 팀 관리에서 팀원 검색이 더 빠르고 정확해졌어요 * \[IMPROVED] 프로필 사진 없는 기본 아바타가 더 자연스러워졌어요 * \[IMPROVED] 공유 음성 파일에 스크립트처럼 타임스탬프가 표시돼요 * \[FIXED] 피크 뷰에서 노트 전환 시 이전 제목이 바뀌던 버그가 고쳐졌어요 * \[FIXED] 복사 버튼 메뉴가 노트 내용과 겹쳐도 안 닫혀요 * \[FIXED] 업로드 막힐 때 더 친절한 오류 메시지가 보여요 * \[FIXED] 스트리밍 중 제목 수정 시 문단이 사라지던 문제가 없어요 * \[FIXED] Ask Tiro UI 토글 버튼의 회색 영역과 테두리 버그 수정됐어요 * \[FIXED] 스트리밍 중 뷰 전환 시 빈 화면이 안 보여요 * \[FIXED] 공유 링크에서 편집 권한 없으면 참석자 수정이 안 돼요 * \[FIXED] 참석자 목록의 첫 번째 항목이 자동 선택 안 돼요 * \[FIXED] One Pager 저장 시 다른 노트에 내용이 안 섞여요 * \[FIXED] 폴더 설정은 오너만 변경 가능해요 **Mobile App 2.1.17** * \[NEW] 음성 파일 업로드 시 맥락 입력 기능을 추가했어요 * \[IMPROVED] 로그인 플로우가 바텀 시트로 더 편리해졌어요 * \[IMPROVED] 로그인 후 온보딩에서 바로 녹음이 시작돼요 * \[FIXED] 앱 재시작 시 화면 깜빡임이 줄었어요 * \[FIXED] 오프라인 노트 제목이 상태 영역을 침범하던 문제가 고쳐졌어요 * \[FIXED] 녹음 종료 후 뒤로 가기가 가능해졌어요 *** **Web** * \[NEW] 실시간 기록에서 화자 분리를 토글로 켜고 끌 수 있어요 * \[IMPROVED] 노트 공유 시 로딩 인디케이터가 표시돼요 * \[IMPROVED] 팀 관리에서 팀원 검색이 더 빠르고 정확해졌어요 * \[IMPROVED] 프로필 사진 없는 기본 아바타가 더 예뻐졌어요 * \[FIXED] 공유 페이지에서 편집/삭제 버튼이 올바르게 표시돼요 * \[FIXED] 음성 파일 공유 시 타임스탬프가 스크립트 탭과 일치해요 * \[FIXED] 실시간 전사 중 뷰 전환 시 빈 화면 문제가 사라졌어요 * \[FIXED] 공유 링크나 읽기 전용 노트에서 참석자 변경이 불가능해요 **Mobile App 2.1.16** * \[NEW] 기록이 더 쉬워졌어요: 세 가지 기록 모드를 하나의 컨트롤러 UI에서 시작 가능 * \[NEW] 오프라인 파일 관리가 강력해졌어요: 용량/여유 공간 확인, 다중 선택, 업로드된 노트 제목과 파일 매핑 * \[IMPROVED] 검색과 이동이 자연스러워졌어요: 폴더와 노트를 통합 검색 가능 * \[IMPROVED] 전사/노트 읽기 경험이 좋아졌어요: 가독성, 스크롤, 레이아웃 안정성 개선 * \[IMPROVED] 앱 전반 안정성과 반응성을 높였어요 * \[IMPROVED] 기록 컨트롤러 애니메이션 완성도를 높였어요 * \[IMPROVED] 필수 업데이트가 필요한 경우 즉시 반영되도록 개선했어요 * \[IMPROVED] 유저 정보가 없을 때 기기 언어로 기본 언어를 설정해요 * \[IMPROVED] Ask Tiro 응답 안정성을 높였어요 * \[FIXED] 불필요한 로그인 팝업을 제거했어요 * \[FIXED] 녹음 종료 시 간헐적으로 발생하던 종료 상태 꼬임을 수정했어요 * \[FIXED] 예외 상황 크래시 대응을 강화했어요 **Service Improvements** * \[IMPROVED] 화자 분리가 더 정확해졌어요 *** **Web** * \[NEW] Slack 개인 채널과 그룹 DM에 적합한 아이콘과 표시가 추가됐어요 * \[IMPROVED] 공유 링크 설정이 더 부드럽게 관리돼요 * \[FIXED] One Pager 저장 시 다른 노트에 잘못 저장되는 문제가 해결됐어요 * \[FIXED] 실시간 기록 종료 버튼 클릭 후 컨트롤 바가 제대로 사라져요 * \[FIXED] 맞춤 문서 생성 중 탭 전환 시 하단 버튼 이름이 올바르게 바뀌어요 * \[FIXED] 폴더 설정 번역이 정확하게 표시돼요 **Service Improvements** * \[NEW] Slack 개인 채널과 DM 채널 검색이 가능해졌어요 * \[NEW] 외부 공유 링크를 더 쉽게 만들 수 있어요 * \[IMPROVED] 검색 속도와 정확도가 크게 향상됐어요 * \[IMPROVED] Notion 검색이 더 빠르고 안정적으로 작동해요 * \[FIXED] 노트 요약 업데이트가 안정적으로 처리돼요 *** **Service Improvements** * \[FIXED] 캘린더 처음 연동할 때 선택한 일정도 제대로 반영돼요 * \[FIXED] 화자 정보 중복 오류가 해결돼 더 안정적으로 작동해요 * \[FIXED] 캘린더 동기화가 여러 번 호출될 때도 안정적이에요 *** **Desktop App 3.15.8** * \[NEW] 시스템 사운드 녹음에 실패하면 바로 알려줘요 * \[NEW] 패치 업데이트가 백그라운드에서 자동으로 적용돼요 * \[NEW] 캘린더 연동 배너를 영구적으로 숨길 수 있어요 * \[NEW] 설정 창에 닫기(X) 버튼이 추가됐어요 * \[NEW] 노트 단락을 여러 개 선택해 한 번에 삭제할 수 있어요 * \[NEW] 컨퍼런스 모드에서 한 문단을 고정 표시할 수 있어요 * \[NEW] 컨퍼런스 모드 디스플레이 방식을 설정할 수 있어요 * \[NEW] Ask Tiro에 기본 멘션이 자동 삽입돼요 * \[NEW] Ask Tiro 인용 버튼에 팝오버 메뉴가 생겼어요 * \[NEW] 화상 미팅 모드에서 언어 설정이 항상 표시돼요 * \[IMPROVED] 노트 열 때 사람 태그와 폴더명이 즉시 보여요 * \[IMPROVED] 음성 재생바가 타임스탬프와 문단 사이로 이동했어요 * \[IMPROVED] 결제 갱신일에 시간까지 자세히 표시돼요 * \[IMPROVED] 컨퍼런스 모드 텍스트 색상이 더 잘 보이게 됐어요 * \[IMPROVED] 단락 호버 툴바가 더 부드럽고 예쁘게 개선됐어요 * \[IMPROVED] 팝업과 토스트 닫기 버튼이 직관적으로 바뀌었어요 * \[FIXED] 스트리밍 중 뷰 전환 시 한 페이지 문서 빈 화면 사라짐 * \[FIXED] 기록 종료 버튼 누르면 컨트롤바가 제대로 사라져요 * \[FIXED] 오프라인 녹음 시 맥락 정보가 저장되고 손실 안 돼요 * \[FIXED] 전체화면 전환 시 앱 프리즈 현상 해결됐어요 * \[FIXED] Outlook 캘린더 연동 시 빈 페이지 뜨지 않아요 * \[FIXED] 노트 페이지 들어갈 때 맞춤 문서 팝오버 자동 열림 방지 * \[FIXED] 노트 종료 후 요약 내용 깜빡임과 탭 버그 수정 * \[FIXED] 노트 페이지 스크롤이 맨 위나 아래로 점프 안 해요 * \[FIXED] 번역 스크립트에서 스크롤바 두 개 생기는 문제 해결 * \[FIXED] 노트 탭 상태가 초기화되는 문제 고쳤어요 * \[FIXED] Ask Tiro 인용 하이라이트 체류 시간이 정확해졌어요 * \[FIXED] Tiro 녹음 중 '대화중이신것 같아요' 팝업 안 뜹니다 * \[FIXED] 공유 링크 공개 모드가 비밀번호에 맞게 동작해요 * \[FIXED] 맞춤 문서 생성 중 탭 전환 시 하단 버튼 이름 업데이트 *** **Web** * \[NEW] 조직 페이지에서 멤버 온보딩이 새로 추가됐어요 * \[FIXED] 공유 링크가 비밀번호 설정에 따라 정확히 공개/비공개돼요 **Service Improvements** * \[FIXED] 공유 링크 URL이 변경되지 않고 안정적으로 유지돼요 * \[FIXED] Microsoft 캘린더 이벤트 시간이 올바르게 표시돼요 *** **Web** * \[NEW] 컨퍼런스 모드에서 한 문단을 고정해서 표시할 수 있는 옵션이 생겼어요 * \[NEW] 캘린더 연동 배너를 영구적으로 숨길 수 있어요 * \[NEW] 설정 창에 닫기(X) 버튼이 추가됐어요 * \[IMPROVED] 팝업과 토스트 닫기 버튼이 더 직관적으로 개선됐어요 * \[IMPROVED] 문단 호버 툴바 디자인과 동작이 더 부드러워졌어요 * \[FIXED] 노트 종료 후 요약 내용 깜빡임과 탭 전환 버그가 수정됐어요 * \[FIXED] 노트 페이지 들어갈 때 맞춤 문서 팝업이 자동 열리지 않아요 * \[FIXED] 복사 버튼 호버 메뉴가 마우스 움직임에 따라 제대로 닫혀요 **Service Improvements** * \[IMPROVED] AI 응답과 서비스 처리가 더 안정적이고 빨라졌어요 * \[FIXED] 노트 초대 시 모든 이메일 주소가 제대로 처리돼요 *** **Web** * \[NEW] 컨퍼런스 모드에서 디스플레이 모드를 설정할 수 있어요 * \[NEW] Ask Tiro 입력 시 기본 멘션이 자동으로 삽입돼요 * \[NEW] Ask Tiro 인용 버튼에 팝오버 기능이 추가됐어요 * \[IMPROVED] 컨퍼런스 모드 텍스트 색상이 더 잘 보이게 개선됐어요 **Service Improvements** * \[NEW] 노트 요약 생성이 시작되면 바로 상태 메시지가 표시돼요 * \[FIXED] 캘린더 연결 인증 과정이 더 안정적으로 작동해요 *** **Web** * \[NEW] 노트를 열 때 사람 태그와 폴더명이 즉시 표시돼요 * \[NEW] 로그인 화면에 개인정보처리방침 동의 체크박스가 추가됐어요 * \[NEW] 결제 갱신일에 시간이 함께 표시돼요 * \[NEW] 화상미팅 모드에서 언어 설정이 항상 표시돼요 * \[IMPROVED] 음성 재생바 위치가 타임스탬프와 문단 사이로 이동해 더 직관적이에요 * \[IMPROVED] 노트 텍스트 애니메이션이 제거돼 읽기가 더 부드러워졌어요 * \[FIXED] 노트 탭 상태가 초기화되지 않고 유지돼요 * \[FIXED] 미리보기에서 전체 보기 전환 시 노트 목록이 불필요하게 새로고침되지 않아요 * \[FIXED] Ask Tiro 인용 클릭 시 하이라이트 시간이 정확히 맞아요 * \[FIXED] 번역 스크립트에서 스크롤이 두 개 생기는 문제가 해결됐어요 * \[FIXED] 개인정보처리방침 체크박스가 기본으로 선택돼 있어요 **Service Improvements** * \[IMPROVED] Google 캘린더 연동과 인증이 더 안정적으로 동작해요 * \[IMPROVED] Notion 검색이 타임아웃 없이 더 믿음직스러워졌어요 * \[IMPROVED] 결제 처리와 웹훅이 더 안정적이에요 * \[FIXED] 구독 관리 페이지에서 오류가 더 적절하게 처리돼요 *** **Web** * \[FIXED] 로그인 토큰이 만료됐을 때 아무 반응 없이 멈추던 문제가 해결됐어요 **Service Improvements** * \[FIXED] 초대 코드 생성과 사용이 더 안정적으로 이뤄져요 *** **Web** * \[NEW] Notion 데이터베이스에 노트를 내보낼 수 있어요 * \[FIXED] 일본어 단어장 표기란에 영어 입력이 가능해졌어요 **Desktop App 3.15.5** * \[NEW] Notion 데이터베이스에 노트를 내보낼 수 있어요 * \[FIXED] 일본어 단어장 표기란에 영어 입력이 가능해졌어요 **Service Improvements** * \[FIXED] 이중 과금 문제를 해결해 결제가 더 안정적이에요 *** **Service Improvements** * \[NEW] Notion 데이터베이스에 페이지를 직접 생성할 수 있어요 * \[IMPROVED] 번역, 정제, 병합 기능의 AI 품질이 더 좋아졌어요 *** **Web** * \[NEW] 노트 검색에서 키워드가 하이라이트되고 정확한 위치로 스크롤돼요 * \[NEW] 노트 문단을 여러 개 선택해 한 번에 삭제할 수 있어요 * \[IMPROVED] 맞춤문서 탭 삭제 버튼이 더 직관적으로 개선됐어요 * \[FIXED] 오프라인 녹음이나 파일 업로드 시 언어 설정이 제대로 유지돼요 * \[FIXED] 녹음 중 새 노트를 시작할 때 이전 노트가 다시 열리지 않아요 * \[FIXED] Ask Tiro 출처 클릭 시 미리보기가 제대로 표시돼요 * \[FIXED] 파일 교체 시 노트 제목이 새 파일명으로 바로 업데이트돼요 * \[FIXED] 작은 화면에서도 캘린더 일정이 깔끔하게 보여요 * \[FIXED] 음성 파일 업로드 진행바 색상이 정상적으로 표시돼요 * \[FIXED] 공유 페이지에서 발생하던 크래시가 수정됐어요 * \[FIXED] '\~' 문자가 취소선으로 잘못 표시되지 않아요 **Desktop App 3.15.4** * \[IMPROVED] 맞춤문서 탭 삭제 버튼이 더 직관적으로 개선됐어요 * \[FIXED] 오프라인 녹음이나 파일 업로드 시 언어 설정이 제대로 유지돼요 * \[FIXED] 녹음 중 새 노트를 시작할 때 이전 노트가 다시 열리지 않아요 * \[FIXED] Ask Tiro 출처 클릭 시 미리보기가 제대로 표시돼요 * \[FIXED] 마이크 감지 팝업 클릭 시 창이 오른쪽에 제대로 도킹돼요 * \[FIXED] 파일 교체 시 노트 제목이 새 파일명으로 바로 업데이트돼요 * \[FIXED] 작은 화면에서도 캘린더 일정이 깔끔하게 보여요 * \[FIXED] 음성 파일 업로드 진행바 색상이 정상적으로 표시돼요 * \[FIXED] 알림 창 팝업 레이아웃이 정상화됐어요 * \[FIXED] 추천 링크 가입자에게 무료 체험 UI가 표시돼요 * \[FIXED] '\~' 문자가 취소선으로 잘못 표시되지 않아요 **Service Improvements** * \[NEW] 노트와 문단을 한 번에 여러 개 삭제할 수 있어요 *** **Service Improvements** * \[IMPROVED] Ask Tiro 채팅에서 메시지 순서가 올바르게 표시되고 응답이 더 좋아졌어요 * \[FIXED] 단어장 파일 업로드 시 100개 초과 단어도 정확히 추출돼요 * \[FIXED] 노트 목록과 노트 페이지에서 폴더 추가 권한이 일관되게 동작해요 * \[FIXED] 기본 폴더에서 하위 폴더를 안정적으로 만들 수 있어요 * \[FIXED] Microsoft 캘린더 연결이 더 원활해졌어요 *** **Web** * \[FIXED] 레퍼럴로 가입한 사용자에게 무료 체험 UI가 이제 정상적으로 표시돼요 * \[FIXED] '\~' 문자가 취소선으로 바뀌는 문제가 해결됐어요 **Desktop App** * \[FIXED] 레퍼럴로 가입한 사용자에게 무료 체험 UI가 이제 정상적으로 표시돼요 * \[FIXED] '\~' 문자가 취소선으로 바뀌는 문제가 해결됐어요 *** **Web** * \[NEW] 노트를 이메일로 간편하게 내보낼 수 있어요 * \[FIXED] 구독 취소 대기 상태가 제대로 표시돼요 * \[FIXED] Ask Tiro 응답이 완료 후에도 사라지지 않아요 **Desktop App 3.15.3** * \[NEW] 노트를 이메일로 간편하게 내보낼 수 있어요 * \[NEW] 인터넷 연결이 끊어지면 알려줘요 * \[NEW] 새 노트 생성 후 바로 페이지가 열어요 * \[NEW] .mov 파일도 드래그해서 업로드할 수 있어요 * \[IMPROVED] 언어 설정에 따라 실시간 번역이 자동으로 켜져요 * \[IMPROVED] 구독 만료 시 노트 생성을 막고 명확히 안내해요 * \[FIXED] 구독 취소 대기 상태가 제대로 표시돼요 * \[FIXED] Ask Tiro 응답이 완료 후에도 사라지지 않아요 * \[FIXED] 노트 제목 수정, 삭제, 폴더 변경 후 목록이 제대로 업데이트돼요 * \[FIXED] Slack 트리거 저장 버튼이 정상 작동해요 * \[FIXED] 녹음 중지 시 화면 깜빡임이 사라졌어요 * \[FIXED] 새 노트 생성 시 언어 설정이 올바르게 적용돼요 * \[FIXED] 크레딧 60분 미만이어도 녹음 시작이 가능해요 **Service Improvements** * \[NEW] 이메일에 일본어 지원이 추가됐어요 * \[IMPROVED] 노트 요약과 문서 생성이 더 자연스럽고 정확해졌어요 * \[IMPROVED] 최대 1GB 큰 파일 업로드가 가능하고 에러 메시지가 좋아졌어요 *** **Web** * \[NEW] 드래그 앤 드롭으로 .mov 파일도 업로드할 수 있어요 * \[NEW] 검색 모달에서 여러 범위를 한 번에 검색하고 바꿀 수 있으며 UI가 더 좋아졌어요 * \[NEW] 구독 만료 시 노트 생성 실패를 명확한 알림으로 알려줘요 * \[IMPROVED] 언어 설정에 따라 실시간 번역이 자동으로 켜져요 * \[FIXED] 크레딧 60분 미만이어도 녹음이 시작돼요 * \[FIXED] 새 노트 생성 시 언어 설정이 제대로 적용돼요 * \[FIXED] 녹음 중지 시 화면 깜빡임이 사라졌어요 **Desktop App** * \[NEW] 드래그 앤 드롭으로 .mov 파일도 업로드할 수 있어요 * \[NEW] 구독 만료 시 노트 생성 실패를 명확한 알림으로 알려줘요 * \[IMPROVED] 언어 설정에 따라 실시간 번역이 자동으로 켜져요 * \[FIXED] 크레딧 60분 미만이어도 녹음이 시작돼요 * \[FIXED] 새 노트 생성 시 언어 설정이 제대로 적용돼요 * \[FIXED] 녹음 중지 시 화면 깜빡임이 사라졌어요 **Service Improvements** * \[FIXED] 개인 플랜 녹음 초과 요금이 정확히 적용돼요 *** **Service Improvements** * \[NEW] 대화 언어와 기록 언어가 다르면 실시간 번역이 자동으로 시작돼요 * \[FIXED] 영어로 기록할 때 구두점이 올바르게 표시돼요 *** **Service Improvements** * \[FIXED] 구독 이전 시 구독 상태가 정확하게 유지돼요 *** **Service Improvements** * \[NEW] 폴더 설명(맥락)이 AI 컨텍스트에 포함되어 Ask Tiro나 요약 결과가 더 정확해졌어요 * \[NEW] 번역 시 노트 컨텍스트를 적용해 더 자연스럽고 적합한 결과를 제공해요 * \[IMPROVED] Ask Tiro 검색에서 단락 추출을 늘리고 최적화해 더 풍부한 결과를 빠르게 보여줘요 * \[FIXED] 맥락 과적합 문제를 개선해 AI 응답이 더 안정적이고 균형 있게 나와요 *** **Web** * \[NEW] 커스텀 템플릿을 CSV 파일로 업로드할 수 있어요 * \[NEW] 팀 멤버 초대 시 역할을 지정할 수 있어요 * \[NEW] 이메일 로그인 옵션을 토글로 숨길 수 있어요 * \[FIXED] 설정 다이얼로그 축소 시 UI 깨짐이 수정됐어요 * \[FIXED] 서버에서 기록 종료 시 재개 버튼이 비활성화돼요 * \[FIXED] 영어 캘린더 해제 UI가 개선됐어요 **Desktop App 3.15.2** * \[NEW] 딥링크로 백그라운드에서 기록을 시작할 수 있어요 * \[NEW] 커스텀 템플릿을 CSV 파일로 업로드할 수 있어요 * \[NEW] 팀 멤버 초대 시 역할을 지정할 수 있어요 * \[NEW] 이메일 로그인 옵션을 토글로 숨길 수 있어요 * \[IMPROVED] 오프라인 기록 UX가 개선됐어요 * \[FIXED] 자동화 설정 창 오류가 해결됐어요 * \[FIXED] 설정 다이얼로그 축소 시 UI 깨짐이 수정됐어요 * \[FIXED] 캘린더 팝업 열 때 앱 종료 문제가 해결됐어요 * \[FIXED] 서버에서 기록 종료 시 재개 버튼이 비활성화돼요 * \[FIXED] 노트 내 '모든 템플릿 보기' 오류가 해결됐어요 * \[FIXED] 데스크탑 앱 창 크기가 원래대로 복구됐어요 * \[FIXED] 영어 캘린더 해제 UI가 개선됐어요 **Service Improvements** * \[FIXED] 노트 목록 로딩 시 페이징 커서 오류가 수정됐어요 * \[FIXED] RevenueCat 마이그레이션 구독 결제 이벤트 처리가 안정화됐어요 * \[FIXED] HubSpot 미팅 종료 시간 로직이 개선됐어요 * \[IMPROVED] HubSpot 미팅 로그 상태가 정확히 설정돼요 *** **Web** * \[NEW] 커스텀 템플릿을 CSV 파일로 쉽게 업로드할 수 있어요 * \[NEW] 팀 멤버 초대할 때 역할을 바로 지정할 수 있어요 * \[IMPROVED] 오프라인 기록이 더 편리해졌어요 * \[FIXED] 설정 창이 작은 화면에서도 깨지지 않아요 * \[FIXED] 서버 연결이 끊어지면 재개 버튼이 자동으로 꺼져요 * \[FIXED] 영어 캘린더 설정이 제대로 표시돼요 *** **Service Improvements** * \[FIXED] 노트 목록을 끝까지 볼 때 더 부드럽게 로드돼요 * \[FIXED] 구독 변경이 즉시 반영돼요 *** **Web** * \[NEW] 커스텀 템플릿을 CSV 파일로 쉽게 업로드할 수 있어요 * \[NEW] 팀 멤버 초대할 때 역할을 바로 지정할 수 있어요 * \[IMPROVED] 작은 화면에서도 설정 창이 깨지지 않고 잘 보여요 * \[FIXED] 서버 연결이 끊어지면 재개 버튼이 자동으로 비활성화돼요 **Desktop App** * \[IMPROVED] 작은 화면에서도 설정 창이 깨지지 않고 잘 보여요 * \[FIXED] 서버 연결이 끊어지면 재개 버튼이 자동으로 비활성화돼요 *** **Service Improvements** * \[FIXED] 한글과 다른 언어가 섞인 기록의 요약이 정확해졌어요 * \[IMPROVED] 번역 품질이 노트 맥락을 반영해 더 좋아졌어요 * \[FIXED] 한글 기록에서 다른 언어로 잘못 요약되는 문제가 해결됐어요 *** **Service Improvements** * \[FIXED] 중국어 음성 인식이 더 정확하게 작동해요 *** **Service Improvements** * \[IMPROVED] 서비스 안정성이 개선됐어요 *** **Service Improvements** * \[FIXED] 결제 전환 시 구독 만료 문제가 해결됐어요 * \[FIXED] 캘린더 연결 시 토큰 문제가 수정됐어요 * \[FIXED] 플랜 변경 시 취소 상태 구독 처리가 안정화됐어요 * \[IMPROVED] 노트 생성 시 구독 상태가 더 정확히 확인돼요 *** **Service Improvements** * \[FIXED] 결제 내역 처리가 더 안정적으로 동작해요 *** **Service Improvements** * \[IMPROVED] AI 응답 안정성이 개선됐어요 * \[FIXED] 결제 관련 처리가 안정화됐어요 * \[FIXED] 구글 캘린더 동기화 오류가 해결됐어요 * \[NEW] 만료된 노트가 자동으로 정리돼요 * \[FIXED] 결제 취소 및 청구 문제 처리가 개선됐어요 * \[FIXED] 조직 멤버 추가 시 발생하던 오류가 수정됐어요 *** **Web v260126-1** * \[NEW] 폴더 생성 시 자동화를 바로 지정할 수 있어요 * \[NEW] 노트 폴더 선택 시 하위 폴더가 트리 구조로 표시돼요 * \[IMPROVED] 폴더 자동화에서 Slack 연동 자동화로 넘어가는 경험이 개선됐어요 * \[FIXED] 공유된 개인 폴더에서 Editor 권한으로 노트를 추가할 수 있어요 * \[FIXED] 문서 삭제 시 상태가 올바르게 초기화돼요 **Web v260126-2** * \[FIXED] 조직 멤버 구성원 조회 시 더 많은 멤버를 불러올 수 있어요 **Desktop App 3.15.0** * \[NEW] 딥링크로 노트 녹음을 시작할 수 있어요 (Xenia 통합) * \[NEW] 폴더 생성 시 자동화를 바로 지정할 수 있어요 * \[NEW] 노트 폴더 선택 시 하위 폴더가 트리 구조로 표시돼요 * \[IMPROVED] 폴더 자동화에서 Slack 연동 자동화로 넘어가는 경험이 개선됐어요 * \[IMPROVED] 실시간 번역이 부분적으로 표시돼요 * \[IMPROVED] 파일에서 단어장 추출 시 audio/mpeg 타입도 지원해요 * \[FIXED] 공유된 개인 폴더에서 Editor 권한으로 노트를 추가할 수 있어요 * \[FIXED] 문서 삭제 시 상태가 올바르게 초기화돼요 * \[FIXED] 설정창에서 새로고침 시 설정창이 유지돼요 * \[FIXED] 슬랙 자동화 트리거에서 언어 관련 오류가 수정됐어요 * \[FIXED] 컨텍스트 파일 업로드 시 파일 사이즈 오류 안내가 개선됐어요 **Mobile App codepush-v123-android (2.1.13) / codepush-v103-ios (2.1.10)** * \[FIXED] 간헐적으로 로그아웃되는 오류가 해결됐어요 *** **Web v260123-1** * \[NEW] 아직 확정되지 않은 실시간 자막이 서서히 사라지며 표시돼요 * \[FIXED] 슬랙 자동화 트리거에서 언어 관련 오류가 수정됐어요 **Web v260123-2** * \[IMPROVED] 익명 공유용 스트리밍 링크에서 목록 돌아가기 버튼이 숨겨져요 **Service Improvements** * \[NEW] Ask Tiro 응답이 스트리밍 방식으로 더 빠르게 표시돼요 * \[IMPROVED] 음성 파일에서 단어장 추출 시 mpeg 타입을 지원해요 * \[IMPROVED] 일본어 실시간 STT의 성능이 크게 개선되었어요 * \[IMPROVED] 문서 생성 프롬프트의 볼드체/따옴표 렌더링이 개선됐어요 *** **Web v260122-1** * \[NEW] Ask Tiro에서 노트와 폴더를 멘션할 수 있어요 * \[NEW] 조직 관리 페이지가 추가됐어요 * \[NEW] 빈 폴더에 안내 메시지가 표시돼요 * \[IMPROVED] 도움말 센터 링크가 사용자 언어에 맞게 연결돼요 **Web v260122-2** * \[IMPROVED] Calendar 연동이 제대로 되지 않았을 경우 안내 UI가 개선됐어요 **Service Improvements** * \[NEW] Org Admin이 팀 정보를 수정할 수 있어요 * \[NEW] 조직 관리자가 팀 멤버를 다른 팀으로 이동할 수 있어요 * \[IMPROVED] 메시지 처리 성능이 개선됐어요 * \[FIXED] 조직 관리 페이지의 일부 오류가 수정됐어요 * \[FIXED] App Store 구독 이벤트 처리가 개선됐어요 *** **Web v260118-1** - \[NEW] Ask Tiro 검색 중 원하는 시점에 중단할 수 있어요 - \[IMPROVED] Ask Tiro 응답이 실시간으로 표시되어 더 빠르게 느껴져요 - \[IMPROVED] 노트 검색과 전체 검색이 하나로 통합되어 더 편리해졌어요 *** **Web v260112-1** * \[NEW] Slack 연동과 자동화를 설정할 수 있는 UI가 직관적으로 개선됐어요 * \[IMPROVED] 마지막으로 기록한 언어가 기본 대화 언어 설정으로 즉시 업데이트돼요 * \[IMPROVED] 팀 플랜에서 팀원들의 사용량을 쉽게 조회할 수 있어요 * \[IMPROVED] 팀 멤버 변경 이후 팀 시트 수가 즉시 반영돼요 * \[IMPROVED] 대화 참석자 관리 UI가 개선됐어요 * \[IMPROVED] 팀 멤버 역할이 추가됐어요 * \[IMPROVED] 인앱 결제 유저가 계정을 삭제할 때, 모바일 앱에서 안전하게 구독을 취소할 수 있도록 안내해요 **Desktop App 3.14.2** * \[NEW] Slack 연동과 자동화를 설정할 수 있는 UI가 직관적으로 개선됐어요 * \[IMPROVED] 외부 툴 연동 후에 상태가 업데이트되지 않았던 문제가 해결되었어요 * \[IMPROVED] Mac 메뉴바 아이콘 색상이 사용자 배경화면에 맞춰서 변경돼요 * \[IMPROVED] 마지막으로 기록한 언어가 기본 대화 언어 설정으로 즉시 업데이트돼요 * \[IMPROVED] 대화 기록 버튼을 누르면 딜레이없이 즉시 기록이 시작돼요 * \[IMPROVED] 대화 참석자 관리 UI가 개선됐어요 * \[IMPROVED] 사용량 조회 API가 추가됐어요 * \[IMPROVED] 팀 멤버 역할이 추가됐어요 * \[IMPROVED] 인앱 결제 유저가 계정을 삭제할 때, 모바일 앱에서 안전하게 구독을 취소할 수 있도록 안내해요 *** **Mobile App codepush-v99-ios (2.1.9) / codepush-v119-android (2.1.12)** * \[IMPROVED] 오프라인 기록 넛지 툴팁이 제거됐어요 *** **Mobile App codepush-v117-android (2.1.12) / codepush-v97-ios (2.1.9)** * \[IMPROVED] 계정 삭제 팝업이 추가됐어요 * \[IMPROVED] 인앱 결제 유저가 계정을 삭제할 때, 모바일 앱에서 안전하게 구독을 취소할 수 있도록 안내해요 **Mobile App codepush-v118-android (2.1.12) / codepush-v98-ios (2.1.9)** * \[NEW] 폴더 내에서 실시간 기록, 오프라인 기록, 파일 업로드로 노트를 생성할 수 있어요 **Service Improvements** * \[NEW] External Folder API에 cursor 기반 pagination이 추가됐어요 * \[NEW] External DTO에 note webUrl이 추가됐어요 * \[IMPROVED] Ask Tiro 전체 노트 검색이 최적화됐어요 *** **Mobile App codepush-v116-android (2.1.12)** - \[FIXED] 안드로이드 시스템 네비게이션 바에 AskTiro input이 가려지는 이슈가 해결됐어요 *** **Mobile App codepush-v115-android (2.1.12) / codepush-v96-ios (2.1.9)** - \[FIXED] 유저 정보 조회 실패 시 터치가 안 되는 오류가 제거됐어요 - \[IMPROVED] 유저 정보가 없을 시 로그인 페이지로 이동하는 토스트가 추가됐어요 *** **Desktop App 3.14.0** * \[NEW] 이제 티로가 마지막으로 방문한 폴더를 기억해요 * \[NEW] 딥링크로 실시간 대화 기록을 시작할 수 있어요 * \[NEW] 일본어, 중국어 등 발음-표기가 구분되어야 하는 단어장 기능이 모든 로케일에 오픈됐어요 * \[IMPROVED] 폴더 자동화 및 Slack 자동화 UI가 개선됐어요 * \[IMPROVED] Automation 경험이 개선됐어요 * \[IMPROVED] 메인 윈도우 크기가 조정(확대)됐어요 * \[IMPROVED] 팀 나가기 버튼 크기가 줄어들고 색깔이 명료해졌어요 * \[IMPROVED] 모바일에서 직접 결제한 유저가 플랜 변경시 친절한 가이드 링크로 안내해요 * \[FIXED] 노트 내보내기 시 timestamp가 잘못 표시되는 문제가 수정됐어요 * \[FIXED] 실시간 노트에서 오디오 설정 버튼이 항상 노출되도록 수정됐어요 * \[FIXED] 간헐적으로 발생하는 문서 생성 버튼 무한 로딩 오류가 해결됐어요 **Web 260105-1** * \[NEW] 마지막으로 방문한 폴더를 기억해요 * \[IMPROVED] 팀 나가기 버튼 크기가 줄어들고 색깔이 명료해졌어요 * \[IMPROVED] Automation 경험이 개선됐어요 **Web 260105-2** * \[NEW] 데스크탑 앱 3.14.0 다운로드 링크가 업데이트됐어요 **Service Improvements** * \[NEW] Admin이 Team의 결제방식을 변경할 수 있게 됐어요 * \[NEW] Admin이 User nickname을 변경할 수 있어요. * \[NEW] GPT-5.2 지원이 추가되었어요 *** **Desktop App & Web** * \[NEW] 일본어, 중국어 등 발음-표기가 구분되어야 하는 단어장 기능이 모든 로케일에 오픈됐어요 * \[IMPROVED] 폴더 자동화 및 Slack 자동화 UI가 개선됐어요요 * \[FIXED] 노트 내보내기 시 timestamp가 잘못 표시되는 문제가 수정됐어요 **Service Improvements** * \[IMPROVED] 번역 파일이 업데이트됐어요 *** **Service Improvements** - \[NEW] Operation Admin이 Team 생성 시 초기 멤버 없이 생성 가능하도록 개선됐어요 - \[IMPROVED] MODIFY\_TRANSCRIPT\_CHUNKS의 lock duration이 증가되어 성능이 향상됐어요 *** **Web** - \[FIXED] Ask Tiro 인용 프리뷰 시 HTML 태그 노출이 수정됐어요 - \[FIXED] welcome modal 플랜명 변경이 대응됐어요 - \[FIXED] PageLeaveWarningDialog에 크레딧 파라미터가 추가됐어요 *** **Web** * \[NEW] 연말 선물로 소중한 분들에게 티로 크레딧을 선물할 수 있는 기능이 추가됐어요 * \[NEW] 폴더 자동화 기능이 추가됐어요 * \[NEW] Slack 자동화 기능이 추가됐어요 * \[NEW] 팀 설명을 관리할 수 있는 기능이 추가됐어요 * \[NEW] 실시간 노트 생성 시, 기존에 기록한 노트의 언어 설정이 없다면 사용자 언어 설정을 반영해요 * \[NEW] 앱 다운로드 안내가 추가됐어요 * \[FIXED] 팀 나가기 후 상태가 올바르게 갱신돼요 * \[FIXED] 문서 생성 버튼의 무한 로딩 문제가 해결됐어요 * \[FIXED] Gift 페이지에서 로케일 자동감지 로직이 수정됐어요 **Mobile App 2.1.12 (Android) / 2.1.9 (iOS)** * \[NEW] 선물하기 딥링크를 지원해요 * \[FIXED] 알림 서비스 연동이 개선됐어요 *** **Service Improvements** - \[NEW] 공개 폴더 API가 추가됐어요 - \[NEW] 사용량 통계 API가 추가됐어요 - \[IMPROVED] 자동화 시스템의 안정성이 개선됐어요 - \[IMPROVED] 긴 스크립트의 문서 생성 안정성이 개선됐어요 - \[IMPROVED] 다국어 화자 분리 및 마스킹 처리가 최적화됐어요 - \[FIXED] 구독 갱신 처리가 개선됐어요 *** **Web** * \[FIXED] 계정 탈퇴 모달 디자인이 개선됐어요 * \[FIXED] 팀 나가기 오류가 수정됐어요 * \[IMPROVED] 플랜 변경 시 안내 링크가 다국어로 제공돼요 **Mobile App 2.1.10 (Android) / 2.1.7 (iOS)** * \[IMPROVED] 온보딩 페이월 페이지가 개선됐어요 * \[IMPROVED] 안드로이드에서 플랜 및 구독 관리가 더 편리해졌어요 **Service Improvements** * \[NEW] 팀 설명 관리 기능이 추가됐어요 * \[NEW] 미터링 과금 유연 모드가 적용됐어요 * \[IMPROVED] STT 공급자 자동 재연결 로직이 전체 사용자에게 적용됐어요 *** **Web** * \[NEW] 영어 글로벌 랜딩 페이지가 오픈됐어요 * \[NEW] 마이크 입력 강도를 조절할 수 있어요 * \[IMPROVED] 노트 목록의 접근성과 성능이 개선됐어요 * \[IMPROVED] 모바일에서 랜딩 페이지 헤더가 더 직관적이에요 * \[IMPROVED] 스크립트 번역문 복사가 더 편리해졌어요 * \[IMPROVED] 공유 페이지 문구가 더 명확해졌어요 * \[FIXED] 보안이 강화됐어요 **Desktop App 3.13.3** * \[NEW] 마이크 입력 강도를 조절할 수 있어요 * \[NEW] 폴더에 자동화 설정을 적용할 수 있어요 * \[IMPROVED] 스크립트 번역문 복사가 더 편리해졌어요 * \[IMPROVED] 무료체험 종료 안내가 더 명확해졌어요 * \[IMPROVED] 만료된 팀 플랜에서 개인 구독 전환 시 안내가 개선됐어요 * \[IMPROVED] 전체 화면에서도 알림이 표시돼요 * \[FIXED] Windows에서 플랜 관리 화면의 한글이 올바르게 표시돼요 * \[FIXED] 대화 자동 감지 설정이 올바르게 적용돼요 * \[FIXED] 지원하지 않는 언어 설정 시 오류가 해결됐어요 **Service Improvements** * \[NEW] [Tiro Platform](https://platform.tiro.ooo)이 공개됐어요 * \[IMPROVED] 실시간 언어 감지가 더 정확해졌어요 * \[IMPROVED] 화자분리 정확도가 향상됐어요 * \[IMPROVED] Organization 구독 처리가 더 안정적이에요 * \[IMPROVED] 이메일 알림 시스템이 개선됐어요 * \[FIXED] API Key 만료 날짜가 올바르게 저장돼요 *** **Desktop App 3.13.2** * \[NEW] 녹음 중에도 오디오 입력 장치를 변경할 수 있어요 * \[IMPROVED] 크레딧 잔액 표시가 더 정확해졌어요 * \[FIXED] 플랜 설정 페이지가 올바르게 표시돼요 * \[FIXED] 다국어 기록 모드의 언어 설정이 올바르게 유지돼요 * \[FIXED] 노트 클릭 시 한 페이지 문서 탭이 올바르게 표시돼요 **Mobile App 2.1.9 (Android)** * \[NEW] 회원가입 전 티로를 미리 경험할 수 있는 온보딩이 추가됐어요 * \[IMPROVED] 가입 후 크레딧 지급 안내가 더 명확해졌어요 * \[FIXED] 로그아웃 후 앱이 안정적으로 작동해요 **Mobile App 2.1.6 (iOS)** * \[NEW] Microsoft 계정으로 로그인할 수 있어요 * \[NEW] 회원가입 전 티로를 미리 경험할 수 있는 온보딩이 추가됐어요 * \[NEW] 친구 초대 링크가 더 안정적으로 작동해요 * \[IMPROVED] 앱 보안이 강화됐어요 * \[IMPROVED] 가입 후 크레딧 지급 안내가 더 명확해졌어요 * \[IMPROVED] 전화나 다른 미디어 재생 시 알림이 더 명확해졌어요 * \[FIXED] 로그아웃 후 앱이 안정적으로 작동해요 **Service Improvements** * \[NEW] Organization 관리 기능이 추가됐어요 (Enterprise) * \[NEW] Enterprise 환경을 위한 SSO 기능이 추가됐어요 * \[IMPROVED] Organization 멤버 관리가 개선됐어요 * \[IMPROVED] 음성 인식 종료 시 응답이 더 빨라졌어요 *** **Web** * \[NEW] 녹음 중에도 오디오 입력 장치를 변경할 수 있어요 * \[IMPROVED] 모바일 환경에서 로그인 화면이 개선됐어요 * \[IMPROVED] 공유 페이지에서 앱 다운로드 링크를 확인할 수 있어요 * \[FIXED] 플랜 설정 페이지가 올바르게 표시돼요 **Service Improvements** * \[NEW] Organization과 Team을 연결할 수 있어요 (Enterprise) * \[IMPROVED] Organization 멤버 관리가 더 안정적이에요 * \[IMPROVED] 노트 내 개인정보 보호가 강화됐어요 *** **Web** * \[NEW] 글로벌 랜딩 페이지가 추가됐어요 * \[IMPROVED] 크레딧 잔액 확인 로직과 다국어 처리가 개선됐어요 * \[IMPROVED] 요약과 문서를 가져오는 로직이 통합되어 개선됐어요 * \[FIXED] 다국어 기록 모드에서 언어 설정이 저장되지 않는 문제가 해결됐어요 **Service Improvements** * \[NEW] 관리자용 Organization 구독 API가 추가됐어요 * \[NEW] Organization과 Team 멤버 동기화 기능이 추가됐어요 * \[FIXED] 크레딧 차감 로직의 일부 오류가 수정됐어요 * \[FIXED] 개별 플랜 결제 시 대기 중인 팀 멤버도 허용되도록 수정됐어요 *** **Mobile App 2.1.8 (Android)** * \[FIXED] 암호화 토큰 로딩으로 인한 노트 생성 지연이 해결됐어요 **Service Improvements** * \[NEW] Organization 멤버 관리 기능이 추가되고 Team과 연동됐어요 * \[NEW] Organization을 구독 소유자로 설정할 수 있어요 * \[NEW] 구독 만료 시 알림 이벤트가 발행돼요 * \[IMPROVED] Team 구독 처리 로직이 간소화됐어요 * \[FIXED] Team 결제 상태가 대기 중일 때의 처리가 수정됐어요 *** **Web** * \[FIXED] 노트 클릭 시 한 페이지 문서 탭이 간헐적으로 활성화되지 않던 문제가 해결됐어요 * \[FIXED] 크레딧 잔액 계산 로직이 수정됐어요 **Mobile App 2.1.8 / 2.1.9 (Android)** * \[NEW] Microsoft 로그인을 지원해요 * \[NEW] 딥링크 레퍼럴 기능이 추가됐어요 *** **Web** * \[NEW] Automation Trigger 기능이 추가됐어요 * \[FIXED] 대화 참석자 설정에서 이메일을 필수로 입력하지 않아도 돼요 * \[FIXED] 폴더 내에서도 캘린더 이벤트로 노트를 생성할 수 있어요 **Desktop App 3.13.1** * \[NEW] Automation Trigger 기능이 추가됐어요 * \[FIXED] 플랜 세팅 페이지 오류가 수정됐어요 * \[FIXED] 대화 참석자 설정에서 이메일을 필수로 입력하지 않아도 돼요 * \[FIXED] 폴더 내에서도 캘린더 이벤트로 노트를 생성할 수 있어요 **Mobile App 2.1.8 (Android)** * \[FIXED] 한 페이지 문서 포맷 깨짐이 해결됐어요 * \[FIXED] 오디오 간섭 안내 문구가 개선됐어요 **Mobile App 2.1.6 (iOS)** * \[FIXED] 오디오 간섭 안내 문구가 개선됐어요 **Service Improvements** * \[IMPROVED] 일본어 실시간 STT 성능이 개선됐어요 * \[FIXED] iOS 구독 / 결제 관련 간헐적으로 발생하던 문제가 해결됐어요. *** **Mobile App 2.1.8 (Android)** - \[FIXED] 한 페이지 문서 포맷 깨짐이 해결됐어요 *** **Service Improvements** - \[FIXED] 일본어 번역 시 가끔 일본어가 나오는 문제가 해결됐어요 *** **Service Improvements** - \[NEW] MCP 문서화가 완료됐어요 - \[NEW] External API의 성능 개선이 이루어졌어요 - \[NEW] Organization CRUD API 및 관리 기능이 구현됐어요 - \[NEW] Note External API 응답에 webUrl 필드가 추가됐어요 *** **Mobile App 2.1.7 (Android) / 2.1.5 (iOS)** - \[IMPROVED] 회원가입부터 활성화까지의 온보딩 경험이 개선됐어요 - \[IMPROVED] 10분 녹음 넛지 툴팁이 재활성화됐어요 - \[IMPROVED] 플랜명이 변경됐어요 *** **Web** * \[NEW] 노트 요약 템플릿을 즐겨찾기하고 편리하게 사용할 수 있어요 * \[NEW] 스웨덴어로 회의를 기록할 수 있어요 * \[NEW] 일본어 단어장 기능이 추가됐어요 * \[IMPROVED] 화자를 지정할 때 기본으로 '전체 영역에 적용'이 선택돼요 * \[IMPROVED] 대화 언어 선택 드롭다운에서 스크롤로 편리하게 언어를 찾을 수 있어요 * \[IMPROVED] 플랜 이름이 변경됐어요 (Starter → Pro, Business → Max) * \[IMPROVED] 노트 공유 설정 체크박스가 항상 표시돼요 * \[FIXED] 노트에서 Ask Tiro를 사용할 때 내용이 올바르게 표시돼요 * \[FIXED] Notion 공유 시 중복 항목이 제거되고 더 편리해졌어요 * \[FIXED] 번역된 문단이 생성될 때 깜빡이는 현상이 해결됐어요 * \[FIXED] 연결된 세부 캘린더가 없어도 캘린더 설정을 열 수 있어요 **Desktop App 3.13.0** * \[NEW] 노트 요약 템플릿을 즐겨찾기하고 편리하게 사용할 수 있어요 * \[NEW] 스웨덴어로 회의를 기록할 수 있어요 * \[NEW] 일본어 단어장 기능이 추가됐어요 * \[IMPROVED] 화자를 지정할 때 기본으로 '전체 영역에 적용'이 선택돼요 * \[IMPROVED] 대화 언어 선택 드롭다운에서 스크롤로 편리하게 언어를 찾을 수 있어요 * \[IMPROVED] 플랜 이름이 변경됐어요 (Starter → Pro, Business → Max) * \[IMPROVED] 노트 공유 설정 체크박스가 항상 표시돼요 * \[FIXED] 노트에서 Ask Tiro를 사용할 때 내용이 올바르게 표시돼요 * \[FIXED] Notion 공유 시 중복 항목이 제거되고 더 편리해졌어요 * \[FIXED] 번역된 문단이 생성될 때 깜빡이는 현상이 해결됐어요 * \[FIXED] 연결된 세부 캘린더가 없어도 캘린더 설정을 열 수 있어요 * \[FIXED] 폴더 이동 후 검색 결과가 올바르게 유지돼요 * \[FIXED] 캘린더 이벤트에 제목이 없을 때도 안정적으로 표시돼요 * \[FIXED] 플랜 설정에서 팀 정보 보기 버튼이 올바르게 작동해요 * \[FIXED] 링크 복사 시 발생하던 오류가 수정됐어요 * \[FIXED] 기록 일시정지 후 자동 재개 기능이 개선됐어요 **Service Improvements** * \[IMPROVED] 노트 요약 템플릿 정렬이 최근 사용 순으로 개선됐어요 * \[IMPROVED] 연결 안정성이 향상됐어요 *** **Web** * \[NEW] 스웨덴어로 회의를 기록할 수 있어요 * \[NEW] 일본어 단어장 기능이 추가됐어요 * \[IMPROVED] 대화 언어 선택 드롭다운에서 스크롤로 편리하게 언어를 찾을 수 있어요 * \[FIXED] 연결된 세부 캘린더가 없어도 캘린더 설정을 열 수 있어요 * \[FIXED] 노트 제목을 편집할 수 있어요 * \[FIXED] Notion 공유 시 중복 항목이 제거되고 더 편리해졌어요 **Service Improvements** * \[IMPROVED] Notion 공유 시 하위 페이지로 문서가 생성돼요 * \[IMPROVED] Notion 페이지 검색 결과가 개선됐어요 *** **Mobile App** - \[IMPROVED] 앱 안정성이 개선됐어요 - \[IMPROVED] 오프라인 모드 버튼 디자인이 개선됐어요 *** **Service Improvements** - \[IMPROVED] 시스템 안정성이 개선됐어요 *** **Web** * \[FIXED] 특정 노트만 선택해서 링크 생성후, 링크를 복사 할때 간헐적으로 발생하던 오류가 수정됐어요 * \[FIXED] 웹이 백그라운드에 있거나 탭이 비활성화되었을 때, 네트워크가 불안정해서 연결이 끊어져도 자동으로 재연결되어 기록을 계속해요 * \[FIXED] 폴더 이동 후 검색 결과가 올바르게 유지돼요 * \[FIXED] 노트 목록페이지에서 캘린더 이벤트를 표시하는 로직을 개선했어요. **Desktop App 3.12.12** * \[FIXED] 특정 노트만 선택해서 링크 생성후, 링크를 복사 할때 간헐적으로 발생하던 오류가 수정됐어요 * \[FIXED] 앱이 백그라운드에 있을때, 네트워크가 불안정해서 연결이 끊어져도 자동으로 재연결되어 기록을 계속해요 * \[FIXED] 폴더 이동 후 검색 결과가 올바르게 유지돼요 * \[FIXED] 노트 목록페이지에서 캘린더 이벤트를 표시하는 로직을 개선했어요. *** **Mobile App 2.1.7 (iOS)** * \[IMPROVED] 무료 체험 사용량이 일정 이상이면 구독 안내가 표시돼요 * \[IMPROVED] 앱 안정성이 개선됐어요 **Service Improvements** * \[IMPROVED] 노트 조회 속도가 개선됐어요 *** **Mobile App 2.1.7 (Android) / 2.1.5 (iOS)** * \[IMPROVED] 앱 안정성이 개선됐어요 **Service Improvements** * \[NEW] 노트 요약 템플릿을 즐겨찾기할 수 있어요 * \[IMPROVED] 무료 체험 노트 시간 제한이 조정됐어요 * \[IMPROVED] Google 캘린더 연동이 더 안정적으로 작동해요 * \[IMPROVED] MCP 연동 인증 구현이 완료되었어요. 이제 곧 MCP가 공식 출시될 예정이에요. *** **Web** * \[IMPROVED] SLA 문서가 업데이트됐어요 **Mobile App 2.1.7 (Android)** * \[NEW] 사용자가 명시적으로 설정한 경우, 기록한 음성 파일을 다운로드할 수 있어요 **Service Improvements** * \[NEW] Apple 인앱결제를 지원해요 *** **Desktop App 3.12.11** * \[IMPROVED] Mac에서 앱이 Dock에 올바르게 표시되도록 개선했어요. * \[IMPROVED] 의도하지 않게 운영체제에 의해 기록이 중단되는 경우가 있어, 기록중에 앱을 최소화할 수 없도록 변경했어요. **Service Improvements** * \[IMPROVED] MCP 연동을 위한 인증을 구현했어요 *** **Web** * \[IMPROVED] Slack 공유 UI가 개선됐어요 - 공유할 콘텐츠를 선택하고 미리보기를 확인할 수 있어요 * \[IMPROVED] 공동작업자 초대 화면이 더 편리하게 개선됐어요 **Desktop App 3.12.10** * \[NEW] 오프라인 모드의 노트에서도 오디오 리플레이를 사용할 수 있어요 * \[NEW] 클립보드에서 붙여넣기로 파일을 업로드할 수 있어요 * \[NEW] 노트 목록에서 폴더를 검색할 수 있어요 * \[NEW] 노트 공유 시 원하는 콘텐츠만 선택해서 공유할 수 있어요 * \[NEW] 팀 이름을 수정할 수 있어요 * \[NEW] 폴더를 드래그 앤 드롭을 통해 다른 폴더 안으로 이동할 수 있어요 * \[IMPROVED] Slack 공유 UI가 개선됐어요 - 공유할 콘텐츠를 선택하고 미리보기를 확인할 수 있어요 * \[IMPROVED] 공동작업자 초대 화면이 더 편리하게 개선됐어요 * \[FIXED] 문서 생성 버튼이 올바르게 표시돼요 * \[FIXED] 팝업이 올바르게 표시돼요 * \[FIXED] 스크립트를 수정한 내용이 PDF/DOCX 내보내기에 올바르게 반영돼요 * \[FIXED] 구독 만료 후에도 크레딧을 정상적으로 사용할 수 있어요 **Service Improvements** * \[NEW] 음성 파일 업로드에서도 번역 기능을 사용할 수 있어요 *** **Web** - \[NEW] 노트 공유 시 원하는 콘텐츠만 선택해서 공유할 수 있어요 - \[NEW] 팀 이름을 수정할 수 있어요 - \[NEW] 폴더를 드래그 앤 드롭을 통해 다른 폴더 안으로 이동할 수 있어요 - \[FIXED] 스크립트를 수정한 내용이 PDF/DOCX 내보내기에 올바르게 반영돼요 - \[FIXED] 구독 만료 후에도 크레딧을 정상적으로 사용할 수 있어요 *** **Web** * \[NEW] 클립보드에서 붙여넣기로 파일을 업로드할 수 있어요 * \[NEW] 노트 목록에서 폴더를 검색할 수 있어요 * \[FIXED] 팝업이 올바르게 표시돼요 **Mobile App 2.1.4** * \[FIXED] 오프라인 녹음 종료 후 앱이 안정적으로 유지돼요 (iOS) **Service Improvements** * \[IMPROVED] 태국어, 중국어 등 결합 문자 언어의 텍스트가 올바르게 표시돼요 *** **Web** * \[NEW] 오프라인 모드의 노트에서도 오디오 리플레이를 사용할 수 있어요 * \[FIXED] 문서 생성 버튼이 올바르게 표시돼요 **Mobile App 2.1.6** * \[NEW] 폴더를 계층적으로 배치할 수 있어요 * \[NEW] 친구를 초대할 수 있는 레퍼럴 기능이 추가됐어요 * \[NEW] 잠금화면 위젯이 추가됐어요 (iOS) * \[NEW] SSO 로그인을 사용할 수 있어요 (iOS) * \[NEW] 녹음 중이거나 오프라인 모드에서도 오디오 리플레이를 사용할 수 있어요 (iOS) * \[NEW] 구독 안내 배너가 추가됐어요 (iOS) * \[IMPROVED] 노트 검색 속도가 향상됐어요 * \[FIXED] 계정 전환 시 초대 링크가 올바르게 작동해요 (Android) * \[FIXED] 위젯 배경이 올바르게 표시돼요 (iOS) **Service Improvements** * \[NEW] 스웨덴어를 베타로 지원해요 * \[NEW] 노트 공유 시 콘텐츠 노출 범위를 설정할 수 있어요 * \[IMPROVED] 이제 폴더가 알파벳 순으로 정렬돼요 * \[FIXED] 키워드 추출이 더 정확해졌어요 *** **Web** * \[NEW] 폴더 안에서도 캘린더 이벤트를 확인하고 바로 노트를 만들 수 있어요 * \[NEW] 폴더 안에서 새 노트를 만들면 해당 폴더에 자동으로 저장돼요 * \[IMPROVED] 업데이트 알림이 더 간결해졌어요 * \[IMPROVED] 노트 종료 이후에 문서 생성 버튼이 나타나요 * \[IMPROVED] 기록 시작/중지 버튼과 종료 버튼 디자인이 개선됐어요 * \[FIXED] 설정 팝업이 올바른 위치에 표시돼요 **Desktop App 3.12.9** * \[NEW] 폴더 안에서도 캘린더 이벤트를 확인하고 바로 노트를 만들 수 있어요 * \[NEW] 폴더 안에서 새 노트를 만들면 해당 폴더에 자동으로 저장돼요 * \[IMPROVED] 업데이트 알림이 더 간결해졌어요 * \[IMPROVED] 노트 종료 이후에 문서 생성 버튼이 나타나요 * \[IMPROVED] 기록 시작/중지 버튼과 종료 버튼 디자인이 개선됐어요 * \[FIXED] 설정 팝업이 올바른 위치에 표시돼요 **Mobile App 2.1.6** * \[IMPROVED] Android 앱 안정성이 크게 개선됐어요 * \[IMPROVED] 크레딧 만료와 소진 알림이 더 명확하게 구분돼요 * \[IMPROVED] 무료 체험 사용량에 따라 구독 안내가 표시돼요 (Android) **Service Improvements** * \[NEW] Adobe Express 확장 프로그램을 위한 키워드 추출 기능이 추가됐어요 * \[IMPROVED] 맞춤형 문서 생성이 간헐적으로 실패하는 문제를 해결했어요. * \[IMPROVED] 외부 API를 통해 폴더 계층 구조를 조회할 수 있어요 *** **Mobile App 2.1.4** - \[NEW] iOS 잠금화면 위젯이 추가됐어요 - \[IMPROVED] 위젯 배경이 올바르게 표시돼요 *** **Web** * \[NEW] 여러 노트를 선택해서 한번에 폴더로 이동할 수 있어요 * \[NEW] 노트 이동 시 개인 폴더와 팀 폴더를 선택할 수 있어요 * \[NEW] 폴더 안에서 음성파일 업로드 노트도 생성할 수 있어요 * \[NEW] 계정 삭제 시 이메일을 한번 더 입력해서 실수로 삭제하는 것을 방지해요 * \[IMPROVED] 캘린더 이벤트를 최대 10개까지 표시하고 접을 수 있어요 * \[IMPROVED] 이미 시작했거나 진행 중인 캘린더 이벤트로도 노트를 생성할 수 있어요 * \[IMPROVED] 모바일에서 기록한 노트가 올바른 위치에 표시돼요 * \[IMPROVED] 참석자 입력 UI가 간소화되었어요 * \[IMPROVED] 노트 목록이 더 간결해졌어요 * \[FIXED] 새 노트 만들기 아이콘이 변경됐어요 * \[FIXED] 노트 사이드바의 버튼 크기가 더 간결하게 조정됐어요 **Mobile App 2.1.5** * \[NEW] 구독 안내 배너가 추가됐어요 * \[IMPROVED] 결제 후 구독 정보가 즉시 반영돼요 *** **Web** * \[IMPROVED] 컨퍼런스 모드 경험이 개선됐어요 **Mobile App 2.1.5** * \[NEW] 이탈리아어, 태국어, 힌디어로 회의를 기록할 수 있어요 * \[IMPROVED] 설정한 언어로 대화 언어와 기록 언어가 정확하게 표시돼요 * \[FIXED] Android 오프라인 노트 업로드 전 언어 선택 화면이 개선됐어요 * \[FIXED] 파일 업로드 화면에서 불필요한 언어 선택 버튼이 제거됐어요 **Service Improvements** * \[IMPROVED] 실시간 대화 기록에 구두점이 자동으로 추가돼요 * \[IMPROVED] 맞춤형 문서 생성이 더 안정적이에요 *** **Web** * \[NEW] 폴더를 선택할 때, 검색창을 통해 쉽게 검색하고 선택할 수 있어요 * \[IMPROVED] 변경사항 페이지 접근이 개선됐어요 * \[FIXED] 파일 업로드 시 로딩 표시가 정상적으로 작동해요 **Desktop App 3.12.7** * \[NEW] 새 노트 생성 단축키가 추가됐어요. 앞으로 다양한 케이스에서 편리하게 사용하실 수 있도록 여러 단축키들을 추가할 예정이에요 * \[NEW] 폴더를 선택할 때, 검색창을 통해 쉽게 검색하고 선택할 수 있어요 * \[NEW] 업데이트 알림에서 변경사항을 바로 확인할 수 있어요 * \[NEW] 업데이트 완료 후 완료되었다는 알림과 함께 변경사항을 확인할 수 있어요 * \[FIXED] 파일 업로드 시 로딩 표시가 정상적으로 작동해요 * \[FIXED] 오픈커뮤니티에서 제보해주셨던 티로가 간헐적으로 켜지지 않던 문제가 완전히 해소됐어요 *** **Service Improvements** - \[IMPROVED] 최신 Claude Sonnet 4.5 모델과 Haiku 4.5 모델로 업그레이드해서 더 빠르고 정확한 응답을 제공해요 - \[IMPROVED] 한국어, 일본어, 중국어등 아시아 언어에서 문단요약의 정확도와 속도가 크게 향상됐어요 - \[IMPROVED] 외부 연동을 위한 노트 템플릿 API가 개선됐어요 - \[FIXED] 음성 파일 처리 로그가 더 자세해져서 문제 파악이 쉬워졌어요 - \[FIXED] 한국어 음성 인식의 안정성이 향상됐어요 *** **Web** * \[NEW] 대화 기록을 종료할 수 있는 기능이 추가됐어요 * \[IMPROVED] 한 페이지 문서가 일시정지가 아닌 대화 기록 종료 후 자동으로 생성되도록 개선됐어요 **Service Improvements** * \[NEW] 노트 템플릿 기반 맞춤 문서 이벤트를 외부로 전달하는 웹훅이 추가됐어요 * \[NEW] 노트 템플릿 기반 맞춤 문서를 조회할 수 있는 외부 API가 추가됐어요 * \[IMPROVED] AI 기반 문장 분리를 규칙 기반으로 전환해서 처리 속도가 빨라졌어요 * \[IMPROVED] 중국어(간체) 음성 인식의 정확도가 크게 향상됐어요 * \[IMPROVED] 실시간 번역 속도가 크게 개선되어 1\~2초마다 번역 결과를 확인할 수 있어요 *** **Web** * \[NEW] 폴더를 계층적으로 구조화할 수 있어요 (폴더 안에 폴더 생성, 이동, 경로 표시) * \[NEW] 노트 목록에서 여러 노트를 선택해서 한번에 다운로드하거나 삭제할 수 있어요 * \[NEW] 모든 사용자가 이탈리아어와 태국어로 회의를 기록할 수 있어요 **Desktop App 3.12.6** * \[NEW] 폴더를 계층적으로 구조화할 수 있어요 (폴더 안에 폴더 생성, 이동, 경로 표시) * \[NEW] 노트 목록에서 여러 노트를 선택해서 한번에 다운로드하거나 삭제할 수 있어요 * \[NEW] 모든 사용자가 이탈리아어와 태국어로 회의를 기록할 수 있어요 * \[NEW] Windows에서 마이크 연결 상태를 자동으로 감지하고 알림을 표시해요. * \[NEW] 오버레이 UI를 설정에서 켜거나 끌 수 있어요 *** **Desktop Ap 3.12.5** * \[NEW] 회의 중 간편하게 노트를 확인할 수 있는 오버레이 UI가 추가됐어요 * \[NEW] 이탈리아어와 태국어를 정식으로 지원해요 * \[IMPROVED] 음성 녹음 품질이 개선됐어요 * \[FIXED] 음성 파일 다운로드가 더 안정적으로 개선됐어요 **Service Improvements** * \[NEW] 노트 템플릿을 기반으로 맞춤 문서를 생성할 수 있는 API가 추가됐어요 * \[IMPROVED] 음성 파일에서 더 자연스러운 단위로 문단을 구분해요 * \[IMPROVED] 한국어 음성 인식 안정성이 개선됐어요 * \[IMPROVED] 화자 구분이 더 정확해졌어요 * \[IMPROVED] 팀 시트 관리가 더 유연해졌어요 * \[FIXED] 음성 인식 연결 안정성이 개선됐어요 *** **Desktop App 3.12.4** * \[NEW] 노트북을 덮으면 회의 기록이 자동으로 중단돼요 (Mac) * \[IMPROVED] 마이크 감지 기능이 개선되어 티로 앱 자체의 마이크 사용을 감지하지 않아요 * \[IMPROVED] 음성 다시듣기 기능에서 일시정지/재개 시에도 파일이 정상적으로 저장돼요 * \[FIXED] 파일 업로드 시 맥락 입력이 제대로 반영돼요 * \[FIXED] Ask Tiro에서 참조를 클릭해도 자동 스크롤되지 않아요 * \[FIXED] 언어별 스크립트 탭이 정상적으로 표시돼요 * \[FIXED] 기록 전에도 노트 공유 및 협업자를 초대할 수 있어요. **Service Improvements** * \[IMPROVED] 노트에 플랫폼 정보가 저장되어 더 나은 지원이 가능해요 * \[IMPROVED] 폴더 내 노트 조회 기능이 개선됐어요 *** **Web** * \[NEW] 대화 언어에 태국어를 추가로 지원해요 * \[IMPROVED] 노트 시작 전에도 공유 및 협업자 초대가 가능해요 * \[FIXED] 스크립트 뷰에서 모든 언어가 정상적으로 표시돼요 **Mobile App 2.1.5** * \[IMPROVED] React Native가 최신 버전(0.78.3)으로 업그레이드되어 성능이 향상됐어요 (Android) **Service Improvements** * \[IMPROVED] 폴더 삭제 시 하위 폴더도 함께 삭제돼요 * \[IMPROVED] 팀 멤버 역할 관리가 개선됐어요 * \[IMPROVED] 팀 정보가 구독 취소 알림에 포함돼요 *** **Mobile App 2.1.4** * \[NEW] 대화 기록 화면에서 빠르게 이동할 수 있는 드래그 스크롤바가 추가됐어요 **Service Improvements** * \[NEW] 오프라인 모드에서도 대화 기록 파일을 다운로드할 수 있어요 * \[NEW] 폴더 이동 및 공유 옵션이 추가됐어요 * \[IMPROVED] 녹음 파일의 다운로드 속도가 크게 개선되었어요. *** **Web** * \[NEW] 노트 페이지에서 표(테이블) 마크다운을 지원해요 * \[NEW] Outlook 캘린더 연동이 추가됐어요 * \[IMPROVED] 캘린더 설정 화면의 UI가 개선됐어요 * \[IMPROVED] 노트 복사 시 화자 이름도 함께 복사돼요 **Desktop App 3.12.3** * \[FIXED] 스크립트 탭 렌더링 오류가 수정됐어요 **Mobile App 2.1.3** * \[NEW] Ask Tiro 렌더링이 개선되어 블록 기반과 레거시 콘텐츠를 모두 지원해요 * \[IMPROVED] 이탈리아어가 추가됐어요 * \[IMPROVED] 맥락 검색 기능이 안정적으로 작동해요 * \[FIXED] 검색 후 노트를 선택하면 검색어가 초기화돼요 * \[FIXED] PTU 120분 제한 안내가 모든 언어에 표시돼요 **Service Improvements** * \[NEW] 폴더 경로 조회 API가 추가됐어요 * \[IMPROVED] 폴더 관련 권한 및 공유 기능이 강화됐어요 * \[IMPROVED] Microsoft 로그인 시 캘린더가 자동으로 연동돼요 *** **Web** * \[NEW] Microsoft(Outlook) 계정으로 로그인할 수 있어요 * \[IMPROVED] Ask Tiro의 렌더링과 레이아웃이 개선됐어요 * \[IMPROVED] 컨퍼런스 모드 UI가 더 깔끔해졌어요 * \[IMPROVED] 파일 업로드 시 이전 맥락을 불러올 수 있어요 * \[FIXED] 베타 버전이던 이탈리아어를 정식으로 지원해요. * \[FIXED] 맥락 입력 아이콘이 더 직관적으로 변경됐어요 * \[FIXED] 컨퍼런스 모드가 실시간 대화 기록에서만 표시돼요 * \[FIXED] 레퍼럴 링크가 올바른 페이지로 이동해요 **Desktop App 3.12.2** * \[NEW] Mac에서 다른 앱이 마이크를 사용할 때 알림을 받을 수 있어요 * \[NEW] 실시간 대화 기록의 음성 파일을 다운로드할 수 있어요 * \[NEW] Microsoft(Outlook) 계정으로 로그인할 수 있어요 * \[IMPROVED] 마이크 감지 알림이 맞춤 디자인으로 개선됐어요 * \[IMPROVED] Ask Tiro UI의 렌더링과 레이아웃이 개선됐어요 * \[IMPROVED] 파일 업로드 시 이전 맥락을 사용할 수 있어요 * \[FIXED] 컨퍼런스 모드가 실시간 대화 기록에서만 표시돼요 * \[FIXED] 베타 버전이던 이탈리아어를 정식으로 지원해요. **Mobile App 2.1.3** * \[NEW] 이탈리아어로 회의를 기록할 수 있어요 * \[IMPROVED] 녹음 및 오프라인 모드에서도 언어를 변경할 수 있어요 * \[IMPROVED] Enterprise 플랜이 추가됐어요 **Service Improvements** * \[IMPROVED] Ask Tiro의 의도 분석 기능이 강화되어 더 정확한 답변을 제공해요 * \[IMPROVED] 문단 요약의 프롬프트를 개선해서 품질이 크게 향상되었어요. * \[IMPROVED] 템플릿 생성 시 길이 제한이 크게 향상되었어요. * \[IMPROVED] 레퍼럴 링크의 기본 언어 설정이 개선됐어요 *** **Web** * \[NEW] 이탈리아어 베타 버전이 추가됐어요 * \[NEW] 로그인 팝업과 페이지 디자인이 완전히 새로워졌어요 * \[IMPROVED] 무료 체험 노트가 최대 120분까지 기록된다는 안내가 표시돼요 * \[FIXED] 단어장 파일 업로드 모달 내 이벤트 차단 문제가 해결됐어요 **Desktop App 3.12.1** * \[NEW] 이탈리아어 베타 버전이 추가됐어요 * \[NEW] 파일에서 단어를 추출하는 단어장 기능이 추가됐어요 * \[NEW] 로그인 화면이 완전히 새로운 디자인으로 바뀌었어요 * \[IMPROVED] 무료 체험 노트가 최대 120분까지 기록된다는 안내가 표시돼요 * \[FIXED] Windows에서 시스템 마이크 없이도 오디오 캡처 권한만으로 기록할 수 있어요 * \[FIXED] 단어장 파일 업로드 이벤트가 정상적으로 작동해요 * \[FIXED] 번역 키가 올바르게 반영돼요 **Service Improvements** * \[NEW] HubSpot 미팅 노트 생성 기능이 추가됐어요 * \[NEW] 무료 체험 노트에 120분 하드컷이 적용됐어요 * \[IMPROVED] 일본어 음성 인식 모델의 품질이 크게 개선되어 정확도가 향상됐어요 * \[FIXED] Outlook 캘린더 연동 문제가 해결됐어요 * \[FIXED] HubSpot 미팅 생성 시 시간 검증 오류가 수정됐어요 * \[FIXED] 문장 번역 중복 생성 오류가 해결됐어요 * \[FIXED] 음성이 없는 오디오 파일 업로드 시 프로세스가 멈추지 않아요 *** **Web** * \[NEW] 단어장 파일을 업로드하여 AI가 특정 용어를 정확하게 인식하도록 할 수 있어요 **Service Improvements** * \[NEW] 무료 체험 노트가 120분으로 제한돼요 * \[IMPROVED] 캘린더 시스템이 여러 제공업체를 지원하도록 개선됐어요 * \[IMPROVED] Outlook 캘린더 연동이 추가됐어요 *** **Web** * \[NEW] 컨퍼런스 모드가 추가되어 다국어 회의를 더 편리하게 기록할 수 있어요 * \[NEW] 오프라인 모드와 음성 파일 업로드에서 음성을 다시 들을 수 있어요 * \[NEW] HubSpot 연동이 추가됐어요 * \[IMPROVED] 대화 기록의 주요 사용자 여정에 모니터링이 추가되어 더 안정적이에요 * \[IMPROVED] 컨퍼런스 모드에서 문단 단위로 내용을 확인할 수 있어요 * \[IMPROVED] 다국어 기록 환경에서 스크립트 UI가 개선됐어요 * \[FIXED] 컨퍼런스 모드 UI가 더 깔끔해졌어요 * \[FIXED] 공유하기 버튼 크기가 조정됐어요 * \[FIXED] 문단 분리 후 증강 중일 때 경험이 개선됐어요 **Desktop App (3.12.0 - 대규모 업데이트)** * \[NEW] 컨퍼런스 모드로 다국어 회의를 편리하게 기록할 수 있어요 * \[NEW] 오프라인 모드와 음성 파일 업로드에서 음성을 다시 들을 수 있어요 * \[NEW] HubSpot 연동으로 노트를 공유할 수 있어요 * \[NEW] 앱 업데이트 상황을 수동으로 확인할 수 있어요 * \[NEW] 패치 버전도 자동 업데이트 알림이 표시돼요 * \[IMPROVED] 대화 기록의 안정성을 위한 모니터링이 추가됐어요 * \[IMPROVED] 다국어 기록 환경에서 스크립트가 더 보기 좋게 표시돼요 * \[IMPROVED] 임시 문단 기록 중에는 전체 문단이 표시돼요 * \[IMPROVED] 노트 타이틀 탭이 슬라이드 구조로 변경됐어요 * \[FIXED] Windows 타이틀 바의 새로고침 버튼 위치가 수정됐어요 * \[FIXED] 컨퍼런스 모드 UI와 버튼 노출 로직이 개선됐어요 * \[FIXED] 문단 분리 시 문장이 일시적으로 사라지는 현상이 해결됐어요 * \[FIXED] 다국어 동시 기록 시 같은 언어가 중복 표시되지 않아요 **Service Improvements** * \[NEW] MCP OAuth 로그인이 구현됐어요 * \[IMPROVED] 음성 인식 자동 재연결 기능이 개선되어 더 안정적이에요 * \[IMPROVED] 노트 템플릿 출력 규칙이 더 엄격하게 적용돼요 * \[IMPROVED] 캘린더 연결 URL이 공개됐어요 * \[IMPROVED] 팀 구독 사용량 계산 로직이 개선됐어요 * \[IMPROVED] 크레딧 부여 시 즉시 사용 가능해요 * \[FIXED] 문장 암호화 키가 올바르게 적용돼요 * \[FIXED] 팀 구독 사용량 계산이 정확해졌어요 *** **Web** * \[NEW] 컨퍼런스 모드의 기반이 되는 다국어 동시 번역 기능이 준비됐어요 * \[NEW] 글로벌 랜딩 페이지의 가격 섹션이 추가됐어요 * \[IMPROVED] 가격 페이지에서 로그인 후 설정창으로 바로 이동해요 **Mobile App 2.1.2** * \[IMPROVED] 노트 정렬 시 녹음 시작 시간이 우선 적용돼요 **Service Improvements** * \[IMPROVED] 팀 구독 시스템이 대폭 개선되어 더 유연해졌어요 * \[IMPROVED] 독일어, 스페인어, 프랑스어, 인도네시아어, 터키어, 힌디어 음성 인식 모델의 품질이 크게 개선되어 정확도가 향상됐어요 * \[IMPROVED] 팀원 퇴사 후에도 팀 템플릿이 유지돼요 * \[IMPROVED] 실시간 번역 및 스크립트 성능이 개선됐어요 *** **Web** * \[NEW] 글로벌 랜딩 페이지가 추가됐어요 * \[NEW] 레퍼럴 링크에서 언어가 자동으로 리디렉션돼요 * \[IMPROVED] 음성 파일 업로드 후 기록 언어와 맥락을 입력할 수 있어요 * \[IMPROVED] 파일 업로드 시 맥락 입력이 더 잘 보여요 * \[IMPROVED] 문서 템플릿 생성 시 글자 수 제한이 10,000자로 증가했어요 **Mobile App 2.1.1** * \[FIXED] Android 파일 공유 오류가 수정됐어요 **Service Improvements** * \[IMPROVED] 사용자 탈퇴 시에도 팀 노트가 유지돼요 *** **Web** - \[FIXED] 스크립트 탭에서 자동으로 스크롤이 아래로 내려가는 현상이 해결됐어요 *** **Web** * \[NEW] 노트 타이틀 탭이 슬라이드 구조로 변경됐어요 **Desktop App 3.11.9** * \[NEW] 내부 유저는 실시간 다국어 번역과 언어 선택 기능을 사용할 수 있어요 * \[NEW] 노트 타이틀 탭이 슬라이드 구조로 변경됐어요 *** **Web** - \[FIXED] 파일 업로드 시 다국어 모드가 선택되지 않도록 개선됐어요 *** **Service Improvements** - \[NEW] 문단별 번역 기능이 추가됐어요 *** **Mobile App 2.1.3** - \[NEW] 기록 모드별 위젯이 추가됐어요 - \[FIXED] iOS에서 내용 공유하기가 정상적으로 작동해요 - \[FIXED] iOS에서 오디오를 파일로 저장할 때 올바른 형식으로 저장돼요 - \[FIXED] iOS 실시간 대화기록 위젯의 다크모드 UI가 개선됐어요 - \[FIXED] 중복 노트 렌더링 문제가 해결됐어요 *** **Web** * \[FIXED] 플로팅 UI가 노트를 변경할 때마다 정상적으로 작동해요 * \[FIXED] 웹소켓 재연결 시 안정성이 개선됐어요 * \[FIXED] 스크립트 문단이 나타날 때 딜레이가 해소됐어요 **Desktop App 3.11.9** * \[FIXED] 플로팅 UI가 노트를 변경할 때마다 정상적으로 작동해요 * \[FIXED] 웹소켓 재연결 시 안정성이 개선됐어요 * \[FIXED] 노트 리스트 페이지에서 노트 링크 복사가 올바른 URL을 생성해요 * \[FIXED] 스크립트 문단이 나타날 때 딜레이가 해소됐어요 *** **Web** * \[IMPROVED] 팀원 초대 링크를 통해 로그인 팝업으로 바로 연결돼요 **Desktop App 3.11.8** * \[IMPROVED] 팀원 초대 링크를 통해 로그인 팝업으로 바로 연결돼요 * \[IMPROVED] 앱이 백그라운드로 전환될 때 성능이 개선됐어요 **Service Improvements** * \[NEW] Enterprise 플랜이 추가됐어요 * \[NEW] 팀별 맞춤 견적 결제 링크 시스템이 추가됐어요 *** **Web** * \[FIXED] 노트 미리보기 화면에서 공유하기 버튼이 제거됐어요 * \[FIXED] 노트 상세 페이지의 높이와 스타일이 개선됐어요 **Desktop App 3.11.7** * \[FIXED] 마이크 권한 문제로 기록이 안 되는 간헐적인 오류가 해결됐어요 **Service Improvements** * \[NEW] 파일 업로드로 팀/개인 단어장에 여러 단어를 한번에 추가할 수 있어요 * \[IMPROVED] 한 페이지 문서 생성의 품질이 개선됐어요 *** **Web** * \[NEW] 노트 타이틀 섹션의 문서 생성 버튼이 하단으로 이동했어요 * \[IMPROVED] 오프라인 모드로 기록된 노트도 문서 생성과 공유가 가능해요 * \[IMPROVED] SEO를 위한 다국어(한/영/일) 메타데이터가 추가됐어요 **Desktop App 3.11.6** * \[NEW] 알림 설정을 통해 알림을 켜거나 끌 수 있어요 * \[NEW] 내부 유저는 다국어 기록 모드를 사용할 수 있어요 * \[NEW] Ask Tiro 채팅창에서 Shift+Enter로 줄바꿈을 입력할 수 있어요 * \[NEW] 타임스탬프를 포함해서 스크립트를 복사할 수 있어요 * \[IMPROVED] 오프라인 모드로 기록된 노트도 문서 생성과 공유가 가능해요 * \[IMPROVED] 한 페이지 문서 생성 시 구분선과 여백이 조정됐어요 * \[FIXED] 파일 업로드의 기록 언어에서 다국어 옵션이 제거됐어요 * \[FIXED] 노트 상세 페이지의 스타일과 높이가 개선됐어요 *** **Mobile App 2.1.2** * \[NEW] 화자 분리 UI가 추가됐어요 * \[NEW] 오디오 관리 화면이 추가됐어요 * \[IMPROVED] 오프라인 모드 노트가 녹음 시작 시간으로 정렬돼요 * \[IMPROVED] 오프라인 모드에서 텍스트 변환 시간 제한이 개선됐어요 * \[IMPROVED] 노트와 오디오를 동시에 삭제하기 전에 오디오 공유를 권유해요 * \[IMPROVED] 구독이 없는 경우 플랜 이름이 Free로 표시돼요 * \[IMPROVED] 탈퇴 시 데이터가 완전히 초기화돼요 **Service Improvements** * \[IMPROVED] 외부 API를 통해 노트와 문단을 조회할 수 있어요 *** **Web** * \[NEW] PDF와 DOCX 다운로드 시 화자가 분리된 스크립트를 추출할 수 있어요 * \[IMPROVED] 공유 기능의 폴더 깊이가 1단계로 간소화됐어요 **Desktop App 3.11.5** * \[NEW] 내부 유저는 다국어 기록 기능을 사용할 수 있어요 * \[NEW] PDF와 Excel 다운로드 시 화자가 분리된 스크립트를 추출할 수 있어요 * \[IMPROVED] 공유 기능의 폴더 깊이가 1단계로 간소화됐어요 * \[FIXED] 기록이 중간에 중단되는 문제가 해결됐어요 *** **Web** - \[FIXED] 공유 페이지 오류가 수정됐어요 *** **Web** * \[NEW] Ask Tiro가 새 버전과 이전 버전의 콘텐츠를 모두 렌더링해요 * \[IMPROVED] 노트 상세 페이지의 미리보기 크기 조정 로직이 개선됐어요 * \[FIXED] 다른 기기에서 스트리밍 중일 때 발생하는 오류가 수정됐어요 * \[FIXED] 노트 상세 페이지의 높이 버그가 수정됐어요 * \[FIXED] 글로벌 템플릿 생성 로직 오류가 수정됐어요 **Desktop App 3.11.4** * \[NEW] 컴팩트 뷰가 추가됐어요 * \[NEW] Ask Tiro가 새 버전과 이전 버전의 콘텐츠를 모두 렌더링해요 * \[IMPROVED] 타이틀 바 패딩이 조정됐어요 * \[IMPROVED] 노트 상세 페이지의 미리보기 크기 조정 로직이 개선됐어요 * \[FIXED] 노트 상세 페이지의 높이 버그가 수정됐어요 * \[FIXED] 글로벌 템플릿 생성 로직 오류가 수정됐어요 *** **Web** - \[IMPROVED] 노트 미리보기의 기본 크기가 70%로 조정됐어요 (이전 50%) *** **Desktop App 3.11.3** - \[NEW] 데스크톱 새로고침 기능이 추가됐어요 - \[NEW] 힌디어로 회의를 기록할 수 있어요 *** **Web** - \[IMPROVED] 기본 언어가 한국어로 설정됐어요 *** **Desktop App 3.11.3** * \[NEW] 힌디어로 회의를 기록할 수 있어요 **Mobile App 2.1.1** * \[NEW] 오프라인 모드에서 회의를 기록할 수 있어요 * \[NEW] 음성을 다시 들을 수 있어요 * \[IMPROVED] 오프라인 모드와 오디오 재생 UI가 개선됐어요 * \[IMPROVED] 구매 관련 오류가 제거됐어요 * \[FIXED] 로그인/로그아웃 시 오프라인 캐시 문제가 해결됐어요 * \[FIXED] 오프라인 오디오 설정 값이 예기치 않게 변경되는 문제가 수정됐어요 * \[FIXED] 노트 검색 섹션이 헤더로 이동했어요 * \[FIXED] Android 파일 공유 오류가 수정됐어요 *** **Web** * \[NEW] 노트 목록 페이지에서 링크를 공유할 수 있어요 * \[IMPROVED] 플로팅 UI 새로고침 간격이 5초로 설정됐어요 * \[IMPROVED] 팀 플랜 사용량이 결제 주기별로 계산돼요 * \[FIXED] 가상 스크립트 렌더링 로직이 수정됐어요 * \[FIXED] 팀 플랜 버튼의 테두리 선이 개선됐어요 **Desktop App 3.11.2** * \[FIXED] SSO 로그인 콜백과 딥링크가 정상적으로 작동해요 *** **Desktop App 3.11.1** - \[NEW] SSO(Single Sign-On) 로그인이 추가됐어요 - \[NEW] 회의 중 간편하게 노트를 확인할 수 있는 플로팅 UI가 추가됐어요 - \[NEW] 새 문단이 생성될 때 애니메이션이 표시돼요 - \[IMPROVED] 스크립트의 줄 간격이 더 읽기 편하게 조정됐어요 - \[IMPROVED] 화자 분리된 스크립트 렌더링이 개선됐어요 - \[IMPROVED] 녹음 컨트롤 간 간격이 추가됐어요 - \[FIXED] 일본어 업로드 녹음 버튼 패딩이 수정됐어요 - \[FIXED] 스크립트 뷰와 노트 타이틀에서 화자 편집 버그가 수정됐어요 *** 새로운 기능 제안이나 버그 리포트는 언제든 환영합니다. # Attach Note to Folder Source: https://docs.tiro.ooo/api-reference/folder/attach-note-to-folder /openapi.yaml post /v1/external/folders/{folderId}/notes Add an existing note to the folder. The note must belong to the same workspace as the folder. Requires edit access to the folder. Attaching a note that is already in the folder succeeds with no effect, so the call is safe to retry. # Create Folder Source: https://docs.tiro.ooo/api-reference/folder/create-folder /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/folders Create a folder in a workspace. Requires a **user** API key — you must be a writable member of the workspace. A team-only API key returns `401`. To nest the folder, set `parentId` (folders can be nested up to 5 levels below the root level). `sharingType` defaults to `ALL_MEMBER_VIEWER` when omitted. # Delete Folder Source: https://docs.tiro.ooo/api-reference/folder/delete-folder /openapi.yaml delete /v1/external/folders/{folderId} Delete a folder. The folder must have no subfolders — delete or move its children first. Requires edit access. This action is irreversible. # Detach Note from Folder Source: https://docs.tiro.ooo/api-reference/folder/detach-note-from-folder /openapi.yaml delete /v1/external/folders/{folderId}/notes/{noteGuid} Remove a note from the folder. This does not delete the note itself. Requires edit access to the folder. # Get Folder Source: https://docs.tiro.ooo/api-reference/folder/get-folder /openapi.yaml get /v1/external/folders/{folderId} Retrieve a single folder by ID. The workspace is resolved from the folder, so no workspace is needed in the path. Requires a **user** API key with access to the folder. # Get Folder Path Source: https://docs.tiro.ooo/api-reference/folder/get-folder-path /openapi.yaml get /v1/external/folders/{folderId}/path Retrieve the breadcrumb path from the root to the folder, inclusive. The first element is the top-level ancestor and the last element is the folder itself. Requires a **user** API key with access to the folder. Ancestors you cannot access appear with `isAccessible: false`. # Get Folder Tree Source: https://docs.tiro.ooo/api-reference/folder/get-folder-tree /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders/tree Retrieve the workspace folder hierarchy as a nested tree. Requires a **user** API key. The tree contains only folders you can access. When a folder's parent is not accessible to you, the folder appears at the root level of the tree instead. # List Folders Source: https://docs.tiro.ooo/api-reference/folder/list-folders /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders List the folders you can access in a workspace, as a flat array. Requires a **user** API key — folder access is evaluated per user via workspace membership. A team-only API key returns `401`. Create folders with `POST` on this same path. Read and manage individual folders with the endpoints under `/v1/external/folders/{folderId}`. # List Folders by Note Source: https://docs.tiro.ooo/api-reference/folder/list-folders-by-note /openapi.yaml get /v1/external/notes/{noteGuid}/folders Retrieve folders for a specific note # Move Folder Source: https://docs.tiro.ooo/api-reference/folder/move-folder /openapi.yaml put /v1/external/folders/{folderId}/move Move a folder under a new parent, or to the root level with `newParentId: null`. The target parent must be in the same workspace and you must have access to it. You cannot move a folder into its own subtree. Use `sharingTypeUpdateStrategy` to control how the folder's sharing permissions are handled after the move (defaults to `KEEP_EXISTING`). Requires edit access to the folder. # Reorder Folders Source: https://docs.tiro.ooo/api-reference/folder/reorder-folders /openapi.yaml post /v1/external/folders/reorder Set the display order of sibling folders. Provide every sibling's ID in the desired order; positions are assigned by array index. The workspace is inferred from the first folder ID. Requires edit access. # Update Folder Source: https://docs.tiro.ooo/api-reference/folder/update-folder /openapi.yaml patch /v1/external/folders/{folderId} Update a folder's title, description, color, or sharing type (partial update). Requires edit access. Changing `sharingType` to `PRIVATE` fails with `403` if the folder still has other members. `PATCH` cannot change the parent — use `PUT /v1/external/folders/{folderId}/move` to re-parent or move to the root. # Get Note Document Template Source: https://docs.tiro.ooo/api-reference/note-document-template/get-note-document-template /openapi.yaml get /v1/external/note-document-templates/{templateId} Retrieve a specific note document template by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Bound Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-bound-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/me/note-document-templates List the note document templates in the workspace bound to the API key, with cursor-based pagination. Use this with a workspace-scoped key when you do not want to pass the workspace GUID explicitly; the workspace is resolved the same way as `GET /v1/external/workspaces/me`. # List Managed Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-managed-note-document-templates /openapi.yaml get /v1/external/note-document-templates/managed List Tiro's built-in (managed) note document templates, with cursor-based pagination. Managed templates are curated by Tiro and shared across every account; they are read-only (`isManaged: true`, `isEditable: false`). Use the optional `locale` query parameter (BCP-47, for example `en-US`, `ko-KR`, `ja-JP`) to select the language of the returned templates. When omitted, a fallback locale is returned. # List Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates /openapi.yaml get /v1/external/note-document-templates Deprecated. Use the path-explicit list endpoints (users/me, workspaces, organizations/me). Resolves scope by API key type. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Document Templates Across Workspaces Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates-across-workspaces /openapi.yaml get /v1/external/workspaces/-/note-document-templates List note document templates across every workspace the API key can access, with cursor-based pagination. Pass the optional `workspaceGuids` query parameter (comma-separated, up to 50 GUIDs) to restrict the result to specific workspaces; omit it to include every accessible workspace. # List Organization Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-organization-note-document-templates /openapi.yaml get /v1/external/organizations/me/note-document-templates List the org-owned note document templates of the organization bound to the API key, with cursor-based pagination. Requires an organization API key; personal, workspace, and legacy team keys return `401`. # List User Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-user-note-document-templates /openapi.yaml get /v1/external/users/me/note-document-templates List the calling user's personal note document templates, with cursor-based pagination. Only templates the user owns personally are returned — workspace and organization templates are excluded. # List Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/note-document-templates List the note document templates in the specified workspace, with cursor-based pagination. The API key must be able to access the workspace in the path; a key bound to a different workspace returns `403`. # Generate Note Document Source: https://docs.tiro.ooo/api-reference/note-document/generate-note-document /openapi.yaml post /v1/external/notes/{noteGuid}/documents Generate a note document based on a template. - Blocks until document generation is complete (synchronous) - Requires `UPDATE_CONTENT` permission on the note - User must own the template or have team access See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Document Source: https://docs.tiro.ooo/api-reference/note-document/get-note-document /openapi.yaml get /v1/external/notes/{noteGuid}/documents/{documentId} Retrieve a specific note document by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Documents Source: https://docs.tiro.ooo/api-reference/note-document/list-note-documents /openapi.yaml get /v1/external/notes/{noteGuid}/documents List all documents generated for a specific note. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Delete Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/delete-share-link /openapi.yaml delete /v1/external/notes/{noteGuid}/share-link Delete the share link for a note. - Returns 204 even if already deleted (idempotent) # Get Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/get-share-link /openapi.yaml get /v1/external/notes/{noteGuid}/share-link Retrieve the current share link for a note. - Returns 404 if no share link exists - `sharePassword` is always `null` for security # Upsert Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/upsert-share-link /openapi.yaml put /v1/external/notes/{noteGuid}/share-link Create or update a share link for a note. - If no link exists, creates a new one. If it already exists, updates password settings. - An empty body `{}` creates a link without a password. ### `usePassword` behavior | `usePassword` | No existing link | Existing link | |---|---|---| | `null` (omit) | Create without password | Keep current state | | `true` | Create with password | (Re)generate password | | `false` | Create without password | Remove password | > `sharePassword` is only included when `usePassword: true`. Store it immediately — it cannot be retrieved later. # Get Note Summary Source: https://docs.tiro.ooo/api-reference/note-summary/get-note-summary /openapi.yaml get /v1/external/notes/{noteGuid}/summaries/{summaryId} Retrieve a specific summary with full content. - Default format: Markdown (`text/markdown`) - Use the `format` query parameter to request `text/plain` instead See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Summaries Source: https://docs.tiro.ooo/api-reference/note-summary/list-note-summaries /openapi.yaml get /v1/external/notes/{noteGuid}/summaries List all summaries generated for a specific note. - Returns summary metadata without content - To retrieve the full summary content, use the Get Note Summary endpoint See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Source: https://docs.tiro.ooo/api-reference/note/get-note /openapi.yaml get /v1/external/notes/{noteGuid} Retrieve a single note by its GUID # List Note Paragraphs Source: https://docs.tiro.ooo/api-reference/note/list-note-paragraphs /openapi.yaml get /v1/external/notes/{noteGuid}/paragraphs Returns a note's transcript as paragraphs — the "conversation notes" / transcript content (a speaker turn or topic chunk per paragraph). **Paywall masking (free / unpaid notes).** When a note exceeds the free usage limit and is not on a paid plan, the paragraphs past the limit are returned with their text content masked instead of withheld. Such paragraphs have `locked: true`. The first locked paragraph keeps a short readable preview (about the first 80 characters of `transcript`, and the summary header plus its first bullet); every locked paragraph after it is fully masked. Masking preserves length, whitespace, and structure but replaces the words with placeholder characters, so masked text reads as gibberish rather than the real transcript. Unlocked paragraphs (`locked: false`) are always returned in full. Starting a paid plan unlocks the note and removes the masking. A response where the transcript "cuts off partway" is almost always this masking, not a bug. # List Notes Source: https://docs.tiro.ooo/api-reference/note/list-notes /openapi.yaml get /v1/external/notes **Deprecated.** Use `GET /v1/external/workspaces/{workspaceGuid}/notes` for workspace-scoped listing. This endpoint stays available for backward compatibility. List notes with cursor-based pagination. When `keyword` is provided the result set is reordered by full-text relevance (with `createdAt` desc as tiebreaker) instead of `recordingStartAt` desc. Keyword search requires a user-scoped API key — team-only API keys with `keyword` set return `400`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # List Workspace Notes Source: https://docs.tiro.ooo/api-reference/note/list-workspace-notes /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/notes List the notes in a workspace with cursor-based pagination. This is the workspace-scoped successor to the deprecated `GET /v1/external/notes`. The API key must be scoped to the workspace in the path; a key bound to a different workspace returns `403`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # Reserve Note GUID Source: https://docs.tiro.ooo/api-reference/note/reserve-note-guid /openapi.yaml post /v1/external/notes/guids Reserve a note GUID for later use in note creation. This allows you to: - Get a GUID before actually creating the note - Use the reserved GUID when creating a note with POST /v1/notes (internal API) - Reservation expires after 1 hour if not used **Use case**: When you need to know the note GUID before the note content is ready, such as setting up webhooks or references in advance. # Search Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-notes-deep /openapi.yaml post /v1/external/notes/search **Deprecated.** Use `POST /v1/external/workspaces/{workspaceGuid}/notes/search` for workspace-scoped deep search, which also accepts workspace-system and team API keys. This endpoint stays available for backward compatibility. Keyword-required deep search. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. ## When to use this vs `GET /v1/external/notes?keyword=...` - **`GET /v1/external/notes?keyword=...`** — lightweight: returns matched note metadata only. Cheaper. - **`POST /v1/external/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Behavior - Requires a user-scoped API key (team-only API keys return `400`). - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Search Workspace Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-workspace-notes-deep /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/notes/search Deep keyword search scoped to one workspace, named in the path by `workspaceGuid`. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. This is the workspace-scoped successor to the deprecated `POST /v1/external/notes/search`. ## When to use this vs `GET /v1/external/workspaces/{workspaceGuid}/notes?keyword=...` - **`GET …/notes?keyword=…`** — lightweight: returns matched note metadata only. Cheaper. - **`POST …/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Which API keys work Unlike the deprecated `POST /v1/external/notes/search` (user-scoped keys only), this endpoint accepts user, workspace-system, and legacy team API keys. A key bound to a workspace must match the `workspaceGuid` in the path, otherwise the call returns `403`. A user-scoped key must belong to a member of the workspace, otherwise the call returns `403`. ## Behavior - Results stay inside the path workspace. Both note matching and document hydration are workspace-bounded, so cross-workspace notes never leak. - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Update Note Source: https://docs.tiro.ooo/api-reference/note/update-note /openapi.yaml patch /v1/external/notes/{noteGuid} Update a note's metadata (partial update). Currently only the note `title` can be changed. Requires the `note:write` scope. This follows the [AIP-134](https://google.aip.dev/134) field-mask convention: the required `updateMask` query parameter lists which fields to change, and only those fields are touched. A field named in `updateMask` but absent from the body (or sent as `null`) is treated as an error for `title`, since the title cannot be blank. # Create Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/create-voice-file-job /openapi.yaml post /v1/external/voice-file/jobs Create a new Voice File Job for audio transcription and optional translation. - Returns a presigned upload URI for your audio file - Optionally specify source language hints and target translation locales - Job starts in `CREATED` status — upload your file to begin processing - Targets a workspace where Voice File Jobs are enabled - Workspace-unbound user and organization keys must provide `workspaceGuid` - Uses word memories from the key's user, workspace, and organization scopes Documentation: [Complete workflow guide with code examples](/voice-file/tutorial) # Delete Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/delete-voice-file-job /openapi.yaml delete /v1/external/voice-file/jobs/{jobId} Delete a Voice File Job in any status, including while processing. Tiro removes the uploaded audio, transcript, and translations. The deleted job is no longer available through the API, and processing callbacks that arrive after deletion are ignored. # Get Transcript Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript Retrieve the transcribed text from a completed Voice File Job. - Job status must be `COMPLETED` - Returns the full transcript text and detected locales Documentation: [How to retrieve results](/voice-file/tutorial#step-5-retrieve-results) # Get Transcript Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript/paragraph-summary Retrieve AI-generated paragraph summaries from the transcript. - Provides a quick content overview in markdown format - Summaries are generated in the transcript's original language Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Translation Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale} Retrieve a specific translation by locale. - More efficient than listing all translations when you know the target locale - Job status must be `COMPLETED` Documentation: [Supported locales](/fundamentals/supported-locales) # Get Translation Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale}/paragraph-summary Retrieve AI-generated paragraph summaries from a translated version. - Summaries are generated in the target translation language - Requires the translation to exist for the specified locale Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/get-voice-file-job /openapi.yaml get /v1/external/voice-file/jobs/{jobId} Retrieve the current status and details of a Voice File Job. - Poll this endpoint until status reaches `COMPLETED` or `FAILED` - Once completed, use the transcript and translation endpoints to retrieve results Documentation: [Polling strategy and status meanings](/voice-file/overview#polling-strategy-recommended) # List Translations Source: https://docs.tiro.ooo/api-reference/voice-file/list-translations /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations List all translations generated for a Voice File Job. - Job status must be `COMPLETED` - Requires `translationLocales` to have been set during job creation - Returns translations for all requested locales Documentation: [How to retrieve translations](/voice-file/tutorial#step-5-retrieve-results) # Notify Upload Complete Source: https://docs.tiro.ooo/api-reference/voice-file/notify-upload-complete /openapi.yaml put /v1/external/voice-file/jobs/{jobId}/upload-complete Notify that audio file upload is complete and start processing. - Call this after uploading your file to the presigned URL from Create Voice File Job - Triggers the transcription (and optional translation) pipeline - Job status transitions: `CREATED` → `UPLOADED` → `PROCESSING` Documentation: [Step-by-step upload guide](/voice-file/tutorial#step-3-notify-upload-completion) # Create User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-user-word-memory /openapi.yaml post /v1/external/users/me/word-memories Register a new word to the user's personal word memory. Once registered, Tiro references this word during voice transcription to improve recognition accuracy. Useful for proper nouns, technical terms, or any word that standard speech-to-text may not recognize correctly. Duplicate entries (same `entry` value) are not allowed and will return `409 Conflict`. # List User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-user-word-memories /openapi.yaml get /v1/external/users/me/word-memories Retrieve user word memories with cursor-based pagination. Word memories help Tiro accurately recognize important terms — such as company names, people's names, and product names — during voice transcription. Registered words are referenced in real-time to reduce transcription errors. - Use `cursor` from previous response's `nextCursor` to paginate through results # Add or Update Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/add-or-update-workspace-member /openapi.yaml put /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently assign an existing organization member to an organization workspace, or update that workspace role. This endpoint does not create or invite users. # Get My Organization Source: https://docs.tiro.ooo/api-reference/organization/get-my-organization /openapi.yaml get /v1/external/organizations/me Retrieve the organization bound to the caller's API key. Requires an organization API key — keys issued by an organization admin from the organization console. Personal, workspace, and legacy team keys return `401`. Organization API keys carry fixed scopes (for example `note_document:write`) and can reach the notes in every workspace that belongs to the organization. Use this endpoint to verify which organization your key is bound to. # Get Organization Member Source: https://docs.tiro.ooo/api-reference/organization/get-organization-member /openapi.yaml get /v1/external/organizations/me/members/{userGuid} # List Organization Members Source: https://docs.tiro.ooo/api-reference/organization/list-organization-members /openapi.yaml get /v1/external/organizations/me/members List existing organization members. This endpoint does not create or invite users. # List Organization Notes Source: https://docs.tiro.ooo/api-reference/organization/list-organization-notes /openapi.yaml get /v1/external/organizations/me/notes List ended notes in the workspaces of the organization bound to the API key, with cursor-based pagination. A note is "ended" when its recording has finished (`recordingEndAt` is set) — the same condition that fires the `note.ended` webhook event. Filter by `endedAfter` / `endedBefore` (ISO 8601, applied to `recordingEndAt`) to bound the window. Results are ordered by note ID descending (newest-created first) with an ID-based cursor; the time filters bound the window, they do not change the sort order. # Remove Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/remove-workspace-member /openapi.yaml delete /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently remove an existing organization member from an organization workspace. # Resume Member Recording Source: https://docs.tiro.ooo/api-reference/organization/resume-member-recording /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently remove the member's recording suspension. # Revoke All Member Sessions Source: https://docs.tiro.ooo/api-reference/organization/revoke-all-member-sessions /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/sessions Revoke every current Tiro session for an existing organization member. The user can sign in again unless access is blocked by the identity provider. # Suspend Member Recording Source: https://docs.tiro.ooo/api-reference/organization/suspend-member-recording /openapi.yaml put /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently prevent the organization member from starting recordings. # Expand Wiki Graph Source: https://docs.tiro.ooo/api-reference/wiki/expand-wiki-graph /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/expand Expand the graph around a specific wiki page by traversing links up to a given depth. Returns 402 if wiki is not plan-eligible or not activated. # Get My Workspace Source: https://docs.tiro.ooo/api-reference/wiki/get-my-workspace /openapi.yaml get /v1/external/workspaces/me Retrieve the single workspace implicit in the caller's API key. Resolution follows the same order as `GET /v1/external/workspaces`: 1. Workspace-bound key → that workspace's GUID 2. Legacy team key → the team's workspace GUID 3. Personal/OAuth key → the user's default workspace GUID Used by the MCP server and CLI to fill the `{workspaceGuid}` path segment without requiring the caller to pass a workspace parameter explicitly. # Get Wiki Graph Around Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-around /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/around Retrieve the graph in the neighborhood of a wiki page (radius-based expansion). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Links Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-links /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/links Retrieve the graph of links between multiple wiki pages. Pass one or more page GUIDs as repeated `pageGuids` query parameters. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Seed Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-seed /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/seed Retrieve an initial set of nodes and edges for graph visualization. Optionally filter by page type, creation date, or search keyword. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Info Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-info /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki Retrieve metadata for the workspace's wiki (name, creation timestamp, etc.). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Page Details Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-page-details /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid} Retrieve full details for a wiki page, including body/description, mentions, aliases, and links. Returns 402 if wiki is not plan-eligible or not activated. # List Page Mentions Source: https://docs.tiro.ooo/api-reference/wiki/list-page-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid}/mentions List mentions (references from notes) for a specific wiki page with cursor-based pagination. Returns 402 if wiki is not plan-eligible or not activated. # List Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/list-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages List wiki pages with cursor-based pagination. Optionally filter by page type or creation date, or search by keyword (which reorders results by relevance and disables cursor pagination). Returns 402 if wiki is not plan-eligible or not activated. # List Workspaces Source: https://docs.tiro.ooo/api-reference/wiki/list-workspaces /openapi.yaml get /v1/external/workspaces List all workspaces accessible to the caller's API key or OAuth token. Resolution order: 1. Workspace-bound API key → the single bound workspace 2. Organization-bound API key → all active workspaces in the organization 3. Legacy team API key → the team's workspace 4. Personal/OAuth key → all workspaces the user is a member of Use this endpoint to enumerate workspaces when your account belongs to multiple workspaces, then pass the chosen workspace `guid` to the wiki endpoints. # Search Wiki Mentions Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/mentions Keyword-required search for mentions (references in notes). Returns ranked mentions with source context. Returns 402 if wiki is not plan-eligible or not activated. # Search Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/pages Keyword-required search for wiki pages. Returns pages ranked by full-text relevance. Returns 402 if wiki is not plan-eligible or not activated. # Bulk Create Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk Create multiple organization word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). Requires an **organization** API key. # Bulk Create User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk Create multiple word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs — against both existing entries and other items in the same request — are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). # Bulk Create Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Create multiple word memories in a workspace in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Requires a **user** API key that is a writable member of the workspace; a workspace-bound key must match the path. # Bulk Delete Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk-delete Delete multiple organization word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires an **organization** API key. # Bulk Delete User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk-delete Delete multiple word memories by ID (up to 1000). Non-existent or non-owned IDs are ignored; the response reports how many were actually deleted. # Bulk Delete Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk-delete Delete multiple workspace word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires a **user** API key that is a writable member of the workspace. # Bulk Update Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-organization-word-memories /openapi.yaml patch /v1/external/organizations/me/word-memories/bulk Update multiple organization word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires an **organization** API key. # Bulk Update User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-user-word-memories /openapi.yaml patch /v1/external/users/me/word-memories/bulk Update multiple word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. # Bulk Update Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-workspace-word-memories /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Update multiple workspace word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires a **user** API key that is a writable member of the workspace. # Create Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-organization-word-memory /openapi.yaml post /v1/external/organizations/me/word-memories Register a new word to the organization's shared word memory. Requires an **organization** API key. Duplicate entries (same `entry` + `subEntry`) are not allowed and return `409 Conflict`. # Create Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-workspace-word-memory /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories Register a new word to a workspace's shared word memory. Name the target workspace in the path with its `workspaceGuid`. Workspace word memories are accessible to all workspace members. Once registered, Tiro references this word during voice transcription for any member's recording. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. Duplicate entries (same `entry` value) are not allowed and return `409 Conflict`. # Delete Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-organization-word-memory /openapi.yaml delete /v1/external/organizations/me/word-memories/{wordMemoryId} Delete an organization word memory. This action is irreversible. Requires an **organization** API key. # Delete User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-user-word-memory /openapi.yaml delete /v1/external/users/me/word-memories/{wordMemoryId} Delete a word memory. This action is irreversible. Once deleted, Tiro will no longer reference this word during transcription. # Delete Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-workspace-word-memory /openapi.yaml delete /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Delete a workspace word memory. This action is irreversible. Once deleted, Tiro no longer references this word during transcription for any workspace member. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. # Get Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-organization-word-memory /openapi.yaml get /v1/external/organizations/me/word-memories/{wordMemoryId} Retrieve a specific organization word memory by ID. Requires an **organization** API key. # Get User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-user-word-memory /openapi.yaml get /v1/external/users/me/word-memories/{wordMemoryId} Retrieve a specific word memory by ID # Get Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-workspace-word-memory /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Retrieve a specific workspace word memory by ID. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. # List Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-organization-word-memories /openapi.yaml get /v1/external/organizations/me/word-memories List the organization's shared word memories with cursor-based pagination. These are shared across every workspace in the organization. Requires an **organization** API key (issued by an organization admin). Any other key type returns `401`. # List Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-workspace-word-memories /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories List a workspace's shared word memories with cursor-based pagination. Name the target workspace in the path with its `workspaceGuid` — obtain it from `GET /v1/external/workspaces`. Workspace word memories are shared among all workspace members. When any member records a meeting, Tiro references both personal and workspace word memories for accurate transcription. New members benefit from the shared vocabulary without additional setup. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. - Use `cursor` from the previous response's `nextCursor` to paginate through results. # Update Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-organization-word-memory /openapi.yaml patch /v1/external/organizations/me/word-memories/{wordMemoryId} Update an existing organization word memory. Only provided fields are updated (partial update). Requires an **organization** API key. # Update User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-user-word-memory /openapi.yaml patch /v1/external/users/me/word-memories/{wordMemoryId} Update an existing word memory. Only provided fields will be updated (partial update). # Update Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-workspace-word-memory /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Update an existing workspace word memory. Only provided fields are updated (partial update). Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. # Attach Note to Folder Source: https://docs.tiro.ooo/api-reference/folder/attach-note-to-folder /openapi.yaml post /v1/external/folders/{folderId}/notes Add an existing note to the folder. The note must belong to the same workspace as the folder. Requires edit access to the folder. Attaching a note that is already in the folder succeeds with no effect, so the call is safe to retry. # Create Folder Source: https://docs.tiro.ooo/api-reference/folder/create-folder /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/folders Create a folder in a workspace. Requires a **user** API key — you must be a writable member of the workspace. A team-only API key returns `401`. To nest the folder, set `parentId` (folders can be nested up to 5 levels below the root level). `sharingType` defaults to `ALL_MEMBER_VIEWER` when omitted. # Delete Folder Source: https://docs.tiro.ooo/api-reference/folder/delete-folder /openapi.yaml delete /v1/external/folders/{folderId} Delete a folder. The folder must have no subfolders — delete or move its children first. Requires edit access. This action is irreversible. # Detach Note from Folder Source: https://docs.tiro.ooo/api-reference/folder/detach-note-from-folder /openapi.yaml delete /v1/external/folders/{folderId}/notes/{noteGuid} Remove a note from the folder. This does not delete the note itself. Requires edit access to the folder. # Get Folder Source: https://docs.tiro.ooo/api-reference/folder/get-folder /openapi.yaml get /v1/external/folders/{folderId} Retrieve a single folder by ID. The workspace is resolved from the folder, so no workspace is needed in the path. Requires a **user** API key with access to the folder. # Get Folder Path Source: https://docs.tiro.ooo/api-reference/folder/get-folder-path /openapi.yaml get /v1/external/folders/{folderId}/path Retrieve the breadcrumb path from the root to the folder, inclusive. The first element is the top-level ancestor and the last element is the folder itself. Requires a **user** API key with access to the folder. Ancestors you cannot access appear with `isAccessible: false`. # Get Folder Tree Source: https://docs.tiro.ooo/api-reference/folder/get-folder-tree /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders/tree Retrieve the workspace folder hierarchy as a nested tree. Requires a **user** API key. The tree contains only folders you can access. When a folder's parent is not accessible to you, the folder appears at the root level of the tree instead. # List Folders Source: https://docs.tiro.ooo/api-reference/folder/list-folders /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/folders List the folders you can access in a workspace, as a flat array. Requires a **user** API key — folder access is evaluated per user via workspace membership. A team-only API key returns `401`. Create folders with `POST` on this same path. Read and manage individual folders with the endpoints under `/v1/external/folders/{folderId}`. # List Folders by Note Source: https://docs.tiro.ooo/api-reference/folder/list-folders-by-note /openapi.yaml get /v1/external/notes/{noteGuid}/folders Retrieve folders for a specific note # Move Folder Source: https://docs.tiro.ooo/api-reference/folder/move-folder /openapi.yaml put /v1/external/folders/{folderId}/move Move a folder under a new parent, or to the root level with `newParentId: null`. The target parent must be in the same workspace and you must have access to it. You cannot move a folder into its own subtree. Use `sharingTypeUpdateStrategy` to control how the folder's sharing permissions are handled after the move (defaults to `KEEP_EXISTING`). Requires edit access to the folder. # Reorder Folders Source: https://docs.tiro.ooo/api-reference/folder/reorder-folders /openapi.yaml post /v1/external/folders/reorder Set the display order of sibling folders. Provide every sibling's ID in the desired order; positions are assigned by array index. The workspace is inferred from the first folder ID. Requires edit access. # Update Folder Source: https://docs.tiro.ooo/api-reference/folder/update-folder /openapi.yaml patch /v1/external/folders/{folderId} Update a folder's title, description, color, or sharing type (partial update). Requires edit access. Changing `sharingType` to `PRIVATE` fails with `403` if the folder still has other members. `PATCH` cannot change the parent — use `PUT /v1/external/folders/{folderId}/move` to re-parent or move to the root. # Get Note Document Template Source: https://docs.tiro.ooo/api-reference/note-document-template/get-note-document-template /openapi.yaml get /v1/external/note-document-templates/{templateId} Retrieve a specific note document template by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Bound Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-bound-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/me/note-document-templates List the note document templates in the workspace bound to the API key, with cursor-based pagination. Use this with a workspace-scoped key when you do not want to pass the workspace GUID explicitly; the workspace is resolved the same way as `GET /v1/external/workspaces/me`. # List Managed Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-managed-note-document-templates /openapi.yaml get /v1/external/note-document-templates/managed List Tiro's built-in (managed) note document templates, with cursor-based pagination. Managed templates are curated by Tiro and shared across every account; they are read-only (`isManaged: true`, `isEditable: false`). Use the optional `locale` query parameter (BCP-47, for example `en-US`, `ko-KR`, `ja-JP`) to select the language of the returned templates. When omitted, a fallback locale is returned. # List Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates /openapi.yaml get /v1/external/note-document-templates Deprecated. Use the path-explicit list endpoints (users/me, workspaces, organizations/me). Resolves scope by API key type. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Document Templates Across Workspaces Source: https://docs.tiro.ooo/api-reference/note-document-template/list-note-document-templates-across-workspaces /openapi.yaml get /v1/external/workspaces/-/note-document-templates List note document templates across every workspace the API key can access, with cursor-based pagination. Pass the optional `workspaceGuids` query parameter (comma-separated, up to 50 GUIDs) to restrict the result to specific workspaces; omit it to include every accessible workspace. # List Organization Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-organization-note-document-templates /openapi.yaml get /v1/external/organizations/me/note-document-templates List the org-owned note document templates of the organization bound to the API key, with cursor-based pagination. Requires an organization API key; personal, workspace, and legacy team keys return `401`. # List User Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-user-note-document-templates /openapi.yaml get /v1/external/users/me/note-document-templates List the calling user's personal note document templates, with cursor-based pagination. Only templates the user owns personally are returned — workspace and organization templates are excluded. # List Workspace Note Document Templates Source: https://docs.tiro.ooo/api-reference/note-document-template/list-workspace-note-document-templates /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/note-document-templates List the note document templates in the specified workspace, with cursor-based pagination. The API key must be able to access the workspace in the path; a key bound to a different workspace returns `403`. # Generate Note Document Source: https://docs.tiro.ooo/api-reference/note-document/generate-note-document /openapi.yaml post /v1/external/notes/{noteGuid}/documents Generate a note document based on a template. - Blocks until document generation is complete (synchronous) - Requires `UPDATE_CONTENT` permission on the note - User must own the template or have team access See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Document Source: https://docs.tiro.ooo/api-reference/note-document/get-note-document /openapi.yaml get /v1/external/notes/{noteGuid}/documents/{documentId} Retrieve a specific note document by ID. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Documents Source: https://docs.tiro.ooo/api-reference/note-document/list-note-documents /openapi.yaml get /v1/external/notes/{noteGuid}/documents List all documents generated for a specific note. See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Delete Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/delete-share-link /openapi.yaml delete /v1/external/notes/{noteGuid}/share-link Delete the share link for a note. - Returns 204 even if already deleted (idempotent) # Get Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/get-share-link /openapi.yaml get /v1/external/notes/{noteGuid}/share-link Retrieve the current share link for a note. - Returns 404 if no share link exists - `sharePassword` is always `null` for security # Upsert Share Link Source: https://docs.tiro.ooo/api-reference/note-share-link/upsert-share-link /openapi.yaml put /v1/external/notes/{noteGuid}/share-link Create or update a share link for a note. - If no link exists, creates a new one. If it already exists, updates password settings. - An empty body `{}` creates a link without a password. ### `usePassword` behavior | `usePassword` | No existing link | Existing link | |---|---|---| | `null` (omit) | Create without password | Keep current state | | `true` | Create with password | (Re)generate password | | `false` | Create without password | Remove password | > `sharePassword` is only included when `usePassword: true`. Store it immediately — it cannot be retrieved later. # Get Note Summary Source: https://docs.tiro.ooo/api-reference/note-summary/get-note-summary /openapi.yaml get /v1/external/notes/{noteGuid}/summaries/{summaryId} Retrieve a specific summary with full content. - Default format: Markdown (`text/markdown`) - Use the `format` query parameter to request `text/plain` instead See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # List Note Summaries Source: https://docs.tiro.ooo/api-reference/note-summary/list-note-summaries /openapi.yaml get /v1/external/notes/{noteGuid}/summaries List all summaries generated for a specific note. - Returns summary metadata without content - To retrieve the full summary content, use the Get Note Summary endpoint See [Template Based Documents](/template-based-documents/summary-and-document) for more details. # Get Note Source: https://docs.tiro.ooo/api-reference/note/get-note /openapi.yaml get /v1/external/notes/{noteGuid} Retrieve a single note by its GUID # List Note Paragraphs Source: https://docs.tiro.ooo/api-reference/note/list-note-paragraphs /openapi.yaml get /v1/external/notes/{noteGuid}/paragraphs Returns a note's transcript as paragraphs — the "conversation notes" / transcript content (a speaker turn or topic chunk per paragraph). **Paywall masking (free / unpaid notes).** When a note exceeds the free usage limit and is not on a paid plan, the paragraphs past the limit are returned with their text content masked instead of withheld. Such paragraphs have `locked: true`. The first locked paragraph keeps a short readable preview (about the first 80 characters of `transcript`, and the summary header plus its first bullet); every locked paragraph after it is fully masked. Masking preserves length, whitespace, and structure but replaces the words with placeholder characters, so masked text reads as gibberish rather than the real transcript. Unlocked paragraphs (`locked: false`) are always returned in full. Starting a paid plan unlocks the note and removes the masking. A response where the transcript "cuts off partway" is almost always this masking, not a bug. # List Notes Source: https://docs.tiro.ooo/api-reference/note/list-notes /openapi.yaml get /v1/external/notes **Deprecated.** Use `GET /v1/external/workspaces/{workspaceGuid}/notes` for workspace-scoped listing. This endpoint stays available for backward compatibility. List notes with cursor-based pagination. When `keyword` is provided the result set is reordered by full-text relevance (with `createdAt` desc as tiebreaker) instead of `recordingStartAt` desc. Keyword search requires a user-scoped API key — team-only API keys with `keyword` set return `400`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # List Workspace Notes Source: https://docs.tiro.ooo/api-reference/note/list-workspace-notes /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/notes List the notes in a workspace with cursor-based pagination. This is the workspace-scoped successor to the deprecated `GET /v1/external/notes`. The API key must be scoped to the workspace in the path; a key bound to a different workspace returns `403`. Use `folderId` to scope the listing to a specific folder (recursive, including descendant folders). Combine with `createdAtFrom` / `createdAtTo` to bound the result by creation time. # Reserve Note GUID Source: https://docs.tiro.ooo/api-reference/note/reserve-note-guid /openapi.yaml post /v1/external/notes/guids Reserve a note GUID for later use in note creation. This allows you to: - Get a GUID before actually creating the note - Use the reserved GUID when creating a note with POST /v1/notes (internal API) - Reservation expires after 1 hour if not used **Use case**: When you need to know the note GUID before the note content is ready, such as setting up webhooks or references in advance. # Search Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-notes-deep /openapi.yaml post /v1/external/notes/search **Deprecated.** Use `POST /v1/external/workspaces/{workspaceGuid}/notes/search` for workspace-scoped deep search, which also accepts workspace-system and team API keys. This endpoint stays available for backward compatibility. Keyword-required deep search. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. ## When to use this vs `GET /v1/external/notes?keyword=...` - **`GET /v1/external/notes?keyword=...`** — lightweight: returns matched note metadata only. Cheaper. - **`POST /v1/external/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Behavior - Requires a user-scoped API key (team-only API keys return `400`). - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Search Workspace Notes (Deep) Source: https://docs.tiro.ooo/api-reference/note/search-workspace-notes-deep /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/notes/search Deep keyword search scoped to one workspace, named in the path by `workspaceGuid`. Returns notes hydrated with their primary documents (one-pager, custom) so an MCP/LLM client can read content alongside metadata in a single call. This is the workspace-scoped successor to the deprecated `POST /v1/external/notes/search`. ## When to use this vs `GET /v1/external/workspaces/{workspaceGuid}/notes?keyword=...` - **`GET …/notes?keyword=…`** — lightweight: returns matched note metadata only. Cheaper. - **`POST …/notes/search`** (this) — heavy: also returns the matched notes' documents. Use when you need to understand the context behind a topic, not just see which notes match. ## Which API keys work Unlike the deprecated `POST /v1/external/notes/search` (user-scoped keys only), this endpoint accepts user, workspace-system, and legacy team API keys. A key bound to a workspace must match the `workspaceGuid` in the path, otherwise the call returns `403`. A user-scoped key must belong to a member of the workspace, otherwise the call returns `403`. ## Behavior - Results stay inside the path workspace. Both note matching and document hydration are workspace-bounded, so cross-workspace notes never leak. - When the search index is unavailable or fails, the response sets `degraded=true` and `degradedReason` to one of `search_index_unavailable` / `search_index_degraded` and returns an empty `notes` array — clients should surface this to the user/LLM. - Document content is structured (`sections`); each document carries a `truncated` flag when the combined section text exceeded the 5,000 char search budget. - `nextCursor` is reserved for future use and is currently always `null`. # Update Note Source: https://docs.tiro.ooo/api-reference/note/update-note /openapi.yaml patch /v1/external/notes/{noteGuid} Update a note's metadata (partial update). Currently only the note `title` can be changed. Requires the `note:write` scope. This follows the [AIP-134](https://google.aip.dev/134) field-mask convention: the required `updateMask` query parameter lists which fields to change, and only those fields are touched. A field named in `updateMask` but absent from the body (or sent as `null`) is treated as an error for `title`, since the title cannot be blank. # Create Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/create-voice-file-job /openapi.yaml post /v1/external/voice-file/jobs Create a new Voice File Job for audio transcription and optional translation. - Returns a presigned upload URI for your audio file - Optionally specify source language hints and target translation locales - Job starts in `CREATED` status — upload your file to begin processing - Targets a workspace where Voice File Jobs are enabled - Workspace-unbound user and organization keys must provide `workspaceGuid` - Uses word memories from the key's user, workspace, and organization scopes Documentation: [Complete workflow guide with code examples](/voice-file/tutorial) # Delete Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/delete-voice-file-job /openapi.yaml delete /v1/external/voice-file/jobs/{jobId} Delete a Voice File Job in any status, including while processing. Tiro removes the uploaded audio, transcript, and translations. The deleted job is no longer available through the API, and processing callbacks that arrive after deletion are ignored. # Get Transcript Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript Retrieve the transcribed text from a completed Voice File Job. - Job status must be `COMPLETED` - Returns the full transcript text and detected locales Documentation: [How to retrieve results](/voice-file/tutorial#step-5-retrieve-results) # Get Transcript Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-transcript-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/transcript/paragraph-summary Retrieve AI-generated paragraph summaries from the transcript. - Provides a quick content overview in markdown format - Summaries are generated in the transcript's original language Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Translation Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale} Retrieve a specific translation by locale. - More efficient than listing all translations when you know the target locale - Job status must be `COMPLETED` Documentation: [Supported locales](/fundamentals/supported-locales) # Get Translation Paragraph Summary Source: https://docs.tiro.ooo/api-reference/voice-file/get-translation-paragraph-summary /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations/{locale}/paragraph-summary Retrieve AI-generated paragraph summaries from a translated version. - Summaries are generated in the target translation language - Requires the translation to exist for the specified locale Documentation: [Paragraph Summary feature](/voice-file/overview#paragraph-summary-feature) # Get Voice File Job Source: https://docs.tiro.ooo/api-reference/voice-file/get-voice-file-job /openapi.yaml get /v1/external/voice-file/jobs/{jobId} Retrieve the current status and details of a Voice File Job. - Poll this endpoint until status reaches `COMPLETED` or `FAILED` - Once completed, use the transcript and translation endpoints to retrieve results Documentation: [Polling strategy and status meanings](/voice-file/overview#polling-strategy-recommended) # List Translations Source: https://docs.tiro.ooo/api-reference/voice-file/list-translations /openapi.yaml get /v1/external/voice-file/jobs/{jobId}/translations List all translations generated for a Voice File Job. - Job status must be `COMPLETED` - Requires `translationLocales` to have been set during job creation - Returns translations for all requested locales Documentation: [How to retrieve translations](/voice-file/tutorial#step-5-retrieve-results) # Notify Upload Complete Source: https://docs.tiro.ooo/api-reference/voice-file/notify-upload-complete /openapi.yaml put /v1/external/voice-file/jobs/{jobId}/upload-complete Notify that audio file upload is complete and start processing. - Call this after uploading your file to the presigned URL from Create Voice File Job - Triggers the transcription (and optional translation) pipeline - Job status transitions: `CREATED` → `UPLOADED` → `PROCESSING` Documentation: [Step-by-step upload guide](/voice-file/tutorial#step-3-notify-upload-completion) # Bulk Create User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk Create multiple word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs — against both existing entries and other items in the same request — are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). # Bulk Create Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Create multiple word memories in a workspace in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Requires a **user** API key that is a writable member of the workspace; a workspace-bound key must match the path. # Bulk Delete User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-user-word-memories /openapi.yaml post /v1/external/users/me/word-memories/bulk-delete Delete multiple word memories by ID (up to 1000). Non-existent or non-owned IDs are ignored; the response reports how many were actually deleted. # Bulk Delete Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-workspace-word-memories /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories/bulk-delete Delete multiple workspace word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires a **user** API key that is a writable member of the workspace. # Bulk Update User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-user-word-memories /openapi.yaml patch /v1/external/users/me/word-memories/bulk Update multiple word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. # Bulk Update Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-workspace-word-memories /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/bulk Update multiple workspace word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires a **user** API key that is a writable member of the workspace. # Create User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-user-word-memory /openapi.yaml post /v1/external/users/me/word-memories Register a new word to the user's personal word memory. Once registered, Tiro references this word during voice transcription to improve recognition accuracy. Useful for proper nouns, technical terms, or any word that standard speech-to-text may not recognize correctly. Duplicate entries (same `entry` value) are not allowed and will return `409 Conflict`. # Create Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-workspace-word-memory /openapi.yaml post /v1/external/workspaces/{workspaceGuid}/word-memories Register a new word to a workspace's shared word memory. Name the target workspace in the path with its `workspaceGuid`. Workspace word memories are accessible to all workspace members. Once registered, Tiro references this word during voice transcription for any member's recording. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. Duplicate entries (same `entry` value) are not allowed and return `409 Conflict`. # Delete User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-user-word-memory /openapi.yaml delete /v1/external/users/me/word-memories/{wordMemoryId} Delete a word memory. This action is irreversible. Once deleted, Tiro will no longer reference this word during transcription. # Get User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-user-word-memory /openapi.yaml get /v1/external/users/me/word-memories/{wordMemoryId} Retrieve a specific word memory by ID # List User Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-user-word-memories /openapi.yaml get /v1/external/users/me/word-memories Retrieve user word memories with cursor-based pagination. Word memories help Tiro accurately recognize important terms — such as company names, people's names, and product names — during voice transcription. Registered words are referenced in real-time to reduce transcription errors. - Use `cursor` from previous response's `nextCursor` to paginate through results # List Workspace Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-workspace-word-memories /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories List a workspace's shared word memories with cursor-based pagination. Name the target workspace in the path with its `workspaceGuid` — obtain it from `GET /v1/external/workspaces`. Workspace word memories are shared among all workspace members. When any member records a meeting, Tiro references both personal and workspace word memories for accurate transcription. New members benefit from the shared vocabulary without additional setup. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. - Use `cursor` from the previous response's `nextCursor` to paginate through results. # Update User Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-user-word-memory /openapi.yaml patch /v1/external/users/me/word-memories/{wordMemoryId} Update an existing word memory. Only provided fields will be updated (partial update). # Add or Update Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/add-or-update-workspace-member /openapi.yaml put /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently assign an existing organization member to an organization workspace, or update that workspace role. This endpoint does not create or invite users. # Get My Organization Source: https://docs.tiro.ooo/api-reference/organization/get-my-organization /openapi.yaml get /v1/external/organizations/me Retrieve the organization bound to the caller's API key. Requires an organization API key — keys issued by an organization admin from the organization console. Personal, workspace, and legacy team keys return `401`. Organization API keys carry fixed scopes (for example `note_document:write`) and can reach the notes in every workspace that belongs to the organization. Use this endpoint to verify which organization your key is bound to. # Get Organization Member Source: https://docs.tiro.ooo/api-reference/organization/get-organization-member /openapi.yaml get /v1/external/organizations/me/members/{userGuid} # List Organization Members Source: https://docs.tiro.ooo/api-reference/organization/list-organization-members /openapi.yaml get /v1/external/organizations/me/members List existing organization members. This endpoint does not create or invite users. # List Organization Notes Source: https://docs.tiro.ooo/api-reference/organization/list-organization-notes /openapi.yaml get /v1/external/organizations/me/notes List ended notes in the workspaces of the organization bound to the API key, with cursor-based pagination. A note is "ended" when its recording has finished (`recordingEndAt` is set) — the same condition that fires the `note.ended` webhook event. Filter by `endedAfter` / `endedBefore` (ISO 8601, applied to `recordingEndAt`) to bound the window. Results are ordered by note ID descending (newest-created first) with an ID-based cursor; the time filters bound the window, they do not change the sort order. # Remove Workspace Member Source: https://docs.tiro.ooo/api-reference/organization/remove-workspace-member /openapi.yaml delete /v1/external/organizations/me/workspaces/{workspaceGuid}/members/{userGuid} Idempotently remove an existing organization member from an organization workspace. # Resume Member Recording Source: https://docs.tiro.ooo/api-reference/organization/resume-member-recording /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently remove the member's recording suspension. # Revoke All Member Sessions Source: https://docs.tiro.ooo/api-reference/organization/revoke-all-member-sessions /openapi.yaml delete /v1/external/organizations/me/members/{userGuid}/sessions Revoke every current Tiro session for an existing organization member. The user can sign in again unless access is blocked by the identity provider. # Suspend Member Recording Source: https://docs.tiro.ooo/api-reference/organization/suspend-member-recording /openapi.yaml put /v1/external/organizations/me/members/{userGuid}/recording-suspension Idempotently prevent the organization member from starting recordings. # Expand Wiki Graph Source: https://docs.tiro.ooo/api-reference/wiki/expand-wiki-graph /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/expand Expand the graph around a specific wiki page by traversing links up to a given depth. Returns 402 if wiki is not plan-eligible or not activated. # Get My Workspace Source: https://docs.tiro.ooo/api-reference/wiki/get-my-workspace /openapi.yaml get /v1/external/workspaces/me Retrieve the single workspace implicit in the caller's API key. Resolution follows the same order as `GET /v1/external/workspaces`: 1. Workspace-bound key → that workspace's GUID 2. Legacy team key → the team's workspace GUID 3. Personal/OAuth key → the user's default workspace GUID Used by the MCP server and CLI to fill the `{workspaceGuid}` path segment without requiring the caller to pass a workspace parameter explicitly. # Get Wiki Graph Around Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-around /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/around Retrieve the graph in the neighborhood of a wiki page (radius-based expansion). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Links Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-links /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/links Retrieve the graph of links between multiple wiki pages. Pass one or more page GUIDs as repeated `pageGuids` query parameters. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Graph Seed Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-graph-seed /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/graph/seed Retrieve an initial set of nodes and edges for graph visualization. Optionally filter by page type, creation date, or search keyword. Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Info Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-info /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki Retrieve metadata for the workspace's wiki (name, creation timestamp, etc.). Returns 402 if wiki is not plan-eligible or not activated. # Get Wiki Page Details Source: https://docs.tiro.ooo/api-reference/wiki/get-wiki-page-details /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid} Retrieve full details for a wiki page, including body/description, mentions, aliases, and links. Returns 402 if wiki is not plan-eligible or not activated. # List Page Mentions Source: https://docs.tiro.ooo/api-reference/wiki/list-page-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages/{pageGuid}/mentions List mentions (references from notes) for a specific wiki page with cursor-based pagination. Returns 402 if wiki is not plan-eligible or not activated. # List Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/list-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/pages List wiki pages with cursor-based pagination. Optionally filter by page type or creation date, or search by keyword (which reorders results by relevance and disables cursor pagination). Returns 402 if wiki is not plan-eligible or not activated. # List Workspaces Source: https://docs.tiro.ooo/api-reference/wiki/list-workspaces /openapi.yaml get /v1/external/workspaces List all workspaces accessible to the caller's API key or OAuth token. Resolution order: 1. Workspace-bound API key → the single bound workspace 2. Organization-bound API key → all active workspaces in the organization 3. Legacy team API key → the team's workspace 4. Personal/OAuth key → all workspaces the user is a member of Use this endpoint to enumerate workspaces when your account belongs to multiple workspaces, then pass the chosen workspace `guid` to the wiki endpoints. # Search Wiki Mentions Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-mentions /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/mentions Keyword-required search for mentions (references in notes). Returns ranked mentions with source context. Returns 402 if wiki is not plan-eligible or not activated. # Search Wiki Pages Source: https://docs.tiro.ooo/api-reference/wiki/search-wiki-pages /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/wiki/search/pages Keyword-required search for wiki pages. Returns pages ranked by full-text relevance. Returns 402 if wiki is not plan-eligible or not activated. # Bulk Create Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-create-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk Create multiple organization word memories in one request (up to 1000). Duplicate `(entry, subEntry)` pairs are silently skipped, so the response contains only the newly created entries. Safe to re-run (idempotent). Requires an **organization** API key. # Bulk Delete Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-delete-organization-word-memories /openapi.yaml post /v1/external/organizations/me/word-memories/bulk-delete Delete multiple organization word memories by ID (up to 1000). Non-existent IDs are ignored; the response reports how many were actually deleted. Requires an **organization** API key. # Bulk Update Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/bulk-update-organization-word-memories /openapi.yaml patch /v1/external/organizations/me/word-memories/bulk Update multiple organization word memories in one request (up to 1000). Processed atomically — if any `id` is not found (`404`) or an update would create a duplicate (`409`), the entire batch is rolled back. Requires an **organization** API key. # Create Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/create-organization-word-memory /openapi.yaml post /v1/external/organizations/me/word-memories Register a new word to the organization's shared word memory. Requires an **organization** API key. Duplicate entries (same `entry` + `subEntry`) are not allowed and return `409 Conflict`. # Delete Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-organization-word-memory /openapi.yaml delete /v1/external/organizations/me/word-memories/{wordMemoryId} Delete an organization word memory. This action is irreversible. Requires an **organization** API key. # Delete Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/delete-workspace-word-memory /openapi.yaml delete /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Delete a workspace word memory. This action is irreversible. Once deleted, Tiro no longer references this word during transcription for any workspace member. Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`. # Get Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-organization-word-memory /openapi.yaml get /v1/external/organizations/me/word-memories/{wordMemoryId} Retrieve a specific organization word memory by ID. Requires an **organization** API key. # Get Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/get-workspace-word-memory /openapi.yaml get /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Retrieve a specific workspace word memory by ID. Use a **user** or **workspace-bound** API key. A workspace-bound key must match the `workspaceGuid` in the path, or it returns `403`. A user key must belong to a member of the workspace, or it returns `403`. # List Organization Word Memories Source: https://docs.tiro.ooo/api-reference/word-memory/list-organization-word-memories /openapi.yaml get /v1/external/organizations/me/word-memories List the organization's shared word memories with cursor-based pagination. These are shared across every workspace in the organization. Requires an **organization** API key (issued by an organization admin). Any other key type returns `401`. # Update Organization Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-organization-word-memory /openapi.yaml patch /v1/external/organizations/me/word-memories/{wordMemoryId} Update an existing organization word memory. Only provided fields are updated (partial update). Requires an **organization** API key. # Update Workspace Word Memory Source: https://docs.tiro.ooo/api-reference/word-memory/update-workspace-word-memory /openapi.yaml patch /v1/external/workspaces/{workspaceGuid}/word-memories/{wordMemoryId} Update an existing workspace word memory. Only provided fields are updated (partial update). Requires a **user** API key — you must be a writable member of the workspace. A workspace-bound key must also match the `workspaceGuid` in the path. A system or team-only key (no user identity) returns `401`.