{"skill":{"slug":"podsips-search","displayName":"PodSips Podcast Search","summary":"Search podcast transcripts and retrieve episode data via the PodSips API. Use when user asks to \"search podcasts\", \"find podcast clips\", \"get transcript\", \"l...","description":"---\nname: podsips-search\ndescription: Search podcast transcripts and retrieve episode data via the PodSips API. Use when user asks to \"search podcasts\", \"find podcast clips\", \"get transcript\", \"look up episode\", \"search what was said on\", or needs podcast content for research, summarization, or citation. Requires PODSIPS_API_KEY environment variable.\nversion: 1.2.0\nauthor: PodSips\nhomepage: https://developer.podsips.com\nmetadata: { \"clawdbot\": { \"requires\": { \"env\": [\"PODSIPS_API_KEY\"], \"bins\": [\"curl\", \"jq\"] }, \"primaryEnv\": \"PODSIPS_API_KEY\" } }\n---\n\n# PodSips Podcast Search API\n\nSearch across indexed podcast transcripts using semantic search, retrieve full transcripts, get episode and series metadata, and request new podcasts to be added.\n\n## Important\n\n- All requests require the `PODSIPS_API_KEY` environment variable. Pass it as `Authorization: Bearer $PODSIPS_API_KEY`.\n- Base URL: `https://api.podsips.com/public/v1`\n- All responses are JSON.\n- Credit costs are deducted per request. Most endpoints cost 1 credit. Full transcripts cost 5 credits. Podcast requests are free.\n- If the user does not have a PodSips API key, follow the steps in the **Getting an API Key** section below to walk them through setup.\n\n## Getting an API Key\n\nBefore using any endpoint, the user needs a PodSips API key. If `PODSIPS_API_KEY` is not set, walk the user through these steps:\n\n1. Go to **https://developer.podsips.com**\n2. Click **Sign in with Google** to create an account (this is the only sign-in method).\n3. After signing in, they will be prompted to register a developer account if they don't have one yet. Complete the registration form.\n4. Once on the dashboard, navigate to the **API Keys** section.\n5. Click **Generate API Key**. Copy the key — it is only shown once.\n6. Set the key as an environment variable so this skill can use it:\n   ```bash\n   export PODSIPS_API_KEY=\"ps_live_...\"\n   ```\n\nEvery new account starts on the **Free tier** with 100 credits per month. If the user needs more credits, they can upgrade their plan on the dashboard at https://developer.podsips.com.\n\n## Prerequisites\n\nVerify the API key is set before making any requests:\n\n```bash\ntest -n \"$PODSIPS_API_KEY\" && echo \"API key is set\" || echo \"ERROR: Set PODSIPS_API_KEY first. See the 'Getting an API Key' section above.\"\n```\n\n## Instructions\n\n### 1. Search podcast transcripts\n\nUse semantic search to find relevant podcast clips matching a query. This is the primary endpoint.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/search?q=artificial+intelligence+ethics&top_k=5\" | jq .\n```\n\n**Parameters:**\n- `q` (required) — Search query text\n- `top_k` (optional, default 10) — Number of results to return\n- `series_id` (optional) — Filter to a specific podcast series UUID\n- `episode_id` (optional) — Filter to a specific episode UUID\n- `speakers` (optional) — Filter by speaker name\n\n**Response shape:**\n```json\n{\n  \"groups\": [\n    {\n      \"episode\": {\n        \"uuid\": \"episode-uuid\",\n        \"name\": \"Episode Title\",\n        \"description\": \"Episode description...\",\n        \"date_published\": \"2025-01-15T00:00:00Z\",\n        \"podcast_uuid\": \"series-uuid\",\n        \"speakers\": [\"Host Name\", \"Guest Name\"]\n      },\n      \"podcast\": {\n        \"uuid\": \"series-uuid\",\n        \"name\": \"Series Title\",\n        \"description\": \"Series description...\"\n      },\n      \"chunks\": [\n        {\n          \"uuid\": \"chunk-uuid\",\n          \"text\": \"The transcript text of the matching segment...\",\n          \"start_time\": 120.5,\n          \"end_time\": 185.3,\n          \"duration\": 64.8,\n          \"episode_uuid\": \"episode-uuid\",\n          \"podcast_uuid\": \"series-uuid\",\n          \"speakers\": [\"Speaker Name\"],\n          \"timestamped_podcast_link\": \"podsips://episode-uuid?t=120\",\n          \"episode_image_url\": \"https://...\",\n          \"podcast_image_url\": \"https://...\"\n        }\n      ]\n    }\n  ],\n  \"chunks\": [\n    {\n      \"uuid\": \"chunk-uuid\",\n      \"text\": \"...\",\n      \"start_time\": 120.5,\n      \"end_time\": 185.3,\n      \"duration\": 64.8,\n      \"episode_uuid\": \"episode-uuid\",\n      \"podcast_uuid\": \"series-uuid\",\n      \"speakers\": [\"Speaker Name\"],\n      \"timestamped_podcast_link\": \"podsips://episode-uuid?t=120\",\n      \"episode_image_url\": \"https://...\",\n      \"podcast_image_url\": \"https://...\"\n    }\n  ],\n  \"meta\": {\n    \"total_chunks\": 3,\n    \"episodes_represented\": 3,\n    \"query\": \"artificial intelligence ethics\"\n  }\n}\n```\n\nResults are returned in two formats: `groups` organizes chunks by episode (each group contains an `episode` object, a `podcast` object, and the matching `chunks`), while the top-level `chunks` array is a flat list of all matching chunks across episodes. The `meta` object provides summary information about the results.\n\nEach chunk includes the transcript text, timestamps in seconds (`start_time`, `end_time`, `duration`), speaker names, and image URLs. Use `start_time` and `end_time` to reference specific moments.\n\n**Speaker tags in transcript text:** Chunk `text` fields may contain raw speaker tags inline such as `<<SPEAKER_00>>`, `<<SPEAKER_01>>`, or `<<UNKNOWN>>`. Replace these with the actual speaker names from the `speakers` array, or strip them before displaying to the user.\n\n**`timestamped_podcast_link`:** This is a `podsips://` deep link that opens the PodSips app at the specific episode and timestamp. It is intended for mobile app deep linking. If the user is not using the PodSips app, you can ignore this field and use `start_time` directly for timestamp references.\n\n**Cost:** 1 credit per request.\n\n### 2. Search for a podcast series\n\nSearch for a podcast series by name or description. Use this when the user asks about a specific podcast to check if it exists in the database before falling back to a podcast request.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/series/search?q=Y+Combinator&limit=5\" | jq .\n```\n\n**Parameters:**\n- `q` (required) — Search query text (searches series name and description)\n- `genre` (optional) — Filter by genre (case-insensitive)\n- `limit` (optional, default 20, max 100) — Number of results to return\n- `offset` (optional, default 0) — Pagination offset\n\n**Response shape:**\n```json\n[\n  {\n    \"id\": \"uuid\",\n    \"name\": \"Y Combinator Startup Podcast\",\n    \"description\": \"We help founders make something people want...\",\n    \"image_url\": \"https://...\",\n    \"genre\": \"technology\",\n    \"episode_count\": 56\n  }\n]\n```\n\nReturns an empty array if no matching series are found.\n\n**Cost:** 1 credit per request.\n\n### 3. List available podcast series\n\nBrowse all podcast series in the database with optional genre filtering and pagination.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/series?limit=20&offset=0\" | jq .\n```\n\n**Parameters:**\n- `genre` (optional) — Filter by genre\n- `limit` (optional) — Number of results\n- `offset` (optional) — Pagination offset\n\n**Response shape:**\n```json\n[\n  {\n    \"id\": \"uuid\",\n    \"name\": \"Podcast Name\",\n    \"description\": \"Description of the podcast\",\n    \"image_url\": \"https://...\",\n    \"genre\": \"Technology\",\n    \"episode_count\": 42\n  }\n]\n```\n\n**Cost:** 1 credit per request.\n\n### 4. Get series details with episodes\n\nRetrieve a specific series and all its available episodes.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/series/{series_id}\" | jq .\n```\n\nReplace `{series_id}` with the UUID from the series list or search results.\n\n**Response shape:**\n```json\n{\n  \"id\": \"uuid\",\n  \"name\": \"Podcast Name\",\n  \"description\": \"...\",\n  \"image_url\": \"https://...\",\n  \"genre\": \"Technology\",\n  \"rss_url\": \"https://...\",\n  \"website_url\": \"https://...\",\n  \"episodes\": [\n    {\n      \"id\": \"uuid\",\n      \"name\": \"Episode Title\",\n      \"description\": \"...\",\n      \"date_published\": \"2025-01-15T00:00:00Z\",\n      \"duration\": 3600,\n      \"image_url\": \"https://...\",\n      \"series_id\": \"uuid\",\n      \"speakers\": [\"Host Name\", \"Guest Name\"]\n    }\n  ]\n}\n```\n\nOnly episodes with complete transcripts are included.\n\n**Cost:** 1 credit per request.\n\n### 5. Get episode details\n\nRetrieve metadata and speaker information for a specific episode.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/episodes/{episode_id}\" | jq .\n```\n\n**Response shape:**\n```json\n{\n  \"id\": \"uuid\",\n  \"name\": \"Episode Title\",\n  \"description\": \"...\",\n  \"date_published\": \"2025-01-15T00:00:00Z\",\n  \"duration\": 3600,\n  \"audio_url\": \"https://...\",\n  \"image_url\": \"https://...\",\n  \"series_id\": \"uuid\",\n  \"series_name\": \"Podcast Name\",\n  \"speakers\": [\n    {\"generic_label\": \"Speaker 1\", \"identity\": \"Dr. Jane Smith\"},\n    {\"generic_label\": \"Speaker 2\", \"identity\": \"John Doe\"}\n  ]\n}\n```\n\n**Cost:** 1 credit per request.\n\n### 6. Get transcript context around a timestamp\n\nRetrieve transcript text around a specific moment in an episode. Useful for expanding context around a search result.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/episodes/{episode_id}/context?position=120&pre_seconds=60&post_seconds=15\" | jq .\n```\n\n**Parameters:**\n- `position` (required) — Timestamp in seconds\n- `pre_seconds` (optional, default 60) — Seconds of context before the position\n- `post_seconds` (optional, default 15) — Seconds of context after the position\n\n**Response shape:**\n```json\n{\n  \"episode_id\": \"uuid\",\n  \"position\": 120.0,\n  \"pre_context_seconds\": 60,\n  \"post_context_seconds\": 15,\n  \"pre_context\": [\n    {\"speaker\": \"Dr. Jane Smith\", \"text\": \"What they said before...\", \"start\": 62.1, \"end\": 68.5}\n  ],\n  \"post_context\": [\n    {\"speaker\": \"John Doe\", \"text\": \"What they said after...\", \"start\": 120.5, \"end\": 134.2}\n  ]\n}\n```\n\n**Cost:** 1 credit per request.\n\n### 7. Get full episode transcript\n\nRetrieve the complete transcript for an episode. All chunks are returned in chronological order.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/episodes/{episode_id}/transcript\" | jq .\n```\n\n**Response shape:**\n```json\n{\n  \"episode_id\": \"uuid\",\n  \"episode_name\": \"Episode Title\",\n  \"total_chunks\": 55,\n  \"chunks\": [\n    {\n      \"chunk_index\": 0,\n      \"text\": \"Welcome to the show...\",\n      \"start_time\": 0.0,\n      \"end_time\": 65.2,\n      \"word_count\": 180,\n      \"speakers\": [\"Host Name\"]\n    }\n  ]\n}\n```\n\n**Cost:** 5 credits per request (higher cost due to large data volume).\n\n### 8. Request a missing podcast\n\nIf the user's desired podcast is not in the database, submit a request to add it. This is free and does not consume credits.\n\n```bash\ncurl -s -X POST -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"podcast_name\": \"The Podcast Name\", \"rss_url\": \"https://feeds.example.com/podcast.xml\"}' \\\n  \"https://api.podsips.com/public/v1/podcast-requests\" | jq .\n```\n\n**Parameters:**\n- `podcast_name` (required) — Name of the podcast to add\n- `rss_url` (optional) — RSS feed URL, if known\n\n**Response:** Returns a request ID and status. Processing typically takes 24-48 hours.\n\n**Cost:** Free (0 credits).\n\n### 9. Check podcast request status\n\nCheck whether a previously submitted podcast request has been processed.\n\n```bash\ncurl -s -H \"Authorization: Bearer $PODSIPS_API_KEY\" \\\n  \"https://api.podsips.com/public/v1/podcast-requests/{request_id}\" | jq .\n```\n\n**Response shape:**\n```json\n{\n  \"id\": \"uuid\",\n  \"podcast_name\": \"The Podcast Name\",\n  \"rss_url\": \"https://...\",\n  \"status\": \"pending\",\n  \"resulting_series_id\": null,\n  \"created_at\": \"2025-06-01T12:00:00Z\",\n  \"updated_at\": \"2025-06-01T12:00:00Z\"\n}\n```\n\nStatus values: `pending`, `processing`, `complete`, `rejected`. When `status` is `complete`, `resulting_series_id` contains the UUID of the new series.\n\n**Cost:** Free (0 credits).\n\n## Recommended Workflow\n\nWhen a user asks you to find information from podcasts:\n\n1. **Search first.** Use the search endpoint with the user's query. If results are relevant, present the transcript excerpts with episode names, speaker names, and timestamps.\n\n2. **Expand context if needed.** If a search result is interesting but the user wants more context around that moment, use the context endpoint with the `start_time` from the search result as the `position`.\n\n3. **Get the full transcript when appropriate.** If the user wants a complete transcript or wants to analyze an entire episode, use the transcript endpoint. Note this costs 5 credits.\n\n4. **Handle missing podcasts.** If search returns no results and the user is asking about a specific podcast:\n   a. Use `GET /series/search?q=...` to check if the podcast exists in the database by name.\n   b. If found, use the series UUID to filter transcript search results with `series_id`.\n   c. If not found, use `POST /podcast-requests` to submit it.\n   d. Tell the user: \"This podcast is not in the PodSips database yet. I have submitted a request to add it. Processing typically takes 24-48 hours. No credits were used for this request.\"\n   e. If the user asks again later, check the request status with `GET /podcast-requests/{id}`.\n\n5. **Cite your sources.** When presenting information from podcast transcripts, include the episode name, series name, speaker, and timestamp so the user can verify or listen to the original audio.\n\n## Error Handling\n\n**HTTP 401 — Invalid or missing API key.** Verify `PODSIPS_API_KEY` is set and valid. The user may need to generate a new key at https://developer.podsips.com.\n\n**HTTP 402 — Insufficient credits.** The developer account has run out of credits for the current billing cycle. The user needs to upgrade their plan or wait for the next billing cycle.\n\n**HTTP 429 — Rate limit exceeded.** Too many requests in the current time window. Wait briefly and retry. Rate limits vary by subscription tier.\n\n**HTTP 404 — Resource not found.** The series, episode, or podcast request ID does not exist.\n\n## Credit Cost Summary\n\n| Endpoint | Credits |\n|----------|---------|\n| Search | 1 |\n| Series search | 1 |\n| List series | 1 |\n| Series detail | 1 |\n| Episode detail | 1 |\n| Transcript context | 1 |\n| Full transcript | 5 |\n| Submit podcast request | 0 |\n| Check request status | 0 |\n","tags":{"latest":"1.2.0"},"stats":{"comments":0,"downloads":354,"installsAllTime":2,"installsCurrent":2,"stars":0,"versions":3},"createdAt":1771456335458,"updatedAt":1778491578254},"latestVersion":{"version":"1.2.0","createdAt":1771898816245,"changelog":"Added series search endpoint (GET /public/v1/series/search?q=) for looking up podcasts by name or description","license":null},"metadata":{"setup":[{"key":"PODSIPS_API_KEY","required":true}],"os":null,"systems":null},"owner":{"handle":"snook550","userId":"s17dek7znc35mb993q60194j3s885a4g","displayName":"Paul Wakim","image":"https://avatars.githubusercontent.com/u/50852541?v=4"},"moderation":null}