music-industry-research
Music industry research via the Recoup `/api/research/*` REST endpoints (backed by Songstats). Use when the user asks about an artist's analytics, streaming/follower numbers, audience demographics, playlist placements, similar artists, catalog/tracks, career activity, or any music industry research. Also use for finding people in the industry (managers, A&R), extracting data from URLs, or enriching entities with structured web research. Triggers include "Spotify followers", "monthly listeners", "TikTok followers", "Instagram audience", "playlist pitching", "competitive analysis", "how is [artist] doing", "research [artist]", "find me [people]", or any question about an artist's performance, market position, or industry contacts.
What this skill does
# Recoup Research
Music industry research through the Recoup API. All endpoints live under `https://api.recoupable.com/api/research` and authenticate with `x-api-key`. The research API is backed by **Songstats**, so entity IDs are short alphanumeric strings like `wjcgfd9i` (artists) or `1ik97vot` (tracks) — **not** the long numeric Chartmetric IDs older versions of this skill used.
```bash
export RECOUP_API_KEY="recoup_sk_..." # already set in Recoup sandboxes
export RECOUP_API="https://api.recoupable.com/api"
```
No key? Get one instantly (no dashboard, no email verification):
```bash
export RECOUP_API_KEY=$(curl -s -X POST "https://api.recoupable.com/api/agents/signup" \
-H "Content-Type: application/json" \
-d '{"email":"agent+'$(date +%s)-$RANDOM'@recoupable.com"}' | jq -r .api_key)
```
Reference docs: <https://developers.recoupable.com>
## Decision tree
Start here based on what the user asks:
- **"How is [artist] doing?"** → `metrics?source=spotify` + `insights` (+ `milestones` for recent events)
- **"Research [artist] for me"** → `profile` → parallel(`metrics`, `audience`, `similar`, `playlists`, `tracks`) → `web` or `deep` for narrative → synthesize
- **"Who should I pitch to?"** → `similar?audience=high&genre=high` → `playlists` on each peer → find playlists peers are on and your artist isn't
- **"Where is the audience?"** → `audience?platform=instagram|tiktok|youtube` (city-level geography is no longer a direct endpoint — use `web`/`deep` for it)
- **"Find me [people]"** → `POST /research/people` with `{ "query": "A&R reps at Atlantic" }`
- **"Tell me about [entity]"** → `POST /research/enrich` for structured data, or `POST /research/deep` for cited narrative
- **"What does this page say?"** → `POST /research/extract` with `{ "urls": [...] }`
- **"Where does this track get played?"** → search `type=tracks` for the track `id` → `track/playlists?id=<track id>`
- **"Find emerging / related artists"** → `similar` on a known anchor artist, then `metrics` to size each candidate (there is no `discover` or `charts` endpoint anymore)
If none match, start with `POST /research/web`.
Before researching: check if the artist already has a workspace `context/artist.md` — don't re-research what's known.
## Endpoints (quick reference)
Full curl examples, filter flag rules, latency budgets, and platform source enums live in **`references/endpoints.md`**.
| Endpoint | Returns |
| -------- | ------- |
| `GET /research?q=&type=artists\|tracks\|labels` | search → provider IDs |
| `GET /research/lookup?url=` or `?spotifyId=` | Spotify URL/ID → `artist_info` |
| `GET /research/profile?artist=` or `?id=` | bio, genres, country, links, related artists (**no** counts) |
| `GET /research/metrics?artist=&source=` | current snapshot stats (followers / listeners / playlists) |
| `GET /research/audience?artist=&platform=instagram\|tiktok\|youtube` | age / gender / country |
| `GET /research/similar?artist=&audience=&genre=&mood=&musicality=` | peer artists (flat list, no scores) |
| `GET /research/playlists?artist=&platform=&status=` | artist playlist placements (flat, single-shot) |
| `GET /research/tracks?artist=` | catalog |
| `GET /research/career?artist=` | career activity feed |
| `GET /research/insights?artist=` | AI observations |
| `GET /research/milestones?artist=` | activity feed (playlist adds, chart entries) |
| `GET /research/urls?artist=` | social / streaming URLs |
| `GET /research/albums?artist_id=` | albums (provider artist ID, 5 credits) |
| `GET /research/track?id=` | track detail + audio analysis (provider track ID, 5 credits) |
| `GET /research/track/playlists?id=` (filter flags) | playlists featuring a track (5 credits, paginates) |
| `POST /research/web` | web search (~seconds) |
| `POST /research/deep` | comprehensive cited report (~2+ min) |
| `POST /research/people` | industry people search (~seconds-tens) |
| `POST /research/extract` | URL → markdown excerpts (~seconds-tens) |
| `POST /research/enrich` | structured extraction with schema (~60-90s) |
## Critical gotchas
These are the failure modes that will eat your time. Full rationale in `references/endpoints.md` and `references/response-shapes.md`.
- **Provider IDs are short alphanumeric strings** (`wjcgfd9i`), not numeric Chartmetric IDs. Get them via `GET /research?q=...&type=...`. There is **no `beta` flag and no `match_strength` score** anymore — search returns `results[]`; disambiguate by `name` / `avatar` / `site_url` (and `release_date` / `artists[]` for tracks). Empty `results` → fall through to graceful degradation.
- **Removed endpoints (these all 404 — don't call them):** `cities`, `charts`, `discover`, `genres`, `festivals`, `radio`, `venues`, `rank`, `instagram-posts`, `playlist` (singular), `curator`. Geography now comes from `audience` (+ `web`/`deep`); discovery from `similar` + `web`.
- **`/research/profile` carries NO follower/listener counts** (and no `career_stage`). Those numbers live in `/research/metrics`, which returns a **current snapshot**, not a time series.
- **Most artist endpoints accept `artist=<name>` OR `id=<provider id>`.** Use the name for convenience; use the id (from search/lookup) for an exact entity. ID-only detail endpoints (`albums`, `track`, `track/playlists`) need the provider id.
- **Playlist filter flags live on `track/playlists` only, and are exclusive when set.** `?editorial=true` alone returns ONLY editorials; to get editorial *plus* the defaults pass all four: `&editorial=true&indie=true&majorCurator=true&popularIndie=true`. The artist-level `/research/playlists` has **no** filter flags and returns a flat `placements[]` snapshot (no `offset` paging).
- **`/research/track` has NO per-song TikTok fields** (`tt_uses`, `tt_views`, etc.) — the API does not expose per-song TikTok counts. Don't look for them and don't fabricate them.
- **`/research/metrics` uses `youtube_channel` or `youtube_artist`**, not plain `youtube`. `/research/audience?platform=` accepts only `instagram | tiktok | youtube`.
- **`/research/enrich` schemas must include `"type":"object"` at the top level.** The endpoint rejects schemas without it.
- **POST endpoints have real latency.** `/enrich` 60–90s, `/deep` 2+ min, others seconds-to-tens. Set client timeouts to ≥3 min for `/enrich` and `/deep` or you'll falsely abort successful calls.
- **Empty arrays are legit.** `/research/milestones` and `/research/audience` commonly return `[]` even for established artists — that's not an error; don't retry or escalate, degrade instead.
- **Cold-cache calls can return a transient error/`202` — retry before giving up.** The research API caches provider data, so a *cold* GET (`career`, `playlists`, `metrics`, etc.) can come back `status: "error"` or `202 { state: "refresh_pending" }` and then succeed on the very next call. Retry once or twice with a short sleep before treating it as "no data" — a single transient error is **not** proof the artist has no data. (Distinct from a genuinely empty `[]` above, which is stable across retries.)
- **Don't guess field names.** Importance on activity feeds is `activity_tier` (integer, lower = more significant), not a star rating; placements are flat (`placements[].playlist_name`), and `followers_total` is a human-readable string like `"34.3M"`. Full real shapes in `references/response-shapes.md`.
## Graceful degradation
Fall through to web research if **any** of these are true:
- `GET /research?q=...` returns `{ results: [] }`
- `GET /research/lookup?url=...` returns non-200
- `/research/profile` comes back with mostly `null` fields
Then:
1. `POST /research/web` — ranked results
2. `POST /research/enrich` — structured facts (~60–90s)
3. `POST /research/deep` — cited narrative (~2+ min)
For very emerging artists, the provider may have no structured data — web + enrich + deep is the fallback.
## How to use the data
Don't dump raw JSON. Combine endpoints, draw conclusions, save to the artist workspace if there is one. InterRelated in Ads & Marketing
ads
IncludedMulti-platform paid advertising audit and optimization skill. Analyzes Google, Meta, YouTube, LinkedIn, TikTok, Microsoft, and Apple Ads. 250+ checks with scoring, parallel agents, industry templates, and AI creative generation.
banana
IncludedAI image generation Creative Director powered by Google Gemini Nano Banana models. Use this skill for ANY request involving image creation, editing, visual asset production, or creative direction. Triggers on: generate an image, create a photo, edit this picture, design a logo, make a banner, visual for my anything, and all /banana commands. Handles text-to-image, image editing, multi-turn creative sessions, batch workflows, and brand presets.
rpg-migration-analyzer
IncludedAnalyzes legacy RPG (Report Program Generator) programs from AS/400 and IBM i systems for migration to modern Java applications. Extracts business logic from RPG III/IV/ILE source code, identifies data structures (D-specs), file operations (F-specs), program dependencies (CALLB/CALLP), and converts RPG constructs to Java equivalents. Generates migration reports, complexity estimates, and Java implementation strategies with POJO classes, JPA entities, and service methods. Use when modernizing AS/400 or IBM i legacy systems, analyzing RPG source files (.rpg, .rpgle, .RPGLE), converting RPG to Java, mapping data specifications to Java classes, planning legacy system migration, or when user mentions RPG analysis, Report Program Generator, RPG III/IV/ILE, AS/400 modernization, IBM i migration, packed decimal conversion, or mainframe application rewrite.
brand-library-architect
IncludedBuild a complete brand library for a product — visual asset render pipeline, brand documentation set (BRAND, COPY, MANIFESTO, BIOS, FAQ, GLOSSARY, TONE, PRICING), open-source convention files (README, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT), and a self-contained press kit. This skill should be used when the user asks to "build a brand library / brand kit / press kit / brand assets" for a product, "set up a brand library workflow," "create a positioning manifesto plus visual identity," or any combination of brand documentation + visual asset pipeline. Apply phase-by-phase or run end-to-end. Templates are product-agnostic and use {{TOKEN}} placeholders the skill prompts the user to fill.
writing-tech-post
IncludedAuthors engineering blog posts end-to-end: launch deep-dives, incident postmortems, architecture migrations, performance case studies, tutorials, AI/agent system writeups, security disclosures, and research-to-product translations. Picks the correct archetype, plans the abstraction ladder, enforces an evidence cadence (diagrams, benchmarks, profiles, traces, code, ablations), tunes voice against publisher house styles (Datadog, Vercel, GitHub, AWS, Meta, Cloudflare, Jane Street), and runs a pre-publish gate for narrative momentum and disclosure ethics. Use when drafting a new engineering post, restructuring a draft that feels flat, deciding which evidence form belongs where, validating that depth and product context are balanced, or preparing a postmortem, migration, or performance narrative for external publication. Do not use for API reference documentation, README authoring, marketing copy, release notes, generic SEO content, ghost-written executive thought leadership, or non-engineering long-form essays.
blog-google
IncludedGoogle API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity analysis for E-E-A-T, YouTube video search for embedding, and Google Ads Keyword Planner. Progressive feature availability based on credential tier (API key, OAuth/service account, GA4, Ads). Shares config with claude-seo at ~/.config/claude-seo/google-api.json. Use when user says "google data", "page speed", "core web vitals", "search console", "indexation", "GA4", "keyword research", "nlp entities", "blog performance", "youtube search", "google api setup".