docs: design overhaul + Skills tab + API doc merge#145
docs: design overhaul + Skills tab + API doc merge#145recoupableorg wants to merge 38 commits intomainfrom
Conversation
- Theme: mint → sequoia with achromatic colors, Plus Jakarta Sans headings, Inter body - Background: "windows" decoration, dark mode #080808, always-dark code blocks - Navigation: reorganized into Overview/Research/Releases/Content/Social/Platform tabs - Homepage: aligned with "music intelligence" positioning, 3-mode access pattern, LLM endpoint table - Quickstart: leads with research endpoint, CLI inline, MCP connection step - Agent onboarding: simplified to agent-only flow, human verification moved to auth page - Authentication: use-case guidance at top, consolidated key creation methods - All guide pages: tighter copy, proof numbers, brand voice compliance - No API reference files touched (auto-generated from OpenAPI) Made-with: Cursor
Old categories organized by data type (Releases, Social, Platform). New categories organized by what agents actually do: - Research: ALL intelligence from ANY source (chat, research, Spotify, Instagram, X, web intel, social scraping) - Artists: roster management (artists, songs, catalogs, fans, segments, posts, comments) - Content: media production (pipeline, 7 primitives, content agent) - Automation: scheduled agent work (tasks, sandboxes, connectors, pulses, notifications) - Accounts: business infrastructure (agent onboarding, accounts, orgs, workspaces, subscriptions, admins) Key moves: - Tasks out of "Releases" → Automation (they automate anything, not just releases) - Sandboxes out of "Content" → Automation (agent execution infrastructure) - Connectors out of "Social" → Automation (OAuth for any tool, not just social) - Spotify/Instagram/X into Research (they're data sources) - Fans/Segments/Posts/Comments into Artists (audience is part of roster context) - Research split into Artist Research + Web Intelligence subgroups - Content split into Pipeline + Primitives subgroups - Homepage updated with real value prop from strategy docs - Recoupable wordmark logos (clean vector SVGs) Made-with: Cursor
… on "tools" - New Catalog tab: Songs + Catalogs separated from Artists (catalogs are label-level, not artist-level) - Artists tab: now just roster management + fans/segments - Connectors moved from Automation → Accounts (they're per-account OAuth connections) - "Primitives" → "Content Tools", "endpoints" → "tools" everywhere (matches marketing "40+ agent tools") - Homepage cards updated to reflect 7-tab structure Made-with: Cursor
… contexts - Homepage intro + meta descriptions: "40+ tools" (marketing copy) - MCP page: "tools" (MCP protocol term) - All technical docs: "endpoints" (industry standard for API docs) Made-with: Cursor
… to Recoupable
Homepage now has the narrative structure of world-class docs:
- Problem statement ("Running a record label takes a team")
- What is Recoupable? (infrastructure for agents to run labels)
- Core concepts table (Artist, Catalog, Chat, Task, Sandbox, Pulse, Connector)
- How it works flow (Connect → Research → Build context → Create → Automate)
- Then quickstart, interfaces, API reference, guides, agent endpoint map
Inspired by Claude Managed Agents (concepts table, how-it-works steps),
Paperclip (problem-first framing), and OpenClaw (clear what-is explanation).
Site name: "Recoup" → "Recoupable" everywhere.
Made-with: Cursor
Agent Onboarding (agents.mdx) is now a real operating manual for AI agents: 1. Authenticate — key reuse, email verification flow with exact user prompt 2. Understand the roster — list artists, orgs, scoping behavior 3. Know the sandbox filesystem — full directory structure, RECOUP.md, content readiness 4. Decide what to do — decision tree (have roster? → research or create? → save? → automate?) Homepage changes: - Agent callout links to Agent guide (not Quickstart) — agents need the operating manual - Tightened intro to one paragraph (problem + solution, no repetition) - Info callout instead of Note/Tip (neutral styling) - AccordionGroup for core concepts Made-with: Cursor
agent+ emails are NOT linked to the base email address. agent+sidney@recoupable.com creates a completely separate account from sidney@recoupable.com. Email lookup uses exact match with no plus-address normalization (verified from selectAccountByEmail code). Made-with: Cursor
- POST /api/content/create marked as legacy with Warning callout - Individual content endpoints (generate-image, generate-video, etc.) moved to top of Content tab - Templates split into own group - Pipeline moved to "Pipeline (Legacy)" group at bottom - Removed content readiness section from Agent Onboarding (face guide not universally required) - Added proactive roster check instruction after auth in Agent Onboarding Made-with: Cursor
- Homepage: refined problem statement, dropped "the", removed condescending copy - Agent Onboarding: "user"→"human", Steps for auth flow, manage as work type, smarter task guidelines, filesystem not "sandbox filesystem", fixed content readiness reference, agent+ email warning with generic email - Navigation: Automation→Tasks (time-based only), Sandboxes→Accounts (infrastructure) - Content: pipeline endpoint marked legacy, individual endpoints promoted - OpenAPI create.mdx: deprecation warning added Made-with: Cursor
- Core concepts: reduced to 4 essentials (Account, Organization, Artist, Filesystem) - Dropped Catalog, Task, Chat, Connector, Pulse, Sandbox from core concepts - Back to clean table format (cards were too cramped) - Intro copy: "That's what agents are for." bridge, no jargon - Agent onboarding: "human" not "user", manage as work type, task guidelines - Tasks tab renamed from Automation, Sandboxes moved to Accounts - Content pipeline marked legacy Made-with: Cursor
…esearch Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
…ndpoints Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
…ttern Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Combine the design/narrative overhaul (new 8-tab IA, deprecation notices, rebuilt Agent Onboarding, achromatic design system) with all API doc updates shipped to main since the branch diverged: - 8 research PRs (#132-#140): schema hardening, /research/track id-proxy, /research/curator Chartmetric contract, /research/track/playlists, error responses aligned with handler enforcement - Artist surface rename: /api/artist/socials -> /api/artists/{id}/socials - New endpoints: artists/pin, artists/unpin, admins/agent-signups - Removed dead surfaces: artist/segments, chat/segment, segment/fans - Caption length default -> none Conflict resolutions: - docs.json: kept design IA (Overview/Chat/Research/Artists/Catalog/Content/ Automation/Accounts), spliced in all new endpoints from main, removed stale nav refs to deleted surfaces - index.mdx, quickstart.mdx: kept design copy (richer, superseded main's verbose endpoint listing with card-based IA) - openapi/content.json: auto-merge preserved design's deprecation of /api/content/create alongside main's untouched body research.json, accounts.json, releases.json are byte-identical to main. 131 API mdx files / 131 nav entries / 0 orphans / 0 broken intra-doc links. Made-with: Cursor
Home page:
- Rewrote "How it works" as the actual agent loop (authenticate,
find scope, read context, decide/act, persist) instead of a
narrative recap of the API taxonomy — removes ~80% overlap with
the "What's in the API" cards
- Rewrote all 7 home cards for voice — killed overclaims ("the
business infrastructure," "the engine that lets agents work
while you sleep," "Everything about any artist from any
source") and led each card with verbs the endpoints actually
let you do
- Added a Chat card (was missing from the grid despite having its
own tab)
- Research and Artists cards updated to reflect deleted segment
endpoints and renamed artist socials path
Test-key pattern removed from production paths:
- index.mdx: the agent+ snippet/Tip, the "For AI agents" footer
claim, and Step 1's testing caveat — all replaced with the real
2-call signup+verify flow
- quickstart.mdx: headline demo and tagline now show the honest
flow ("API key in 2 calls. First request in minutes.")
- authentication.mdx: dropped the "Instant (for agents)"
subsection that framed agent+ as a feature
- agents.mdx retained as the one place agent+ is documented,
already warning it creates a separate account
Skills tab (new):
- Added top-level Skills tab positioned last in nav
- Overview page (skills.mdx) covers concept, install, SKILL.md
contract, and contribution flow
- 10 per-skill pages under skills/ — each summarizes when the
agent uses it, what it produces, and which API endpoints it
depends on, with source link to the canonical SKILL.md on
github.com/recoupable/skills
- Sidebar groups skills into Foundational / Research & analytics
/ Creative work (mirrors the API tab's sub-grouping pattern)
- No content duplication from source repo — docs pages add
docs-side context the SKILL.md can't provide (endpoint
cross-refs, when-to-use phrasing)
Research tab nav:
- Replaced the flat 26-page "Artist Research" group with main's
sub-grouping: Artist discovery, Metrics & insights, Catalog,
Playlists & curators, Charts & radio, Touring & live, Web
intelligence
Brand:
- Recoupable -> Recoup (display name only — URLs, GitHub org,
npm package, email addresses untouched)
- New logos wired: wordmark-{light,dark}mode.svg for the header,
removed stale dark.png/dark.svg/light.svg
- New icon/wordmark SVGs staged in logo/ for future favicon use
- Font system: Geist Pixel Square (heading, local woff2) +
Geist Variable (body, local woff2); removed Google Fonts
dependency on Plus Jakarta Sans + Inter
- fonts/ directory seeded with Geist / GeistMono / GeistPixel /
InstrumentSerif / PlusJakartaSans — variable woff2 where
available, ttf fallback otherwise, no redundant weights
Ancillary fixes found during review:
- agents.mdx: "fan segments" -> "fan data" (segments were
deleted on main)
Made-with: Cursor
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughReworks docs into an agent-first operating manual: adds a two-step agent signup/verify auth flow with Changes
Sequence Diagram(s)sequenceDiagram
participant Agent as Agent (client)
participant Auth as Auth Service
participant API as Recoup REST API
participant FS as Sandbox Filesystem
participant MCP as MCP Server
Agent->>Auth: POST /api/agents/signup (email)
Auth-->>Agent: 200 (sent 6-digit code)
Agent->>Auth: POST /api/agents/verify (email, code)
Auth-->>Agent: 200 (api_key)
Agent->>API: GET /api/accounts or /api/roster (x-api-key)
API-->>Agent: 200 (accounts, artists, orgs)
Agent->>FS: GET /api/sandboxes (x-api-key)
FS-->>Agent: 200 (sandbox list)
Agent->>FS: POST /api/sandboxes/files (upload with x-api-key)
Agent->>API: Calls (research/content/tasks) (x-api-key)
API-->>MCP: Optional MCP interactions (Bearer or forwarded tooling calls)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (2)
skills/getting-started.mdx (1)
12-14: Clarify environment variable setup.The description states this produces "A working
RECOUP_API_KEYenvironment variable," but the referenced endpoints (POST /api/agents/signupandPOST /api/agents/verify) return the API key in the response body, not as an environment variable. The skill would need to explicitly set the environment variable after receiving the key response. Consider rewording to: "A working API key (stored asRECOUP_API_KEY)" or "An API key from signup/verify, configured asRECOUP_API_KEYenvironment variable."📝 Suggested rewording for clarity
## What it produces -A working `RECOUP_API_KEY` environment variable, the chosen base URL (REST or MCP), and a verified first response. +An API key from signup/verify (configured as `RECOUP_API_KEY` environment variable), the chosen base URL (REST or MCP), and a verified first response.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@skills/getting-started.mdx` around lines 12 - 14, Update the sentence "A working `RECOUP_API_KEY` environment variable, the chosen base URL (REST or MCP), and a verified first response." in the getting-started content: clarify that the signup/verify endpoints return an API key in the response and the user must store it as an environment variable; replace the phrase with one of the suggested rewordings such as "A working API key (stored as `RECOUP_API_KEY`), the chosen base URL (REST or MCP), and a verified first response" or "An API key from signup/verify, configured as the `RECOUP_API_KEY` environment variable" so it correctly reflects that the key is returned by POST /api/agents/signup and POST /api/agents/verify and must then be set as an env var.authentication.mdx (1)
42-98: Minor: HMAC-SHA256 storage note is duplicated.The "stored as HMAC-SHA256 hashes" fact appears both in the
<Warning>at line 42 and again in the Security section at line 96. Consider keeping one authoritative mention (e.g., the Security section) and trimming the Warning to just the "shown once / cannot be retrieved" guidance.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@authentication.mdx` around lines 42 - 98, The HMAC-SHA256 storage note is duplicated between the <Warning> block and the Security section; edit the content so the Warning only states that keys are shown once and cannot be retrieved (remove the "stored as HMAC-SHA256 hashes" phrase) and keep the HMAC-SHA256 storage detail exclusively in the Security section; update the <Warning> text near the "Keys are shown once" line and verify the Security section still includes the full "Keys stored as HMAC-SHA256 hashes — never plaintext" sentence.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cli.mdx`:
- Around line 230-264: The "Content creation pipeline" CLI docs still promote
the deprecated monolithic command (examples showing "recoup content
create")—update the CLI docs section for "content" to warn users that POST
/api/content/create is deprecated and point them to the new individual
subcommands (e.g., "recoup generate-image", "recoup generate-video", "recoup
generate-caption", and the new "recoup content templates/validate/estimate"
flow); add a brief Note/Warning immediately under the section title referencing
those new subcommands and replace or augment the "Create" examples so they show
the recommended split commands or a forward-reference to where users can find
the new commands.
In `@content-agent.mdx`:
- Around line 44-54: The table's displayed endpoint paths (e.g., "POST
/api/content/image", "POST /api/content/video", "POST /api/content/caption",
"POST /api/content/transcribe", "PATCH /api/content", "POST
/api/content/upscale", "POST /api/content/analyze") should be updated to match
the canonical documented paths used in the linked references (use the exact
canonical endpoints from the API reference pages), and explicitly mark "POST
/api/content/create" as legacy; update the table cell text for each row to the
canonical path string used in the reference links and add a "(legacy)" note
beside "POST /api/content/create" so readers are not directed to the deprecated
pipeline.
In `@docs.json`:
- Around line 5-9: The docs color palette is inconsistent: colors.dark is set to
"#171717" but must match the achromatic brand primary "#0a0a0a"; update the
colors object so colors.dark equals colors.primary ("#0a0a0a") to keep the
palette consistent with the primary brand color, and ensure the theme
("sequoia") and any validation rules accept "#0a0a0a" as the correct primary
value (refer to colors.primary and colors.dark in the JSON).
In `@index.mdx`:
- Around line 130-136: The Content card currently links to a deprecated endpoint
via href="/api-reference/content/create"; update the Card component (the
instance with title="Content" and icon="sparkles") to point to a supported
endpoint such as "/api-reference/content/generate-image" (or another valid
supported path like "/api-reference/content/generate-video" or
"/api-reference/content/generate-caption") so the landing page directs users to
a non-deprecated API surface.
In `@mcp.mdx`:
- Around line 16-27: The snippet uses the undefined RECOUP_API_KEY in the
template literal passed to StreamableHTTPClientTransport; declare and initialize
RECOUP_API_KEY before creating transport (e.g., read from environment or set a
placeholder value) so the transport construction has a defined Authorization
value; update the top of the snippet near the import block so symbols
StreamableHTTPClientTransport, transport, and Client remain unchanged and the
client.connect call works when copied.
In `@skills/artist-workspace.mdx`:
- Around line 18-21: Replace the incorrect endpoint label `GET
/api/artist/profile` with the canonical `GET /api/artists/{id}` and update its
reference link so it points to the correct OpenAPI page for the artist profile
(use the same pattern as the other links, e.g., change the link target that
currently points to the profile page to the artists/{id} reference). Ensure the
visible text and the URL both use `GET /api/artists/{id}` so users are directed
to the correct API surface.
In `@skills/trend-to-song.mdx`:
- Line 14: Replace the user-facing typo "ship-window" in the sentence beginning
"A trend brief (what the moment is, why it's resonating, who's reacting)..."
with a clearer phrase such as "shipping window" (or "short window" if you prefer
concision) so the copy reads "...a tight shipping window before the moment
fades." Update that exact phrase in the skills/trend-to-song content.
---
Nitpick comments:
In `@authentication.mdx`:
- Around line 42-98: The HMAC-SHA256 storage note is duplicated between the
<Warning> block and the Security section; edit the content so the Warning only
states that keys are shown once and cannot be retrieved (remove the "stored as
HMAC-SHA256 hashes" phrase) and keep the HMAC-SHA256 storage detail exclusively
in the Security section; update the <Warning> text near the "Keys are shown
once" line and verify the Security section still includes the full "Keys stored
as HMAC-SHA256 hashes — never plaintext" sentence.
In `@skills/getting-started.mdx`:
- Around line 12-14: Update the sentence "A working `RECOUP_API_KEY` environment
variable, the chosen base URL (REST or MCP), and a verified first response." in
the getting-started content: clarify that the signup/verify endpoints return an
API key in the response and the user must store it as an environment variable;
replace the phrase with one of the suggested rewordings such as "A working API
key (stored as `RECOUP_API_KEY`), the chosen base URL (REST or MCP), and a
verified first response" or "An API key from signup/verify, configured as the
`RECOUP_API_KEY` environment variable" so it correctly reflects that the key is
returned by POST /api/agents/signup and POST /api/agents/verify and must then be
set as an env var.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 046b2141-5f46-4cd6-b3bf-94c4cdbc07d6
⛔ Files ignored due to path filters (19)
fonts/Geist/Geist-Variable.woff2is excluded by!**/*.woff2fonts/Geist/Geist-VariableItalic.woff2is excluded by!**/*.woff2fonts/GeistMono/GeistMono-Variable.woff2is excluded by!**/*.woff2fonts/GeistMono/GeistMono-VariableItalic.woff2is excluded by!**/*.woff2fonts/GeistPixel/GeistPixel-Circle.woff2is excluded by!**/*.woff2fonts/GeistPixel/GeistPixel-Grid.woff2is excluded by!**/*.woff2fonts/GeistPixel/GeistPixel-Line.woff2is excluded by!**/*.woff2fonts/GeistPixel/GeistPixel-Square.woff2is excluded by!**/*.woff2fonts/GeistPixel/GeistPixel-Triangle.woff2is excluded by!**/*.woff2fonts/InstrumentSerif/InstrumentSerif-Italic.ttfis excluded by!**/*.ttffonts/InstrumentSerif/InstrumentSerif-Regular.ttfis excluded by!**/*.ttffonts/PlusJakartaSans/PlusJakartaSans-Variable.ttfis excluded by!**/*.ttffonts/PlusJakartaSans/PlusJakartaSans-VariableItalic.ttfis excluded by!**/*.ttflogo/dark.pngis excluded by!**/*.pnglogo/icon-darkmode.svgis excluded by!**/*.svglogo/icon-lightmode.svgis excluded by!**/*.svglogo/light.svgis excluded by!**/*.svglogo/wordmark-darkmode.svgis excluded by!**/*.svglogo/wordmark-lightmode.svgis excluded by!**/*.svg
📒 Files selected for processing (21)
agents.mdxapi-reference/openapi/content.jsonauthentication.mdxcli.mdxcontent-agent.mdxdocs.jsonfonts/InstrumentSerif/OFL.txtindex.mdxmcp.mdxquickstart.mdxskills.mdxskills/artist-workspace.mdxskills/chart-metric.mdxskills/content-creation.mdxskills/getting-started.mdxskills/music-industry-research.mdxskills/release-management.mdxskills/setup-sandbox.mdxskills/song-writing.mdxskills/streaming-growth.mdxskills/trend-to-song.mdx
| - [`GET /api/artists`](/api-reference/artists/list) | ||
| - [`POST /api/artists`](/api-reference/artists/create) | ||
| - [`GET /api/artist/profile`](/api-reference/artist/profile) | ||
| - [`GET /api/artists/{id}/socials`](/api-reference/artists/socials) |
There was a problem hiding this comment.
Use the canonical artist profile endpoint in the endpoint list.
Line 20 still advertises GET /api/artist/profile, but the provided OpenAPI context identifies the artist profile surface as GET /api/artists/{id}. The current label can send users to the wrong API path.
📝 Proposed endpoint-label fix
- [`GET /api/artists`](/api-reference/artists/list)
- [`POST /api/artists`](/api-reference/artists/create)
-- [`GET /api/artist/profile`](/api-reference/artist/profile)
+- [`GET /api/artists/{id}`](/api-reference/artist/profile)
- [`GET /api/artists/{id}/socials`](/api-reference/artists/socials)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - [`GET /api/artists`](/api-reference/artists/list) | |
| - [`POST /api/artists`](/api-reference/artists/create) | |
| - [`GET /api/artist/profile`](/api-reference/artist/profile) | |
| - [`GET /api/artists/{id}/socials`](/api-reference/artists/socials) | |
| - [`GET /api/artists`](/api-reference/artists/list) | |
| - [`POST /api/artists`](/api-reference/artists/create) | |
| - [`GET /api/artists/{id}`](/api-reference/artist/profile) | |
| - [`GET /api/artists/{id}/socials`](/api-reference/artists/socials) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@skills/artist-workspace.mdx` around lines 18 - 21, Replace the incorrect
endpoint label `GET /api/artist/profile` with the canonical `GET
/api/artists/{id}` and update its reference link so it points to the correct
OpenAPI page for the artist profile (use the same pattern as the other links,
e.g., change the link target that currently points to the profile page to the
artists/{id} reference). Ensure the visible text and the URL both use `GET
/api/artists/{id}` so users are directed to the correct API surface.
There was a problem hiding this comment.
10 issues found across 40 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="skills/artist-workspace.mdx">
<violation number="1" location="skills/artist-workspace.mdx:20">
P2: The endpoint path is documented incorrectly: `/api/artist/profile` should be `/api/artist-profile` to match the linked API reference and OpenAPI spec.</violation>
</file>
<file name="skills/content-creation.mdx">
<violation number="1" location="skills/content-creation.mdx:18">
P2: The endpoint paths shown in this list are inconsistent with the actual OpenAPI routes, which can mislead users into calling non-existent URLs.</violation>
</file>
<file name="agents.mdx">
<violation number="1" location="agents.mdx:104">
P2: The sandbox upload example uses an invalid request shape for `POST /api/sandboxes/files` (`files[].path` instead of required `files[].name` with optional top-level `path`), which will cause copied requests to fail validation.</violation>
</file>
<file name="index.mdx">
<violation number="1" location="index.mdx:133">
P2: Update the Content card to link to a supported endpoint (e.g., generate-image) instead of the deprecated /api/content/create surface.</violation>
<violation number="2" location="index.mdx:177">
P3: This card says agents get an API key “in one call,” but the page now documents a required two-call signup + verify flow.</violation>
<violation number="3" location="index.mdx:202">
P1: Custom agent: **Flag AI Slop and Fabricated Changes**
The new "complete endpoint map" is factually incorrect: it includes removed/nonexistent routes (for example `chat/segment`, `artist/segments`, `segment/fans`) and therefore documents API behavior that is not implemented.</violation>
</file>
<file name="authentication.mdx">
<violation number="1" location="authentication.mdx:81">
P2: The new access-control section omits `organization_id` authorization rules, which conflicts with other docs and can mislead integrators into incorrect scoping assumptions.</violation>
</file>
<file name="cli.mdx">
<violation number="1" location="cli.mdx:259">
P3: Flag the `recoup content create` example as legacy or direct users to the individual generate-image/video/caption subcommands so the CLI docs don’t push the deprecated pipeline.</violation>
</file>
<file name="docs.json">
<violation number="1" location="docs.json:432">
P1: Custom agent: **Flag AI Slop and Fabricated Changes**
Rule 2 violation: the PR claims the GitHub org URL is unchanged, but this diff changes GitHub links to a different org URL in docs.json. Update the links or correct the PR claim so behavior and documentation match.</violation>
</file>
<file name="skills/release-management.mdx">
<violation number="1" location="skills/release-management.mdx:19">
P1: Custom agent: **Flag AI Slop and Fabricated Changes**
This adds a non-existent API route (`GET /api/songs/songs`) in the endpoint list. Per the rule’s fabricated-reference clause, endpoint names must match real routes; use `GET /api/songs`.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
Deprecated content-pipeline promotions (flagged by coderabbit + cubic): - index.mdx Content card: repointed href from the deprecated /api-reference/content/create to /api-reference/content/generate-image - content-agent.mdx: replaced "use /api/content/create to run the full pipeline" blurb with a Note marking it legacy and pointing new integrations at the individual endpoints above - cli.mdx: retitled "Create" section to "Create (legacy pipeline)", added a Note directing new integrations to the per-primitive subcommands (recoup content image / video / caption) Wrong API paths in endpoint lists (flagged by cubic, verified against the OpenAPI specs): - skills/content-creation.mdx: /api/content/generate-image -> /api/content/image (same for video/caption/transcribe-audio/analyze-video/edit) - skills/trend-to-song.mdx: same content-endpoint path corrections - skills/artist-workspace.mdx: /api/artist/profile -> /api/artist-profile - skills/release-management.mdx: /api/songs/songs -> /api/songs index.mdx "For AI agents" endpoint table: - The table mixed doc-slugs with real API paths, listed deleted routes (chat/segment, artist/segments, segment/fans), and drifted every time the API shape changed. Replaced with a pointer section listing the 5 OpenAPI specs by category. Canonical source of truth, zero drift risk. index.mdx Agent onboarding card: - "API key in one call" was stale (we now document the 2-call signup + verify flow). Updated to "API key in two calls (signup + verify)". mcp.mdx TypeScript setup snippet: - RECOUP_API_KEY was referenced without being declared, so copy-paste would ReferenceError. Added `const RECOUP_API_KEY = process.env.RECOUP_API_KEY;`. agents.mdx sandbox upload example: - Request body used files[].path, but the OpenAPI schema requires files[].name + top-level path. Rewrote the curl example with the correct shape and a comment explaining the split. authentication.mdx Access control: - The new section only covered account_id scoping. Added the parallel rules for organization_id and artist_account_id so integrators don't assume the three parameters share one code path. docs.json: - colors.dark: #171717 -> #0a0a0a to align with the achromatic brand palette (per repo brand guidance). Did not fix (comment invalid): - cubic#8 flagged docs.json GitHub org URL change as a "rebrand contradiction", but origin/main had github.com/recoupable-com which returns 404, and github.com/recoupable (this PR) returns 200. The change is a correctness fix, not a rebrand deviation. - coderabbit#2 said content-agent.mdx table paths don't match the docs; I verified the table uses real API paths (/api/content/image) and the links use docs-page slugs (/api-reference/content/generate-image). Both correct for what they link to; no mismatch. Made-with: Cursor
There was a problem hiding this comment.
1 issue found across 11 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="index.mdx">
<violation number="1" location="index.mdx:209">
P2: The Accounts OpenAPI row incorrectly lists connectors; `/api/connectors` is in `social.json`, not `accounts.json`. This misroutes API consumers looking up connector schemas.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
Reconcile main's endpoint changes with the design-overhaul nav structure:
- Add api-reference/subscriptions/sessions-create under Accounts > Subscriptions
- Drop deleted pages: api-reference/x/{search,trends},
api-reference/social/posts, api-reference/post/comments,
api-reference/songs/catalogs-{create,delete}
- Remove now-empty "X (Twitter)" group from Research tab
Made-with: Cursor
Replace internal "memories" terminology with "messages" in user-facing descriptions of chat message endpoints. Database tables remain unchanged (still named `memories` and `memory_emails` internally) — this only affects what API consumers see in the docs. Made-with: Cursor
- Move GitHub link from sidebar anchors to navbar; remove Launch App (redundant with primary "Get API Key" CTA). Sidebar now starts cleanly at content rather than competing external links. - Set background.color to match Mintlify's gray-50 / gray-900 tab-bar chrome so the tab bar and page background blend seamlessly. Made-with: Cursor
The docs claimed capabilities that didn't match reality, which causes agents following the docs to hit "command not found" or miss most of what the platform exposes. This brings the agent-facing pages back in sync with what's actually shipped. CLI (`cli.mdx`): - Remove the entire `## research` section (~100 lines of fictional examples). The CLI has no `research` command in v0.1.13. - Trim the `content` section to the four subcommands that exist (`templates`, `validate`, `estimate`, `create`); drop the misleading "legacy pipeline" framing that pointed agents at non-existent `image`/`video`/`caption` subcommands. - Add the real `songs` command (`presets`, `analyze`) which was shipped but never documented. - Add a clear beta status note at the top with explicit guidance for agents to fall back to REST when a CLI command isn't listed. MCP (`mcp.mdx`): - Replace the previous 2-tool description with the full catalog of 43 production tools across 11 domains (Artists, Catalog, Chats, Content, Research, Spotify, YouTube, Tasks, Pulses, Sandbox, Utilities). All tool names and descriptions extracted directly from `api/lib/mcp/tools/register*.ts` source. - Remove the fictional `run_sandbox_command` tool that never existed. - Drop the "beta" framing — 43 working tools is just under-marketed production, not beta. Index + Quickstart: - Replace `recoup research "Any Artist"` (fictional) with `recoup whoami` / `recoup artists list` (real) on the homepage CLI card. - Remove the fictional `recoup research "Drake"` snippet from the quickstart; the curl path stays as the primary integration story. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
skills/content-creation.mdx (1)
2-3: Use a human-readable page title in frontmatterLine 2 uses a slug-style title (
content-creation). ConsiderContent Creationfor clearer nav/readability while keeping the filename slug unchanged.As per coding guidelines: "Use clear, self-documenting titles and descriptions in documentation."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@skills/content-creation.mdx` around lines 2 - 3, Update the frontmatter title from the slug-style "content-creation" to a human-readable "Content Creation" so the page nav and headings are clear; keep the filename as-is and only modify the title field in the frontmatter (the title key in the existing diff) to the new human-friendly string.authentication.mdx (1)
13-15: Clarify that both signup and verify are unauthenticated.The note says "Agent signup endpoints are unauthenticated", but only
/agents/signupis named in the prose. Peraccounts.json, bothPOST /api/agents/signupandPOST /api/agents/verifyhavesecurity: []— worth making this explicit so readers don't wonder which header to send to/verifybefore they have a key.📝 Suggested wording
-[Agent signup](/agents) endpoints are unauthenticated — they let agents get their first key without any credentials. +The [agent signup and verify](/agents) endpoints are unauthenticated — they let agents get their first key without any credentials.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@authentication.mdx` around lines 13 - 15, The note only mentions the signup endpoint as unauthenticated but both POST /api/agents/signup and POST /api/agents/verify are unauthenticated per accounts.json; update the text in authentication.mdx to explicitly state that both /agents/signup (POST /api/agents/signup) and verify (POST /api/agents/verify) endpoints accept requests without authentication so readers know not to send an API key or auth header to /verify before obtaining one.quickstart.mdx (1)
37-54: Make Python/JS samples consistent with the bash env-var pattern.The bash block exports
RECOUP_API_KEY, but the Python and JavaScript samples fall back to a literal"YOUR_API_KEY". Readers stepping through the CodeGroup top-to-bottom would expect the env var to carry through.📝 Proposed tweak
import requests +import os response = requests.get( "https://recoup-api.vercel.app/api/research", params={"q": "Drake"}, - headers={"x-api-key": "YOUR_API_KEY"} + headers={"x-api-key": os.environ["RECOUP_API_KEY"]} ) print(response.json())const response = await fetch( "https://recoup-api.vercel.app/api/research?q=Drake", - { headers: { "x-api-key": "YOUR_API_KEY" } } + { headers: { "x-api-key": process.env.RECOUP_API_KEY } } ); console.log(await response.json());🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@quickstart.mdx` around lines 37 - 54, Update the Python and JavaScript examples to read the API key from the RECOUP_API_KEY environment variable instead of the literal "YOUR_API_KEY": in the Python snippet import os and use os.environ.get("RECOUP_API_KEY") (or os.getenv) when building the headers/params for requests, and in the JavaScript snippet read process.env.RECOUP_API_KEY (or a suitable env-access pattern for the shown runtime) when setting the "x-api-key" header so the examples follow the same bash env-var pattern shown earlier.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@index.mdx`:
- Around line 200-214: Update the OpenAPI spec links in the "For AI agents"
section of index.mdx to use root-relative paths instead of the hardcoded
developers.recoupable.com domain: change the Base URL line and each spec link
(e.g., the `openapi/research.json`, `openapi/content.json`,
`openapi/releases.json`, `openapi/accounts.json`, `openapi/social.json`
references) to `/api-reference/openapi/{domain}.json`, or alternatively replace
the hardcoded domain with the correct docs deployment domain if you confirm it
in the branding/config; ensure both the Base URL and the markdown link targets
are consistent.
---
Nitpick comments:
In `@authentication.mdx`:
- Around line 13-15: The note only mentions the signup endpoint as
unauthenticated but both POST /api/agents/signup and POST /api/agents/verify are
unauthenticated per accounts.json; update the text in authentication.mdx to
explicitly state that both /agents/signup (POST /api/agents/signup) and verify
(POST /api/agents/verify) endpoints accept requests without authentication so
readers know not to send an API key or auth header to /verify before obtaining
one.
In `@quickstart.mdx`:
- Around line 37-54: Update the Python and JavaScript examples to read the API
key from the RECOUP_API_KEY environment variable instead of the literal
"YOUR_API_KEY": in the Python snippet import os and use
os.environ.get("RECOUP_API_KEY") (or os.getenv) when building the headers/params
for requests, and in the JavaScript snippet read process.env.RECOUP_API_KEY (or
a suitable env-access pattern for the shown runtime) when setting the
"x-api-key" header so the examples follow the same bash env-var pattern shown
earlier.
In `@skills/content-creation.mdx`:
- Around line 2-3: Update the frontmatter title from the slug-style
"content-creation" to a human-readable "Content Creation" so the page nav and
headings are clear; keep the filename as-is and only modify the title field in
the frontmatter (the title key in the existing diff) to the new human-friendly
string.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 38e8355c-4c15-4372-8977-47a1e4976d86
📒 Files selected for processing (13)
agents.mdxapi-reference/openapi/research.jsonauthentication.mdxcli.mdxcontent-agent.mdxdocs.jsonindex.mdxmcp.mdxquickstart.mdxskills/artist-workspace.mdxskills/content-creation.mdxskills/release-management.mdxskills/trend-to-song.mdx
✅ Files skipped from review due to trivial changes (5)
- skills/artist-workspace.mdx
- skills/trend-to-song.mdx
- api-reference/openapi/research.json
- agents.mdx
- cli.mdx
🚧 Files skipped from review as they are similar to previous changes (1)
- content-agent.mdx
There was a problem hiding this comment.
2 issues found across 6 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="mcp.mdx">
<violation number="1" location="mcp.mdx:39">
P2: Custom agent: **Enforce Clear Code Style and Maintainability Practices**
`mcp.mdx` exceeds the rule’s 100-line limit and has become a multi-concern document instead of a small, focused page.</violation>
<violation number="2" location="mcp.mdx:78">
P3: Use the current brand name (`Recoup`) here for consistency with the rest of the docs.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| @@ -1,78 +1,161 @@ | |||
| --- | |||
There was a problem hiding this comment.
P2: Custom agent: Enforce Clear Code Style and Maintainability Practices
mcp.mdx exceeds the rule’s 100-line limit and has become a multi-concern document instead of a small, focused page.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At mcp.mdx, line 39:
<comment>`mcp.mdx` exceeds the rule’s 100-line limit and has become a multi-concern document instead of a small, focused page.</comment>
<file context>
@@ -30,27 +30,121 @@ await client.connect(transport);
---
-## Available tools
+## Tool catalog
+
+The server exposes 40+ tools organized by domain. Every tool returns structured JSON suitable for chaining into multi-step agent workflows.
</file context>
content-agent.mdx: - Update content endpoint table to use canonical OpenAPI paths (e.g. /api/content/generate-image, not /api/content/image; PATCH /api/content/edit, not PATCH /api/content). Caught by CodeRabbit. - Mark POST /api/content/create as legacy inline so the page doesn't steer readers toward the deprecated pipeline. index.mdx: - Move "connectors" from the Accounts row to the Social row in the OpenAPI spec table — connectors live in social.json, not accounts.json. Caught by cubic-dev-ai. - Convert hardcoded https://developers.recoupable.com/api-reference/ openapi/*.json links to root-relative /api-reference/openapi/*.json so they don't 404 if the docs are served from a different domain. mcp.mdx: - "Recoupable's Audio Language Model" → "Recoup's" for brand consistency with the rest of the docs. Made-with: Cursor
- authentication.mdx: Note now mentions both signup and verify as unauthenticated endpoints (previously only signup was named, which could leave readers wondering which header to send to /verify before they have a key). - quickstart.mdx: Python and JavaScript samples now read the API key from the RECOUP_API_KEY env var, matching the bash example above instead of falling back to a literal "YOUR_API_KEY". - skills/content-creation.mdx: Frontmatter title changed from the slug-style "content-creation" to "Content Creation" for clearer nav and headings. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
skills/content-creation.mdx (1)
29-29:⚠️ Potential issue | 🟡 MinorRemove stray trailing content token.
Line 29 contains a standalone
29, which will render as unintended page content.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@skills/content-creation.mdx` at line 29, Remove the stray standalone token "29" that appears as page content on line 29 of skills/content-creation.mdx; locate the lone "29" text node and delete it (or move it into the intended heading/metadata if it was meant to be part of a title or frontmatter) so it no longer renders as unintended content.
🧹 Nitpick comments (2)
skills/content-creation.mdx (1)
6-10: Make “what/when” sections more scannable for operators.Line 6 and Line 10 are dense run-on paragraphs; split into short bullets (trigger → actions → iteration loop) to improve scan speed.
As per coding guidelines "Keep documentation content concise and scannable".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@skills/content-creation.mdx` around lines 6 - 10, Split the dense prose under the opening description ("Turns the seven content primitives into finished assets...") and the "## When to use it" section into short bullet lists to improve scannability: create a "Trigger" bullet listing user intents that start this flow (e.g., "create content", "make a video", "generate an image", "produce a TikTok/Reel", "add captions", "iterate on existing content"), an "Actions" bullet that maps to the primitives to run (generate, transcribe, edit, upscale, analyze), and an "Iteration loop" bullet that shows follow-up steps (regenerate, re-prompt, re-mux, try different audio/text, upscale). Update the paragraphs referenced by the text beginning "Turns the seven content primitives..." and the "## When to use it" block to use these bullets so operators can quickly scan triggers → actions → iteration loop.content-agent.mdx (1)
81-87: Optional: surface the legacy-endpoint nuance in the data flow.Step 3 documents that the bot internally calls
POST /api/content/create, which is the same endpoint marked deprecated in the Note above (lines 54–56) and in the OpenAPI spec. That's accurate to current behavior, but readers building agents from this page may be confused why the bot still calls the legacy pipeline. A one-liner here ("internal — to be migrated to individual endpoints") would close the loop, or alternatively a follow-up to migrate the bot itself.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@content-agent.mdx` around lines 81 - 87, Add a one-line clarification after step 3 of the Data flow explaining that the bot currently calls the legacy internal endpoint POST /api/content/create (the deprecated pipeline) and that this is intentional for now but is slated to be migrated to the newer individual endpoints; reference the endpoint name POST /api/content/create and the mention handler to make the connection explicit.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@mcp.mdx`:
- Around line 67-80: The section heading "Content — images, video, audio"
currently lists tools that don't belong there: `generate_txt_file` and
`create_knowledge_base` are file/utility actions, not media
generation/transcription, so either (A) move the `generate_txt_file` and
`create_knowledge_base` rows out of that table into the Utilities section
alongside `send_email`, `contact_team`, `get_local_time`, or (B) change the
heading to "Content — images, video, audio, files" to accurately reflect their
presence; update the table accordingly (remove rows if moving, or keep them and
update the heading if broadening) and ensure the Tools list elsewhere remains
consistent.
---
Outside diff comments:
In `@skills/content-creation.mdx`:
- Line 29: Remove the stray standalone token "29" that appears as page content
on line 29 of skills/content-creation.mdx; locate the lone "29" text node and
delete it (or move it into the intended heading/metadata if it was meant to be
part of a title or frontmatter) so it no longer renders as unintended content.
---
Nitpick comments:
In `@content-agent.mdx`:
- Around line 81-87: Add a one-line clarification after step 3 of the Data flow
explaining that the bot currently calls the legacy internal endpoint POST
/api/content/create (the deprecated pipeline) and that this is intentional for
now but is slated to be migrated to the newer individual endpoints; reference
the endpoint name POST /api/content/create and the mention handler to make the
connection explicit.
In `@skills/content-creation.mdx`:
- Around line 6-10: Split the dense prose under the opening description ("Turns
the seven content primitives into finished assets...") and the "## When to use
it" section into short bullet lists to improve scannability: create a "Trigger"
bullet listing user intents that start this flow (e.g., "create content", "make
a video", "generate an image", "produce a TikTok/Reel", "add captions", "iterate
on existing content"), an "Actions" bullet that maps to the primitives to run
(generate, transcribe, edit, upscale, analyze), and an "Iteration loop" bullet
that shows follow-up steps (regenerate, re-prompt, re-mux, try different
audio/text, upscale). Update the paragraphs referenced by the text beginning
"Turns the seven content primitives..." and the "## When to use it" block to use
these bullets so operators can quickly scan triggers → actions → iteration loop.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 99be9b9f-19e2-4125-b30d-3ff027e69317
📒 Files selected for processing (6)
authentication.mdxcontent-agent.mdxindex.mdxmcp.mdxquickstart.mdxskills/content-creation.mdx
✅ Files skipped from review due to trivial changes (1)
- index.mdx
There was a problem hiding this comment.
2 issues found across 6 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="content-agent.mdx">
<violation number="1" location="content-agent.mdx:46">
P1: These endpoint paths were renamed in the table to routes that are not present in the API spec, so readers will call incorrect URLs.</violation>
<violation number="2" location="content-agent.mdx:52">
P1: The Analyze Video row lists `/api/content/analyze-video`, but the API spec defines `/api/content/analyze`.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
Pulls 6 incremental endpoint and workflow doc changes from main into the design-overhaul branch: - 6267c27 docs(connectors): add GET + POST /api/connectors/actions - 5eef94d docs(workflows): drive create-artist from a RECOUP.md checklist - b092f5d docs: add Create a New Artist workflow guide - 1486245 docs: document PATCH /api/artists/{id} - 20d6593 docs(docs): add GET /api/artists/pro - 82d3a5d docs: remove GET /api/subscriptions endpoint entirely Conflict resolution (docs.json only): - Kept this branch's design-overhaul tab structure (Overview / Chat / Research / Artists / Catalog / Content / Automation / Accounts / Skills) rather than reverting to main's flatter layout. - Integrated main's new pages into our structure: * Added Workflows group (with create-artist) at the top of Artists tab. * Added artists/update under Artist Management group. * Added connectors/list-actions and execute-action under Connectors. * Added admins/artists-pro under Admins. * Removed subscriptions/get from Subscriptions group (page deleted). All other files merged automatically without conflict. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs.json`:
- Around line 243-252: Update the page titles for the two pairs of overlapping
docs so they clearly distinguish the different operations: change the
frontmatter/title of "api-reference/content/generate-image" and
"api-reference/image/generation" to something like "Generate Image (Content
API)" and "Generate Image (Image API)" respectively, and likewise change
"api-reference/content/transcribe-audio" and "api-reference/transcribe/audio" to
distinct titles such as "Transcribe Audio (Content API)" and "Transcribe Audio
(Transcribe API)"; locate and edit the title/frontmatter in each document to the
new disambiguated string so the nav shows the distinct labels.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
| "api-reference/content/generate-image", | ||
| "api-reference/content/generate-video", | ||
| "api-reference/content/generate-caption", | ||
| "api-reference/content/transcribe-audio", | ||
| "api-reference/content/edit", | ||
| "api-reference/content/upscale", | ||
| "api-reference/content/analyze-video", | ||
| "api-reference/image/generation", | ||
| "api-reference/transcribe/audio" | ||
| ] |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check that the four pages exist and inspect their frontmatter + referenced OpenAPI operations
# to determine whether they are distinct endpoints or duplicates.
for p in \
api-reference/content/generate-image \
api-reference/content/transcribe-audio \
api-reference/image/generation \
api-reference/transcribe/audio; do
echo "===== ${p}.mdx ====="
f=$(fd -t f -p "${p}.mdx")
if [ -z "$f" ]; then
echo "MISSING"
else
head -n 20 "$f"
echo "..."
rg -nP '^(openapi|api):' "$f" || true
fi
done
echo
echo "===== Confirm 131 .mdx ↔ 131 nav entries ====="
echo "Total api-reference/**/*.mdx on disk:"
fd -t f -e mdx . api-reference | wc -l
echo "Total api-reference/* nav entries in docs.json:"
rg -oP '"api-reference/[^"]+"' docs.json | sort -u | wc -lRepository: recoupable/docs
Length of output: 1131
Disambiguate titles for the separate image generation and audio transcription endpoints.
The navigation includes distinct endpoints for image generation and audio transcription:
api-reference/content/generate-image(POST/api/content/image) andapi-reference/image/generation(GET/api/image/generate) both have the title "Generate Image"api-reference/content/transcribe-audio(POST/api/content/transcribe) andapi-reference/transcribe/audio(POST/api/transcribe) both have the title "Transcribe Audio"
Since these reference different operations, their titles should differentiate them (e.g., "Generate Image (Content)" vs. "Generate Image (Image)", or similar) so readers can pick the correct one.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs.json` around lines 243 - 252, Update the page titles for the two pairs
of overlapping docs so they clearly distinguish the different operations: change
the frontmatter/title of "api-reference/content/generate-image" and
"api-reference/image/generation" to something like "Generate Image (Content
API)" and "Generate Image (Image API)" respectively, and likewise change
"api-reference/content/transcribe-audio" and "api-reference/transcribe/audio" to
distinct titles such as "Transcribe Audio (Content API)" and "Transcribe Audio
(Transcribe API)"; locate and edit the title/frontmatter in each document to the
new disambiguated string so the nav shows the distinct labels.
Replaces the awkward catch-all "Content Endpoints" group with three verb-based groups (Generate / Edit / Analyze) — same pattern Research uses (Artist discovery, Metrics & insights, Charts & radio, etc.). Drops the redundant "Content > Content Endpoints" naming and puts each endpoint where readers and agents will look for it based on what they're trying to do. Content tab nav before: Content Endpoints (9 mixed endpoints) Templates Pipeline (Legacy) Content Agent Content tab nav after: Generate (image, video, caption, image/generation) Edit (edit, upscale) Analyze (analyze-video, transcribe-audio, transcribe/audio) Templates Pipeline (Legacy) Content Agent Also fixes the H2 heading in content-agent.mdx from "Content endpoints" to "Endpoints it uses" to match the convention used across all 10 skills pages. Made-with: Cursor
Three endpoints in the Content tab predate the current "primitive" model and are still in use even though they're not yet marked deprecated in the OpenAPI spec. Surface that explicitly so readers and agents know what's going on: - POST /api/content/create — monolithic pipeline (image → video → caption → edit → upscale in one call). Powers the Content Agent Slack bot. New integrations should compose primitives instead. - GET /api/image/generate — pre-sandbox image generation via x402 + auto-store on Arweave. Still used by the MCP server. New integrations should use POST /api/content/image. - POST /api/transcribe — pre-sandbox transcribe + write audio and transcript to backend storage. New integrations should use POST /api/content/transcribe-audio (stateless). Nav changes (docs.json): - Renamed "Pipeline (Legacy)" group to just "Legacy" and added the two pre-sandbox endpoints to it (one bucket for everything that's on the way out, instead of two near-duplicate "(Legacy)" groups). - Removed image/generation from the Generate group and transcribe/audio from the Analyze group — those are reserved for current primitives. MDX changes: - Added a <Note> block at the top of each of the three legacy MDX pages explaining what the endpoint does, why it's labeled legacy, and which primitive to use instead. Made-with: Cursor
There was a problem hiding this comment.
3 issues found across 4 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="api-reference/image/generation.mdx">
<violation number="1" location="api-reference/image/generation.mdx:6">
P2: API reference pages in this repo are required to be frontmatter-only, but this change adds a `<Note>` body block to an `api-reference/` MDX file.</violation>
</file>
<file name="api-reference/transcribe/audio.mdx">
<violation number="1" location="api-reference/transcribe/audio.mdx:6">
P2: API reference pages in this repo must remain frontmatter-only; this added `<Note>` block should be removed and any endpoint guidance kept in OpenAPI/source docs to avoid drift.</violation>
</file>
<file name="api-reference/content/create.mdx">
<violation number="1" location="api-reference/content/create.mdx:6">
P2: `api-reference` endpoint pages are required to be frontmatter-only; adding a `<Note>` block here breaks the repository’s API-doc structure convention. Move this legacy guidance into the OpenAPI operation description instead.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
…onvention This corrects two mistakes from yesterday's review pass that were caught by today's bot reviews. The mistakes traced back to following one bot suggestion without verifying against the OpenAPI source. content-agent.mdx — revert path renames: The OpenAPI spec defines short paths (`/api/content/image`, `/api/content/video`, `/api/content/caption`, `/api/content/transcribe`, `PATCH /api/content`, `/api/content/analyze`). Yesterday I appended descriptive suffixes (`/api/content/generate-image`, etc.) on a CodeRabbit suggestion without verifying. Today's cubic-dev-ai review correctly flagged that those paths don't exist in the API. Reverted the visible column to canonical short paths; link targets keep the descriptive docs-page slugs (those are the actual MDX file paths). api-reference/* — remove <Note> blocks: AGENTS.md is explicit: api-reference MDX pages must be frontmatter-only. Yesterday's legacy notes on create.mdx, image/generation.mdx, and transcribe/audio.mdx violated that convention. Removed the <Note> blocks from all three pages. api-reference/openapi/content.json — surface legacy in descriptions: Moved the legacy guidance (and recommended replacement endpoint) into the OpenAPI operation `description` field for all three endpoints, so it renders on the auto-generated reference pages without breaking the frontmatter-only rule. Also fixed stale path references in the existing description for /api/content/create. Title disambiguation: `api-reference/image/generation.mdx` → "Generate Image (Legacy)" `api-reference/transcribe/audio.mdx` → "Transcribe Audio (Legacy)" Resolves the duplicate-title issue CodeRabbit flagged: the legacy pages had the same title as their modern equivalents. mcp.mdx — Utilities cleanup: `generate_txt_file` and `create_knowledge_base` were under the "Content — images, video, audio" heading, but they're file/utility operations rather than media generation. Moved both to the Utilities group alongside `get_local_time`, `send_email`, and `contact_team`. Made-with: Cursor
There was a problem hiding this comment.
1 issue found across 6 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="api-reference/openapi/content.json">
<violation number="1" location="api-reference/openapi/content.json:619">
P2: `POST /api/content/create` description now documents `run_id`, but the endpoint response schema and response description use `runIds` (array). Keep the field name consistent to avoid client integration errors.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| "post": { | ||
| "description": "Trigger the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` — an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).", | ||
| "deprecated": true, | ||
| "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).", |
There was a problem hiding this comment.
P2: POST /api/content/create description now documents run_id, but the endpoint response schema and response description use runIds (array). Keep the field name consistent to avoid client integration errors.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At api-reference/openapi/content.json, line 619:
<comment>`POST /api/content/create` description now documents `run_id`, but the endpoint response schema and response description use `runIds` (array). Keep the field name consistent to avoid client integration errors.</comment>
<file context>
@@ -616,7 +616,7 @@
"post": {
"deprecated": true,
- "description": "This pipeline endpoint is being phased out. Use the individual content endpoints (`generate-image`, `generate-video`, `generate-caption`, etc.) directly. Triggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` — an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).",
+ "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
"security": [
{
</file context>
| "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).", | |
| "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` \u2014 an array of run IDs. Poll each via [`GET /api/tasks/runs`](/api-reference/tasks/runs).", |
Audit pass to find every doc reference that doesn't resolve to something real in the API. Three findings, all fixed in this commit. skills/trend-to-song.mdx — removed dead /api/x/trends reference: The /api/x/* (Twitter) endpoints were removed from the API entirely; no OpenAPI spec defines them anymore. The skill's existing endpoints (/api/research/web, /api/research/audience) already cover the "cultural research" workflow — research/web's description literally calls out cultural research as its purpose. Just dropped the broken line; no replacement needed. Disambiguated duplicate "Search" page titles: api-reference/research/search.mdx → "Artist Search" api-reference/spotify/search.mdx → "Spotify Search" Same fix pattern we used for "Generate Image (Legacy)" and "Transcribe Audio (Legacy)". Search results and autocomplete now distinguish the two endpoints. Harmonized PATCH /api/tasks summary with the MDX page title: OpenAPI summary: "Update scheduled task" → "Update Task" The MDX frontmatter title is "Update Task" and that's what shows in the sidebar nav. Mintlify uses the OpenAPI summary on the page header, so they're rendered side-by-side. Aligning to the shorter "Update Task" matches the visible nav entry. Audit results post-fix: - MDX /api/* references vs OpenAPI: 0 mismatches - Duplicate page titles: 0 - Title vs OpenAPI summary mismatches: 0
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
mcp.mdx (1)
159-161: Align terminology withauthentication.mdx.
authentication.mdxuses "Org member" and "No org" to describe key scope; this Note introduces new terms ("Org-scoped keys", "Personal API keys") that aren't defined elsewhere. Either reuse the existing terminology or define these terms once inauthentication.mdxand reference them here, to keep the model consistent across pages.📝 Proposed wording aligned with authentication.mdx
<Note> -**Org-scoped keys** can target any account in their organization by passing `account_id` on tools that accept it. Personal API keys can only operate on their own data. +Keys belonging to an **org member** can target any account in their organization by passing `account_id` on tools that accept it. Keys with **no org** can only operate on their own data. See [Authentication › Organization access](/authentication#organization-access). </Note>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mcp.mdx` around lines 159 - 161, Update the Note to use the same terminology as authentication.mdx: either replace "Org-scoped keys" with "Org member" and "Personal API keys" with "No org", or add canonical definitions for "Org-scoped keys" and "Personal API keys" in authentication.mdx and reference them here; ensure the Note references the defined terms and explains that org-scoped keys can target any account in their organization by passing account_id while personal keys operate only on their own data.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@api-reference/openapi/content.json`:
- Line 1345: The "description" string listing video generation "mode" options
incorrectly implies a text-only "prompt" mode; change that entry to make clear
that image_url is always required (e.g., "prompt — create a video from text plus
a required image (image_url)"), and update the mirrored table in
content-agent.mdx to match; target the "description" field's modes list and the
"prompt" row in content-agent.mdx so both docs consistently state that image_url
is mandatory.
- Around line 618-619: The operation description for POST /api/content/create
currently states it returns `{run_id}` but the 202 response and the
ContentCreateResponse schema return `runIds` (an array); update the operation
description text to match the schema by replacing references to `run_id` with
`runIds` and describing that the endpoint returns an array of run IDs (or
conversely, if intended shape is a single run_id, change the 202 response and
ContentCreateResponse schema to `run_id` instead) so the description and the
ContentCreateResponse/202 response block are consistent; locate the text in the
POST /api/content/create operation and the ContentCreateResponse schema to make
the matching change.
In `@mcp.mdx`:
- Around line 14-24: Update authentication.mdx to clarify the MCP endpoint
(/mcp) is an exception to the REST API auth rules: explicitly state that API
keys intended for server/script use should be sent to the MCP endpoint as
Authorization: Bearer <API_KEY> (as shown in mcp.mdx and quickstart.mdx) rather
than x-api-key, and add a short callout mentioning that Privy JWTs still use
Bearer and sending both headers may cause a 401; reference the MCP path and the
header names (x-api-key and Authorization) so readers know this MCP-specific
auth pattern differs from the REST API guidance.
---
Nitpick comments:
In `@mcp.mdx`:
- Around line 159-161: Update the Note to use the same terminology as
authentication.mdx: either replace "Org-scoped keys" with "Org member" and
"Personal API keys" with "No org", or add canonical definitions for "Org-scoped
keys" and "Personal API keys" in authentication.mdx and reference them here;
ensure the Note references the defined terms and explains that org-scoped keys
can target any account in their organization by passing account_id while
personal keys operate only on their own data.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 5fdaaee2-1798-44d6-b069-2e84e9684101
📒 Files selected for processing (10)
api-reference/image/generation.mdxapi-reference/openapi/content.jsonapi-reference/openapi/releases.jsonapi-reference/research/search.mdxapi-reference/spotify/search.mdxapi-reference/transcribe/audio.mdxcontent-agent.mdxdocs.jsonmcp.mdxskills/trend-to-song.mdx
✅ Files skipped from review due to trivial changes (5)
- api-reference/research/search.mdx
- api-reference/transcribe/audio.mdx
- api-reference/spotify/search.mdx
- api-reference/image/generation.mdx
- skills/trend-to-song.mdx
| "deprecated": true, | ||
| "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).", |
There was a problem hiding this comment.
Keep the legacy pipeline response shape consistent.
The operation description still says POST /api/content/create returns {run_id}, but the 202 response and ContentCreateResponse schema now document runIds as an array. That contradiction will leak straight into the generated reference and push clients toward parsing the wrong payload.
🛠️ Suggested doc fix
- "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
+ "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers background work that generates short-form video. Returns `runIds` — an array of run IDs — for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@api-reference/openapi/content.json` around lines 618 - 619, The operation
description for POST /api/content/create currently states it returns `{run_id}`
but the 202 response and the ContentCreateResponse schema return `runIds` (an
array); update the operation description text to match the schema by replacing
references to `run_id` with `runIds` and describing that the endpoint returns an
array of run IDs (or conversely, if intended shape is a single run_id, change
the 202 response and ContentCreateResponse schema to `run_id` instead) so the
description and the ContentCreateResponse/202 response block are consistent;
locate the text in the POST /api/content/create operation and the
ContentCreateResponse schema to make the matching change.
| "/api/content/video": { | ||
| "post": { | ||
| "description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` — create a video from a text description\n- `animate` — animate a still image\n- `reference` — use an image as a style/subject reference (not the first frame)\n- `extend` — continue an existing video\n- `first-last` — generate a video that transitions between two images\n- `lipsync` — sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.", | ||
| "description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` \u2014 create a video from a text description\n- `animate` \u2014 animate a still image\n- `reference` \u2014 use an image as a style/subject reference (not the first frame)\n- `extend` \u2014 continue an existing video\n- `first-last` \u2014 generate a video that transitions between two images\n- `lipsync` \u2014 sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.", |
There was a problem hiding this comment.
Don't describe a text-only prompt mode if image_url is still mandatory.
These two descriptions now disagree with the request contract: the mode list still says prompt mode creates a video from text alone, while Line 2703 explicitly says text-only prompt mode is unsupported and the schema still requires image_url. As written, readers will try prompt-only requests and hit validation errors. Please reword the mode description to make it clear that image_url is always required, and update the mirrored table in content-agent.mdx in the same sweep.
🛠️ Suggested doc fix
- "description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` — create a video from a text description\n- `animate` — animate a still image\n- `reference` — use an image as a style/subject reference (not the first frame)\n- `extend` — continue an existing video\n- `first-last` — generate a video that transitions between two images\n- `lipsync` — sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",
+ "description": "Generate a video. `image_url` is always required. Set `mode` to control how that input is used:\n\n- `prompt` — animate the input image using the supplied prompt\n- `animate` — animate a still image\n- `reference` — use an image as a style/subject reference (not the first frame)\n- `extend` — continue an existing video\n- `first-last` — generate a video that transitions between two images\n- `lipsync` — sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",Also applies to: 2703-2703
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@api-reference/openapi/content.json` at line 1345, The "description" string
listing video generation "mode" options incorrectly implies a text-only "prompt"
mode; change that entry to make clear that image_url is always required (e.g.,
"prompt — create a video from text plus a required image (image_url)"), and
update the mirrored table in content-agent.mdx to match; target the
"description" field's modes list and the "prompt" row in content-agent.mdx so
both docs consistently state that image_url is mandatory.
| Pass your API key as a Bearer token when connecting: | ||
|
|
||
| You can get a key from the [API Keys page](https://chat.recoupable.com/keys). | ||
| ```typescript | ||
| import { Client } from "@modelcontextprotocol/sdk/client/index.js"; | ||
| import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; | ||
|
|
||
| ## Tools | ||
| const RECOUP_API_KEY = process.env.RECOUP_API_KEY; | ||
|
|
||
| ### prompt_sandbox | ||
| const transport = new StreamableHTTPClientTransport( | ||
| new URL("https://recoup-api.vercel.app/mcp"), | ||
| { requestInit: { headers: { Authorization: `Bearer ${RECOUP_API_KEY}` } } }, |
There was a problem hiding this comment.
❓ Verification inconclusive
Script executed:
#!/bin/bash
# Confirm how the rest of the docs describe MCP auth and whether x-api-key vs Bearer
# is documented anywhere as an MCP-specific exception.
rg -nP -C2 '\b(x-api-key|Authorization:\s*Bearer|Bearer\s*\$\{?RECOUP_API_KEY)' --type=md --type=mdx
rg -nP -C3 '/mcp\b|MCP\b' authentication.mdx quickstart.mdx 2>/dev/nullRepository: recoupable/docs
Repository: recoupable/docs
Exit code: 0
stdout:
quickstart.mdx-82-
quickstart.mdx-83-## 4. Connect your AI agent
quickstart.mdx-84-
quickstart.mdx:85:If you're using Claude, ChatGPT, Cursor, or any MCP-compatible tool, connect directly:
quickstart.mdx-86-
quickstart.mdx-87-```
quickstart.mdx:88:https://recoup-api.vercel.app/mcp
quickstart.mdx-89-```
quickstart.mdx-90-
quickstart.mdx:91:Pass your API key as a Bearer token. Your agent gets access to all 40+ endpoints. See the [MCP guide](/mcp) for setup.
quickstart.mdx-92-
quickstart.mdx-93----
quickstart.mdx-94-
stderr:
unrecognized file type: mdx
Script executed:
# Search for authentication.mdx and examine its content
fd -t f authentication.mdxRepository: recoupable/docs
Repository: recoupable/docs
Exit code: 0
stdout:
authentication.mdx
Script executed:
# Read the authentication.mdx file to understand the scope
cat authentication.mdxRepository: recoupable/docs
Repository: recoupable/docs
Exit code: 0
stdout:
---
title: "Authentication"
description: "API keys and Bearer tokens — how to authenticate every request to the Recoup API."
---
**Use API keys** for server-to-server, CLI, and agent integrations. **Use Bearer tokens** for frontend apps authenticated via Privy. Include exactly one — providing both returns `401`.
| Method | Header | Best for |
|--------|--------|----------|
| API Key | `x-api-key` | Servers, scripts, CLI, AI agents |
| Bearer Token | `Authorization: Bearer <jwt>` | Frontend apps via Privy |
<Note>
The [agent signup and verify](/agents) endpoints (`POST /api/agents/signup` and `POST /api/agents/verify`) are both unauthenticated — they let agents get their first key without any credentials.
</Note>
---
## Create a key
### Sign up via API
```bash
# Step 1 — request a code
curl -X POST "https://recoup-api.vercel.app/api/agents/signup" \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'
# Step 2 — submit the code from your inbox
curl -X POST "https://recoup-api.vercel.app/api/agents/verify" \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "code": "123456"}'
```
When an agent runs the same flow on behalf of a human, the agent passes the code the human reads back from their inbox.
### From the dashboard
Go to [chat.recoupable.com/keys](https://chat.recoupable.com/keys), sign in, and create a key.
<Warning>
Keys are shown once. They are stored as HMAC-SHA256 hashes and cannot be retrieved after creation.
</Warning>
---
## Use a key
```bash
curl "https://recoup-api.vercel.app/api/research?q=Drake" \
-H "x-api-key: YOUR_API_KEY"
```
---
## Organization access
If your account belongs to an organization, your key can access data for any account in that org by passing `account_id`:
- **No org** — key accesses its own data only
- **Org member** — key can pass `account_id` to access any member's data
---
## Bearer tokens (Privy)
For frontend apps with [Privy](https://privy.io) authentication:
```bash
curl "https://recoup-api.vercel.app/api/tasks" \
-H "Authorization: Bearer YOUR_PRIVY_JWT"
```
The API validates the JWT against Privy, extracts the user's email, and resolves it to a Recoup account.
---
## Access control
Scoping parameters follow the same organization-membership rule:
```
Request includes account_id?
├── Same as key owner → allowed
├── Shares an organization → allowed
└── No shared org → 403
Request includes organization_id?
├── Key owner is a member of that org → allowed
└── Not a member → 403
Request includes artist_account_id?
├── Artist belongs to the key owner → allowed
├── Artist belongs to an org the key owner is a member of → allowed
└── Neither → 403
```
## Errors
| Status | Cause |
|--------|-------|
| `401` | Missing/invalid credentials, or both headers |
| `403` | Valid credentials, insufficient access |
## Security
- Keys stored as HMAC-SHA256 hashes — never plaintext
- Rotate compromised keys at [chat.recoupable.com/keys](https://chat.recoupable.com/keys)
- Never commit keys to version control
Script executed:
# Search for MCP mentions and auth header patterns across all documentation
rg -i 'mcp|x-api-key|bearer.*recoup|authorization.*bearer' --type-add 'mdx:*.mdx' -t mdx -C 3Repository: recoupable/docs
Repository: recoupable/docs
Exit code: 0
stdout:
workflows/create-artist.mdx-
workflows/create-artist.mdx-## Prerequisites
workflows/create-artist.mdx-
workflows/create-artist.mdx:- `$RECOUP_ACCESS_TOKEN` — Bearer token for `recoup-api.vercel.app`
workflows/create-artist.mdx-- `$RECOUP_ORG_ID` — the org the artist should belong to (recommended in sandboxes)
workflows/create-artist.mdx-- An artist name to create (e.g. `ARTIST_NAME="The Weeknd"`)
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-ARTIST_RESPONSE=$(curl -sS -X POST "https://recoup-api.vercel.app/api/artists" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- -H "Content-Type: application/json" \
workflows/create-artist.mdx- -d "$(jq -n --arg name "$ARTIST_NAME" --arg org "$RECOUP_ORG_ID" \
workflows/create-artist.mdx- '{name: $name, organization_id: $org}')")
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-SPOTIFY=$(curl -sS -G "https://recoup-api.vercel.app/api/spotify/search" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "q=$ARTIST_NAME" \
workflows/create-artist.mdx- --data-urlencode "type=artist" \
workflows/create-artist.mdx- --data-urlencode "limit=10")
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-curl -sS -X PATCH "https://recoup-api.vercel.app/api/artists/$ARTIST_ID" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- -H "Content-Type: application/json" \
workflows/create-artist.mdx- -d "$(jq -n --arg image "$SPOTIFY_IMAGE_URL" --arg url "$SPOTIFY_PROFILE_URL" \
workflows/create-artist.mdx- '{image: $image, profileUrls: {SPOTIFY: $url}}')"
workflows/create-artist.mdx-```
workflows/create-artist.mdx-
workflows/create-artist.mdx:This single endpoint replaces what the chat tool chain runs as four separate MCP calls (`update_account_info` ×2, `update_artist_socials` ×2). Add `label` to the body once you discover one in the structured research (step 4 — comes back from `/api/research/profile`). See [Update Artist](/api-reference/artists/update) for the full body schema.
workflows/create-artist.mdx-
workflows/create-artist.mdx-**After this step:** tick `- [ ] 3.` → `- [x] 3.`.
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-LOOKUP=$(curl -sS -G "https://recoup-api.vercel.app/api/research/lookup" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "spotifyId=$SPOTIFY_ARTIST_ID")
workflows/create-artist.mdx-
workflows/create-artist.mdx-CM_ARTIST_ID=$(echo "$LOOKUP" | jq -r '.artist.id // empty')
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-PROFILE=$(curl -sS -G "https://recoup-api.vercel.app/api/research/profile" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$CM_ARTIST_ID")
workflows/create-artist.mdx-```
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-CAREER=$(curl -sS -G "https://recoup-api.vercel.app/api/research/career" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$CM_ARTIST_ID")
workflows/create-artist.mdx-```
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-PLAYLISTS=$(curl -sS -G "https://recoup-api.vercel.app/api/research/playlists" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$CM_ARTIST_ID")
workflows/create-artist.mdx-```
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-RESEARCH_WEB=$(curl -sS -X POST "https://recoup-api.vercel.app/api/research/web" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- -H "Content-Type: application/json" \
workflows/create-artist.mdx- -d "$(jq -n --arg name "$ARTIST_NAME" \
workflows/create-artist.mdx- '{query: ($name + " biography press recent collaborations")}')")
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-TOP_TRACKS=$(curl -sS -G "https://recoup-api.vercel.app/api/spotify/artist/topTracks" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$SPOTIFY_ARTIST_ID")
workflows/create-artist.mdx-
workflows/create-artist.mdx-ALBUMS=$(curl -sS -G "https://recoup-api.vercel.app/api/spotify/artist/albums" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$SPOTIFY_ARTIST_ID")
workflows/create-artist.mdx-
workflows/create-artist.mdx-# For each notable album, drill in (ALBUM_ID from $ALBUMS):
workflows/create-artist.mdx-ALBUM_DETAIL=$(curl -sS -G "https://recoup-api.vercel.app/api/spotify/album" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- --data-urlencode "id=$ALBUM_ID")
workflows/create-artist.mdx-```
workflows/create-artist.mdx-
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-SOCIALS_SEARCH=$(curl -sS -X POST "https://recoup-api.vercel.app/api/research/web" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- -H "Content-Type: application/json" \
workflows/create-artist.mdx- -d "$(jq -n --arg name "$ARTIST_NAME" \
workflows/create-artist.mdx- '{query: ($name + " official instagram tiktok twitter youtube")}')")
--
workflows/create-artist.mdx-
workflows/create-artist.mdx-```bash
workflows/create-artist.mdx-curl -sS -X PATCH "https://recoup-api.vercel.app/api/artists/$ARTIST_ID" \
workflows/create-artist.mdx: -H "Authorization: Bearer $RECOUP_ACCESS_TOKEN" \
workflows/create-artist.mdx- -H "Content-Type: application/json" \
workflows/create-artist.mdx- -d '{
workflows/create-artist.mdx- "profileUrls": {
--
quickstart.mdx-
quickstart.mdx-```bash cURL
quickstart.mdx-curl "https://recoup-api.vercel.app/api/research?q=Drake" \
quickstart.mdx: -H "x-api-key: $RECOUP_API_KEY"
quickstart.mdx-```
quickstart.mdx-
quickstart.mdx-```python Python
--
quickstart.mdx-response = requests.get(
quickstart.mdx- "https://recoup-api.vercel.app/api/research",
quickstart.mdx- params={"q": "Drake"},
quickstart.mdx: headers={"x-api-key": os.environ["RECOUP_API_KEY"]},
quickstart.mdx-)
quickstart.mdx-print(response.json())
quickstart.mdx-```
--
quickstart.mdx-```javascript JavaScript
quickstart.mdx-const response = await fetch(
quickstart.mdx- "https://recoup-api.vercel.app/api/research?q=Drake",
quickstart.mdx: { headers: { "x-api-key": process.env.RECOUP_API_KEY } },
quickstart.mdx-);
quickstart.mdx-console.log(await response.json());
quickstart.mdx-```
--
quickstart.mdx-```bash
quickstart.mdx-# Streaming metrics (Spotify, Instagram, TikTok, YouTube, and 10 more)
quickstart.mdx-curl "https://recoup-api.vercel.app/api/research/metrics?artist=Drake&source=spotify" \
quickstart.mdx: -H "x-api-key: $RECOUP_API_KEY"
quickstart.mdx-
quickstart.mdx-# Audience demographics (age, gender, geography)
quickstart.mdx-curl "https://recoup-api.vercel.app/api/research/audience?artist=Drake" \
quickstart.mdx: -H "x-api-key: $RECOUP_API_KEY"
quickstart.mdx-
quickstart.mdx-# Editorial playlist placements
quickstart.mdx-curl "https://recoup-api.vercel.app/api/research/playlists?artist=Drake&editorial=true" \
quickstart.mdx: -H "x-api-key: $RECOUP_API_KEY"
quickstart.mdx-```
quickstart.mdx-
quickstart.mdx-See the [Research tab](/api-reference/research/search) for all 30+ research endpoints.
--
quickstart.mdx-
quickstart.mdx-## 4. Connect your AI agent
quickstart.mdx-
quickstart.mdx:If you're using Claude, ChatGPT, Cursor, or any MCP-compatible tool, connect directly:
quickstart.mdx-
quickstart.mdx-```
quickstart.mdx:https://recoup-api.vercel.app/mcp
quickstart.mdx-```
quickstart.mdx-
quickstart.mdx:Pass your API key as a Bearer token. Your agent gets access to all 40+ endpoints. See the [MCP guide](/mcp) for setup.
quickstart.mdx-
quickstart.mdx----
quickstart.mdx-
--
index.mdx----
index.mdx-
index.mdx-<Info>
index.mdx:**AI agent?** Base URL: `https://recoup-api.vercel.app/api`. Use `x-api-key` if your human has a key. Otherwise, `POST /api/agents/signup` with their email — ask them for the verification code from their inbox, then `POST /api/agents/verify` to get a key. [Agent guide →](/agents) | [Endpoint map ↓](`#for-ai-agents`)
index.mdx-</Info>
index.mdx-
index.mdx-Running a record label takes a full team. Research, content, marketing, distribution, fan engagement. Whether you're an artist doing it all yourself or a label team managing a roster, that's a lot of work. That's what agents are for. Recoup captures context around your catalog, artists, releases, and fans, and structures it so agents can perform the work of a major label — programmatically.
--
index.mdx- icon="code"
index.mdx- href="/quickstart"
index.mdx- >
index.mdx: Standard HTTP endpoints. Pass your API key in `x-api-key` and call any of the 40+ endpoints.
index.mdx- </Card>
index.mdx- <Card
index.mdx: title="MCP Server"
index.mdx- icon="cpu"
index.mdx: href="/mcp"
index.mdx- >
index.mdx: Connect Claude, ChatGPT, Cursor, or any MCP-compatible agent directly. One URL.
index.mdx- </Card>
index.mdx- <Card
index.mdx- title="CLI"
--
index.mdx-https://recoup-api.vercel.app/api
index.mdx-```
index.mdx-
index.mdx:All endpoints require `x-api-key` header authentication unless noted.
index.mdx-
index.mdx----
index.mdx-
--
index.mdx-| Accounts (agents, accounts, organizations, sandboxes, subscriptions, admins) | [`openapi/accounts.json`](/api-reference/openapi/accounts.json) |
index.mdx-| Social (Spotify, Instagram, X, social scraping, connectors) | [`openapi/social.json`](/api-reference/openapi/social.json) |
index.mdx-
index.mdx:Authentication: `x-api-key` header (or `Authorization: Bearer <token>` for Privy). To get a key, `POST /api/agents/signup` with the human's email, then `POST /api/agents/verify` with the code from their inbox. Full flow at [/agents](/agents).
index.mdx-
index.mdx-For a guided entry point by category, use the top navigation — every endpoint has its own reference page.
--
mcp.mdx----
mcp.mdx:title: "MCP Server"
mcp.mdx-description: "Connect any AI agent to Recoup via the Model Context Protocol — Claude, ChatGPT, Cursor, and 40+ Recoup tools natively."
mcp.mdx----
mcp.mdx-
mcp.mdx:Recoup exposes an [MCP](https://modelcontextprotocol.io/) server so any AI agent can use Recoup tools natively. Claude, ChatGPT, Cursor, Windsurf, and any MCP-compatible agent can research artists across Spotify and the open web, generate images and videos, manage catalogs, schedule tasks, and more — without writing API calls.
mcp.mdx-
mcp.mdx-```
mcp.mdx:https://recoup-api.vercel.app/mcp
mcp.mdx-```
mcp.mdx-
mcp.mdx-## Setup
--
mcp.mdx-const RECOUP_API_KEY = process.env.RECOUP_API_KEY;
mcp.mdx-
mcp.mdx-const transport = new StreamableHTTPClientTransport(
mcp.mdx: new URL("https://recoup-api.vercel.app/mcp"),
mcp.mdx: { requestInit: { headers: { Authorization: `Bearer ${RECOUP_API_KEY}` } } },
mcp.mdx-);
mcp.mdx-
mcp.mdx-const client = new Client({ name: "my-agent", version: "1.0.0" });
--
mcp.mdx-console.log(result.content);
mcp.mdx-```
mcp.mdx-
mcp.mdx:Each tool's input schema is published over the MCP protocol, so your agent gets typed parameter help automatically.
mcp.mdx-
mcp.mdx-<Note>
mcp.mdx-**Org-scoped keys** can target any account in their organization by passing `account_id` on tools that accept it. Personal API keys can only operate on their own data.
--
agents.mdx-
agents.mdx-## 1. Authenticate
agents.mdx-
agents.mdx:If your human has an API key, pass it via `x-api-key`. If not, generate one:
agents.mdx-
agents.mdx-<Steps>
agents.mdx- <Step title="Call signup with their email">
--
agents.mdx- -H "Content-Type: application/json" \
agents.mdx- -d '{"email": "user@example.com", "code": "123456"}'
agents.mdx- ```
agents.mdx: Store the returned `api_key`. Pass it as `x-api-key` on every request.
agents.mdx- </Step>
agents.mdx-</Steps>
agents.mdx-
--
agents.mdx-```bash
agents.mdx-# List all artists available to this account
agents.mdx-curl "https://recoup-api.vercel.app/api/artists" \
agents.mdx: -H "x-api-key: $API_KEY"
agents.mdx-
agents.mdx-# List organizations (labels/teams) the account belongs to
agents.mdx-curl "https://recoup-api.vercel.app/api/organizations" \
agents.mdx: -H "x-api-key: $API_KEY"
agents.mdx-```
agents.mdx-
agents.mdx-**If the human has artists**, you can scope work to a specific artist by passing `artist_account_id` on supported endpoints. Research, content, tasks, and fan data all become artist-specific.
--
agents.mdx-```bash
agents.mdx-# List the full file tree
agents.mdx-curl "https://recoup-api.vercel.app/api/sandboxes" \
agents.mdx: -H "x-api-key: $API_KEY"
agents.mdx-
agents.mdx-# Read a specific file
agents.mdx-curl "https://recoup-api.vercel.app/api/sandboxes/file?path=orgs/my-label/artists/drake/context/artist.md" \
agents.mdx: -H "x-api-key: $API_KEY"
agents.mdx-
agents.mdx-# Upload files to the repo
agents.mdx-# path is top-level (target directory); each file needs url + name
agents.mdx-curl -X POST "https://recoup-api.vercel.app/api/sandboxes/files" \
agents.mdx: -H "x-api-key: $API_KEY" \
agents.mdx- -H "Content-Type: application/json" \
agents.mdx- -d '{"path": "orgs/my-label/artists/drake/context", "files": [{"url": "https://...", "name": "audience.md"}]}'
agents.mdx-```
--
agents.mdx-https://recoup-api.vercel.app/api
agents.mdx-```
agents.mdx-
agents.mdx:All endpoints require `x-api-key` header unless noted. See [Authentication](/authentication) for the full auth model, and the [endpoint map](/#for-ai-agents) for every available endpoint.
--
authentication.mdx----
authentication.mdx-title: "Authentication"
authentication.mdx:description: "API keys and Bearer tokens — how to authenticate every request to the Recoup API."
authentication.mdx----
authentication.mdx-
authentication.mdx-**Use API keys** for server-to-server, CLI, and agent integrations. **Use Bearer tokens** for frontend apps authenticated via Privy. Include exactly one — providing both returns `401`.
authentication.mdx-
authentication.mdx-| Method | Header | Best for |
authentication.mdx-|--------|--------|----------|
authentication.mdx:| API Key | `x-api-key` | Servers, scripts, CLI, AI agents |
authentication.mdx:| Bearer Token | `Authorization: Bearer <jwt>` | Frontend apps via Privy |
authentication.mdx-
authentication.mdx-<Note>
authentication.mdx-The [agent signup and verify](/agents) endpoints (`POST /api/agents/signup` and `POST /api/agents/verify`) are both unauthenticated — they let agents get their first key without any credentials.
--
authentication.mdx-
authentication.mdx-```bash
authentication.mdx-curl "https://recoup-api.vercel.app/api/research?q=Drake" \
authentication.mdx: -H "x-api-key: YOUR_API_KEY"
authentication.mdx-```
authentication.mdx-
authentication.mdx----
--
authentication.mdx-
authentication.mdx-```bash
authentication.mdx-curl "https://recoup-api.vercel.app/api/tasks" \
authentication.mdx: -H "Authorization: Bearer YOUR_PRIVY_JWT"
authentication.mdx-```
authentication.mdx-
authentication.mdx-The API validates the JWT against Privy, extracts the user's email, and resolves it to a Recoup account.
--
skills/getting-started.mdx----
skills/getting-started.mdx-title: "getting-started"
skills/getting-started.mdx:description: "Set up Recoup from scratch — get an API key, verify it, and make the first call via REST or MCP."
skills/getting-started.mdx----
skills/getting-started.mdx-
skills/getting-started.mdx:The agent's bootstrap. Walks through getting an API key, picking REST or MCP, and confirming the key works before any other skill runs.
skills/getting-started.mdx-
skills/getting-started.mdx-## When to use it
skills/getting-started.mdx-
--
skills/getting-started.mdx-
skills/getting-started.mdx-## What it produces
skills/getting-started.mdx-
skills/getting-started.mdx:A working `RECOUP_API_KEY` environment variable, the chosen base URL (REST or MCP), and a verified first response.
skills/getting-started.mdx-
skills/getting-started.mdx-## Endpoints it uses
skills/getting-started.mdx-
Clarify MCP endpoint authentication in authentication.mdx — it contradicts the documented auth model for REST API.
authentication.mdx states API keys use the x-api-key header (for "Servers, scripts, CLI, AI agents"), and Bearer tokens are reserved for Privy JWTs only ("providing both returns 401"). However, quickstart.mdx line 91 and the Setup snippet here both consistently pass API keys via Authorization: Bearer ${RECOUP_API_KEY} for the MCP endpoint.
Either add a note in authentication.mdx explaining that the MCP endpoint (/mcp) uses Bearer tokens for API keys (unlike the REST API), or add a callout in mcp.mdx stating this is an MCP-specific auth pattern that differs from REST API rules. Currently, readers following authentication.mdx will attempt x-api-key on the MCP endpoint.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@mcp.mdx` around lines 14 - 24, Update authentication.mdx to clarify the MCP
endpoint (/mcp) is an exception to the REST API auth rules: explicitly state
that API keys intended for server/script use should be sent to the MCP endpoint
as Authorization: Bearer <API_KEY> (as shown in mcp.mdx and quickstart.mdx)
rather than x-api-key, and add a short callout mentioning that Privy JWTs still
use Bearer and sending both headers may cause a 401; reference the MCP path and
the header names (x-api-key and Authorization) so readers know this MCP-specific
auth pattern differs from the REST API guidance.
|
Closing in favor of a stack of focused PRs that split this combined change into single-responsibility units. Each is independently reviewable and revertible:
Each PR branches off The original |
Combines the design/narrative overhaul from
feature/docs-design-overhaul(24 commits) with every API doc update shipped tomainsince the branches diverged, plus a homepage rewrite, new Skills tab, and brand cleanup.What's in this PR
API doc merge (already accurate — nothing should regress)
/research/trackid-proxy,/research/curatorChartmetric contract,/research/track/playlists, error response alignment).research.json,accounts.json,releases.jsonare byte-identical to main./api/artist/socials→/api/artists/{id}/socialsartists/pin,artists/unpin,admins/agent-signupsartist/segments,artist/socials(old),chat/segment,segment/fansHome page
agent+) pattern from all production paths: home snippet/tip, "For AI agents" footer, Step 1 caveat,quickstart.mdxheadline demo,authentication.mdx"Instant (for agents)" subsection. Replaced with the honest 2-call signup+verify flow.agents.mdxretained as the one placeagent+is documented, with its existing warning that it creates a separate account.Skills tab (new)
skills.mdx) covers concept, install, SKILL.md contract, contribution flowskills/— each summarizes when the agent uses it, what it produces, which API endpoints it depends on, with source link to the canonical SKILL.md on recoupable/skillsResearch tab nav
Brand
wordmark-{light,dark}mode.svgin the header. Olddark.png/dark.svg/light.svgremoved.fonts/directory seeded with Geist / GeistMono / GeistPixel / InstrumentSerif / PlusJakartaSans — variable woff2 where available, ttf fallback for families without a variable woff2, no redundant weightsVerification
docs.jsonparses as valid JSON.mdxfiles ↔ 131 API nav entries (0 orphans, 0 dead refs)http://localhost:3333, including every new skill sub-pageNot in this PR (flagged for follow-up if desired)
favicon.ico. The newicon-{light,dark}mode.svgfiles are staged but not wired.Made with Cursor
Summary by CodeRabbit