---
name: Otter Fetch
slug: otter-fetch
category: Automation
description: Otter Fetch obtains Otter.ai transcript JSON for other skills that need notes or speaker names. Use it when a meeting note contains an Otter URL and you need cached callouts or participant extraction.
github: "https://github.com/benoror/obsidianos_work/tree/main/.agents/skills/otter-fetch"
language: JavaScript
stars: 165
forks: 13
install: "npx degit https://github.com/benoror/obsidianos_work/tree/main/.agents/skills/otter-fetch ~/.claude/skills/otter-fetch"
installs_to: ~/.claude/skills/otter-fetch
source_path: .agents/skills/otter-fetch/SKILL.md
collection_size: 24
category_size: 2226
collection_url: "https://dirskills.com/collections/benoror/obsidianos_work"
added: 2026-09-08T05:35:07.814Z
last_synced: 2026-09-08T05:35:07.814Z
canonical_url: "https://dirskills.com/skills/otter-fetch"
---

# Otter Fetch

Otter Fetch obtains Otter.ai transcript JSON for other skills that need notes or speaker names. Use it when a meeting note contains an Otter URL and you need cached callouts or participant extraction.

**Install:**

```bash
npx degit https://github.com/benoror/obsidianos_work/tree/main/.agents/skills/otter-fetch ~/.claude/skills/otter-fetch
```

## README

# Otter Fetch

Single place for **obtaining Otter.ai transcript data**. No direct slash command — other skills invoke this when they encounter an Otter.ai URL (e.g. in `Notes:` frontmatter).

## Usage

This skill has **no slash command**. It's a sub-skill: `/cache-notes` and `/fill-participants` invoke its workflow (and run `parse_otter.js`) when a meeting's `Notes:` contains an `https://otter.ai/u/...` URL.

## When to use

- **cache-notes**: When caching a meeting that has `https://otter.ai/u/{otid}` in `Notes:` — need callout markdown to embed.
- **fill-participants**: When resolving participants for a meeting that only has Otter links (no Google Doc) — need speaker names from the transcript.

## How to get the data

Otter has no public API. Use **user-pasted JSON**:

1. **Extract `otid`** from the URL: `https://otter.ai/u/aBcDeFgHiJkLmNoPqRsT` → `otid = aBcDeFgHiJkLmNoPqRsT`.
2. **Ask the user** to copy the JSON response from `GET https://otter.ai/forward/api/v1/speech?otid={otid}` (e.g. from DevTools → Network while signed in, or from a signed-in request).
3. User pastes the JSON; the agent (or script) parses it.

## Outputs (same JSON, different consumers)

The pasted JSON has `speech` with:

| Use case | What to use | How |
|----------|-------------|-----|
| **cache-notes** | Callout markdown | Run `parse_otter.js` with JSON on stdin → stdout is `## 🤖 AI Notes` / `### Otter` block with `[!otter_notes]-`, `[!otter_todos]-`, `[!otter_transcript]-`. |
| **fill-participants** | Speaker names | From `speech.speakers`: array of `{ speaker_name }`. Use those names with [people-resolver](../_shared/people-resolver.md) to build `Participants:`. |

So one paste can serve both skills if needed (e.g. cache-notes runs the script; fill-participants reads `speech.speakers` from the same JSON or from the cached transcript callout).

## Script: parse_otter.js

In this folder: **parse_otter.js** reads the full Otter speech JSON from stdin and writes **callout markdown** to stdout (for cache-notes).

```bash
node .agents/skills/otter-fetch/parse_otter.js < pasted.json
```

Output is the exact block to append under `## 🤖 AI Notes` (including `### Otter` and the three callouts). Caller appends it to the note and sets `NotesCached:`.

## Important notes

- Always extract `otid` from the share URL (query params like `?utm_source=copy_url` can be ignored).
- If the user doesn't have the JSON, they can open the Otter meeting page while signed in, open DevTools → Network, reload, and copy the response body of the `speech?otid=...` request.
