{"name":"Recoup public website","version":"1.0","description":"Recoup provides AI transformation for music funds and rightsholders: AI strategy, custom systems, and team enablement. The platform, Skills, and API are additional ways to use Recoup's technology.","documentation":"https://recoupable.dev/agents","openapi":"https://recoupable.dev/openapi.json","content":[{"id":"page:/","type":"page","title":"Recoup — AI transformation for music funds and rightsholders","description":"AI strategy, custom systems, and team training for the business of music.","url":"https://recoupable.dev/","representation":"summary"},{"id":"page:/services","type":"page","title":"AI strategy, custom systems, and team training","description":"Consulting and implementation services for music funds and rightsholders, from a roadmap to working software and team adoption.","url":"https://recoupable.dev/services","representation":"summary"},{"id":"page:/advisory","type":"page","title":"AI advisory for music companies","description":"Find where AI fits, review recurring work, and choose a useful first project with a way to measure improvement.","url":"https://recoupable.dev/advisory","representation":"summary"},{"id":"page:/build","type":"page","title":"Custom AI systems for music businesses","description":"Agents, integrations, reporting dashboards, and full applications built around a music company's tools, data, and team.","url":"https://recoupable.dev/build","representation":"summary"},{"id":"page:/platform","type":"page","title":"The Recoup AI platform for artists and music teams","description":"A hosted workspace for artist context, research, campaign drafts, and recurring prompts and reports.","url":"https://recoupable.dev/platform","representation":"summary"},{"id":"page:/pricing","type":"page","title":"Recoup pricing — platform, advisory, and custom builds","description":"Compare self-serve Platform, Advisory, Build + Partner, and custom Enterprise engagements. API and MCP are billed by usage.","url":"https://recoupable.dev/pricing","representation":"summary"},{"id":"page:/skills","type":"page","title":"Recoup Skills — music playbooks for your AI","description":"Open-source methods for artist research, release planning, content preparation, and catalog work in compatible AI agents.","url":"https://recoupable.dev/skills","representation":"summary"},{"id":"page:/developers","type":"page","title":"Recoup REST API, MCP, CLI, and agent tools","description":"Connect artist context, research, content creation, and music-business workflows to applications and agents.","url":"https://recoupable.dev/developers","representation":"summary"},{"id":"page:/about","type":"page","title":"About Recoup","description":"An AI transformation partner combining music-business knowledge, software engineering, and team training.","url":"https://recoupable.dev/about","representation":"summary"},{"id":"page:/contact","type":"page","title":"Talk to Recoup about your company","description":"Discuss AI strategy, a custom system, or team training. Bring a company priority or recurring workflow.","url":"https://recoupable.dev/contact","representation":"summary"},{"id":"page:/start-project","type":"page","title":"Get a free AI audit or discuss a Recoup project","description":"Request a free review of one music-business workflow, where AI could help, and a practical first step. Selected paid plans retain their project inquiry and pricing.","url":"https://recoupable.dev/start-project","representation":"summary"},{"id":"page:/audit","type":"page","title":"AI readiness check for music companies","description":"Seven questions about a recurring workflow, information, and team ownership produce a practical suggested next step.","url":"https://recoupable.dev/audit","representation":"summary"},{"id":"page:/roi","type":"page","title":"AI workflow ROI planner","description":"Estimate capacity value and costs from your own assumptions about a recurring task, setup effort, and ongoing system costs.","url":"https://recoupable.dev/roi","representation":"summary"},{"id":"page:/acquisitions","type":"page","title":"AI for music catalog acquisitions","description":"Custom systems organize deal materials, draft diligence reviews, and connect open questions to source records.","url":"https://recoupable.dev/acquisitions","representation":"summary"},{"id":"page:/operations","type":"page","title":"AI royalty reporting and catalog operations","description":"Custom royalty intake, reconciliation, and recurring reporting systems keep matches, exceptions, and source records visible.","url":"https://recoupable.dev/operations","representation":"summary"},{"id":"page:/agents","type":"page","title":"Read Recoup with your AI agent","description":"Search and read Recoup's public pages, documentation, articles, and playbooks through public agent interfaces.","url":"https://recoupable.dev/agents","representation":"summary"},{"id":"page:/privacy","type":"page","title":"Recoup Privacy Policy","description":"Read the full policy covering information collection, use, disclosure, security, rights, and contact details.","url":"https://recoupable.dev/privacy","representation":"summary"},{"id":"page:/terms","type":"page","title":"Recoup Terms of Use","description":"Read the complete terms for Recoup's website, APIs, AI platform, and services.","url":"https://recoupable.dev/terms","representation":"summary"},{"id":"page:/case-studies","type":"page","title":"Recoup project stories","description":"Anonymized accounts of royalty reporting, investment preparation, and catalog intelligence work.","url":"https://recoupable.dev/case-studies","representation":"summary"},{"id":"page:/case-studies/royalty-reporting","type":"page","title":"Royalty reports. With answers behind the numbers.","description":"Bring statements and receipts into a repeatable review, with the differences and their source records ready to inspect.","url":"https://recoupable.dev/case-studies/royalty-reporting","representation":"summary"},{"id":"page:/case-studies/investment-review","type":"page","title":"A first draft that knows the deal.","description":"Put the model, prior memos, analyst notes, and email context to work before the investment team starts its review.","url":"https://recoupable.dev/case-studies/investment-review","representation":"summary"},{"id":"page:/case-studies/catalog-intelligence","type":"page","title":"A catalog brief worth opening.","description":"Turn streams of music data into a focused review of what changed, what is reliable, and what deserves a closer look.","url":"https://recoupable.dev/case-studies/catalog-intelligence","representation":"summary"},{"id":"page:/music-videos","type":"page","title":"Music Videos for Less Than $10 | Free Skill Download","description":"Make a music video with Recoup’s free skill. Download the workflow, explore self-serve generation for less than $10, or request a custom quote.","url":"https://recoupable.dev/music-videos","representation":"full"},{"id":"docs:index","type":"docs","title":"Recoup API Documentation","description":"Use the Recoup API to build your record label. Access research, content creation, chat, artist analytics, social media, and platform management endpoints.","url":"https://recoupable.dev/docs","representation":"full"},{"id":"docs:quickstart","type":"docs","title":"Quickstart","description":"Get a Recoup API key in one call and make your first request — no browser, no dashboard.","url":"https://recoupable.dev/docs/quickstart","representation":"full"},{"id":"docs:cli","type":"docs","title":"CLI","description":"Install the Recoup CLI and interact with the platform from your terminal.","url":"https://recoupable.dev/docs/cli","representation":"full"},{"id":"docs:claude","type":"docs","title":"Claude","description":"Set up Recoup inside Claude with the Recoup plugin marketplace and the getting-started skill.","url":"https://recoupable.dev/docs/claude","representation":"full"},{"id":"docs:mcp","type":"docs","title":"MCP","description":"Connect AI agents to the Recoup platform using the Model Context Protocol (MCP) server.","url":"https://recoupable.dev/docs/mcp","representation":"full"},{"id":"docs:authentication","type":"docs","title":"Authentication","description":"How authentication works in the Recoup API — API keys, access tokens, and organization access control.","url":"https://recoupable.dev/docs/authentication","representation":"full"},{"id":"docs:credits","type":"docs","title":"Credits","description":"How Recoup credits work — what's billed, how to check your balance, and how to upgrade.","url":"https://recoupable.dev/docs/credits","representation":"full"},{"id":"docs:workflows/create-artist","type":"docs","title":"Create a New Artist","description":"End-to-end workflow to create, research and enrich a new artist account in a single session.","url":"https://recoupable.dev/docs/workflows/create-artist","representation":"full"},{"id":"docs:api-reference/artists/list","type":"docs","title":"Get Artists","description":"Retrieve artists accessible to the authenticated account. The account is derived from the API key or Bearer token. When org_id is omitted, returns only the account's own artists. Pass org_id to view artists in a specific organization. Pass account_id to filter to a specific account the API key has access to.","url":"https://recoupable.dev/docs/api-reference/artists/list","representation":"full","api":{"method":"GET","path":"/api/artists","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/profile","type":"docs","title":"Get Artist Profile","description":"Public artist profile: the artist's name, image, connected social profiles, and linked catalogs in one call.","url":"https://recoupable.dev/docs/api-reference/artists/profile","representation":"full","api":{"method":"GET","path":"/api/artists/{id}/profile","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/create","type":"docs","title":"Create Artist","description":"Create a new artist account. When spotify_artist_id is provided and a canonical artist already exists for it, the existing artist is linked to the account instead of creating a duplicate. The artist can optionally be linked to an organization.","url":"https://recoupable.dev/docs/api-reference/artists/create","representation":"full","api":{"method":"POST","path":"/api/artists","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/update","type":"docs","title":"Update Artist","description":"Update an artist. All body fields are optional, but at least one must be provided. Use this endpoint to set basic profile (name, image, label), AI instructions, knowledge base entries, social profile URLs (mapped by platform), and pinned state for the calling account.","url":"https://recoupable.dev/docs/api-reference/artists/update","representation":"full","api":{"method":"PATCH","path":"/api/artists/{id}","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/pin","type":"docs","title":"Pin Artist","description":"Pin an artist. This updates the caller's pinned preference for the artist.","url":"https://recoupable.dev/docs/api-reference/artists/pin","representation":"full","api":{"method":"POST","path":"/api/artists/{id}/pin","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/unpin","type":"docs","title":"Unpin Artist","description":"Unpin an artist. This updates the caller's pinned preference for the artist.","url":"https://recoupable.dev/docs/api-reference/artists/unpin","representation":"full","api":{"method":"DELETE","path":"/api/artists/{id}/pin","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/delete","type":"docs","title":"Delete Artist","description":"Delete an artist accessible to the authenticated account.","url":"https://recoupable.dev/docs/api-reference/artists/delete","representation":"full","api":{"method":"DELETE","path":"/api/artists/{id}","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/socials","type":"docs","title":"Get Artist Socials","description":"Retrieve all social media profiles associated with an artist, with the latest follower counts from the most recent scrape. Call this before the Social Posts or Social Scrape endpoints to obtain the social IDs. Pass `history` to also get each profile's follower snapshots, so week-over-week movement is a read instead of something the caller has to remember.","url":"https://recoupable.dev/docs/api-reference/artists/socials","representation":"full","api":{"method":"GET","path":"/api/artists/{id}/socials","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/artists/socials-delete","type":"docs","title":"Delete Artist Social","description":"Remove a social profile link from an artist to correct a wrongly auto-matched social.","url":"https://recoupable.dev/docs/api-reference/artists/socials-delete","representation":"full","api":{"method":"DELETE","path":"/api/artists/{id}/socials/{socialId}","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/fans/get","type":"docs","title":"Get Artist Fans","description":"Retrieve the social profiles of an artist's fans: the accounts that commented on the artist's scraped posts (Instagram today). Every Instagram scrape is followed by one batched profile run over the new commenters, which fills `avatar`, `bio`, `follower_count` and `following_count` on each fan; `region` is null unless the platform reports one. Supports pagination for large fan lists.","url":"https://recoupable.dev/docs/api-reference/fans/get","representation":"full","api":{"method":"GET","path":"/api/artists/{id}/fans","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/chat/workflow","type":"docs","title":"Stream Chat","description":"Stream sandbox-driven chat (Vercel Workflow)","url":"https://recoupable.dev/docs/api-reference/chat/workflow","representation":"full","api":{"method":"POST","path":"/api/chat","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/workflow-stream","type":"docs","title":"Resume Chat Stream","description":"Resume a chat response stream","url":"https://recoupable.dev/docs/api-reference/chat/workflow-stream","representation":"full","api":{"method":"GET","path":"/api/chat/{chatId}/stream","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/runs","type":"docs","title":"Start Chat Run","description":"Start an asynchronous, headless chat-generation run on the durable agent workflow — the same engine as interactive [`POST /api/chat`](/api-reference/chat/workflow).","url":"https://recoupable.dev/docs/api-reference/chat/runs","representation":"full","api":{"method":"POST","path":"/api/chat/runs","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/runs-status","type":"docs","title":"Get Chat Run Status","description":"Status of an asynchronous run started via [`POST /api/chat/runs`](/api-reference/chat/runs). Returns a point-in-time snapshot (**is it done?**) — not the generated content.","url":"https://recoupable.dev/docs/api-reference/chat/runs-status","representation":"full","api":{"method":"GET","path":"/api/chat/runs/{runId}","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/stop","type":"docs","title":"Stop Chat","description":"Stop the response currently being generated for a chat, freeing it to accept a new message. Idempotent — returns `stopped: false` when nothing is in progress. The chat must belong to the authenticated account.","url":"https://recoupable.dev/docs/api-reference/chat/stop","representation":"full","api":{"method":"POST","path":"/api/chat/{chatId}/stop","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/create","type":"docs","title":"Create Chat","description":"Create a new chat room. Optionally associate it with an artist and/or provide a client-generated chat ID. Pass accountId to create a chat on behalf of a specific account the API key has access to.","url":"https://recoupable.dev/docs/api-reference/chat/create","representation":"full","api":{"method":"POST","path":"/api/chats","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/chats","type":"docs","title":"Get Chats","description":"Returns chats for the authenticated account. Personal Bearer tokens see only the caller's chats; org keys see chats across the org's member accounts; admin keys see all chats. Each row carries the chat id and the session id needed to build the chat URL.","url":"https://recoupable.dev/docs/api-reference/chat/chats","representation":"full","api":{"method":"GET","path":"/api/chats","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/artist","type":"docs","title":"Get Chat Artist","description":"Retrieve the artist associated with a specific chat room. Returns 404 if the chat does not exist or is not accessible by the authenticated caller.","url":"https://recoupable.dev/docs/api-reference/chat/artist","representation":"full","api":{"method":"GET","path":"/api/chats/{id}/artist","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/update","type":"docs","title":"Update Chat","description":"Update a chat room's topic (display name). The chatId is required; the topic field will be updated. Topic must be between 3 and 50 characters.","url":"https://recoupable.dev/docs/api-reference/chat/update","representation":"full","api":{"method":"PATCH","path":"/api/chats","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/delete","type":"docs","title":"Delete Chat","description":"Delete a chat room by ID. This operation also removes related room records (memory emails, memories) before deleting the room itself.","url":"https://recoupable.dev/docs/api-reference/chat/delete","representation":"full","api":{"method":"DELETE","path":"/api/chats","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/compact","type":"docs","title":"Compact Chats","description":"Compact one or more chat conversations into summarized versions. This reduces the size of chat history while preserving key information. Optionally provide a prompt to control what information gets preserved in the compacted summary.","url":"https://recoupable.dev/docs/api-reference/chat/compact","representation":"full","api":{"method":"POST","path":"/api/chats/compact","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/ai/models","type":"docs","title":"List Models","description":"Returns the catalog of language models available through the Vercel AI Gateway. Embedding models are filtered out. The full schema mirrors the Vercel AI Gateway response (`GatewayLanguageModelEntry` from `@ai-sdk/gateway`); the documented properties below are the load-bearing fields used by clients. No authentication required.","url":"https://recoupable.dev/docs/api-reference/ai/models","representation":"full","api":{"method":"GET","path":"/api/ai/models","specificationUrl":"https://recoupable.dev/docs/spec/ai.json"}},{"id":"docs:api-reference/chat/messages","type":"docs","title":"Get Chat Messages","description":"Retrieve all messages (memories) for a specific chat room in chronological order.","url":"https://recoupable.dev/docs/api-reference/chat/messages","representation":"full","api":{"method":"GET","path":"/api/chats/{id}/messages","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/messages-copy","type":"docs","title":"Copy Chat Messages","description":"Copy all messages from the source chat (`id` path param) to a target chat (`targetChatId` in request body). By default, existing target messages are cleared before copy.","url":"https://recoupable.dev/docs/api-reference/chat/messages-copy","representation":"full","api":{"method":"POST","path":"/api/chats/{id}/messages/copy","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/chat/messages-trailing-delete","type":"docs","title":"Delete Trailing Chat Messages","description":"Delete all messages in a chat from a given message onward (inclusive), identified by `from_message_id`.","url":"https://recoupable.dev/docs/api-reference/chat/messages-trailing-delete","representation":"full","api":{"method":"DELETE","path":"/api/chats/{id}/messages/trailing","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/events","type":"docs","title":"Artist Events","description":"List an artist's live shows. Returns one row per event with venue, city, country, ticket link, and lineup.","url":"https://recoupable.dev/docs/api-reference/research/events","representation":"full","api":{"method":"POST","path":"/api/research/events","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/track-stats","type":"docs","title":"Track Stats","description":"Get the current Spotify play count for one recording by ISRC, served from the Apify-backed measurement store. A fresh capture is returned as-is; a stale or missing one triggers a refresh of the recording's album through the Spotify play-count actor before responding.","url":"https://recoupable.dev/docs/api-reference/research/track-stats","representation":"full","api":{"method":"GET","path":"/api/research/track/stats","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/measurements","type":"docs","title":"Track measurements","description":"Track measurements","url":"https://recoupable.dev/docs/api-reference/research/measurements","representation":"full","api":{"method":"GET","path":"/api/research/tracks/{id}/measurements","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/album-measurements","type":"docs","title":"Album measurements","description":"Album measurements","url":"https://recoupable.dev/docs/api-reference/research/album-measurements","representation":"full","api":{"method":"GET","path":"/api/research/albums/{id}/measurements","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/measurement-jobs","type":"docs","title":"Create measurement job","description":"Create a measurement job","url":"https://recoupable.dev/docs/api-reference/research/measurement-jobs","representation":"full","api":{"method":"POST","path":"/api/research/measurement-jobs","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/web","type":"docs","title":"Web Search","description":"Search the web for real-time information. Returns ranked results with titles, URLs, and content snippets. Use for narrative context, press coverage, and cultural research that structured data endpoints don't cover.","url":"https://recoupable.dev/docs/api-reference/research/web","representation":"full","api":{"method":"POST","path":"/api/research/web","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/deep","type":"docs","title":"Deep Research","description":"Perform deep, comprehensive research on a topic. Browses multiple sources extensively and returns a cited report. Use for full artist deep dives, competitive analysis, and any research requiring synthesis across many sources.","url":"https://recoupable.dev/docs/api-reference/research/deep","representation":"full","api":{"method":"POST","path":"/api/research/deep","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/people","type":"docs","title":"People Search","description":"Search for people in the music industry — artists, managers, A&R reps, producers. Returns multi-source profiles including LinkedIn data.","url":"https://recoupable.dev/docs/api-reference/research/people","representation":"full","api":{"method":"POST","path":"/api/research/people","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/extract","type":"docs","title":"Extract URL","description":"Extract clean markdown content from one or more public URLs. Handles JavaScript-heavy pages and PDFs. Returns focused excerpts aligned to an objective, or full page content.","url":"https://recoupable.dev/docs/api-reference/research/extract","representation":"full","api":{"method":"POST","path":"/api/research/extract","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/research/enrich","type":"docs","title":"Enrich","description":"Enrich an entity with structured data from web research. Provide a description of who or what to research and a JSON schema defining the fields to extract. Returns typed data with citations. **Important:** The `schema` object must include `\"type\": \"object\"` at the top level — requests without an explicit type will be rejected.","url":"https://recoupable.dev/docs/api-reference/research/enrich","representation":"full","api":{"method":"POST","path":"/api/research/enrich","specificationUrl":"https://recoupable.dev/docs/spec/research.json"}},{"id":"docs:api-reference/songs/songs","type":"docs","title":"Get Songs","description":"Retrieve songs from the database with optional filtering by ISRC (International Standard Recording Code) or artist account. This endpoint joins the songs table with song_artists and accounts tables to provide comprehensive song information.","url":"https://recoupable.dev/docs/api-reference/songs/songs","representation":"full","api":{"method":"GET","path":"/api/songs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/create","type":"docs","title":"Create Songs","description":"Bulk create or fetch songs by ISRC. For each song, the API attempts to look up metadata via internal search. If no data is found, optional fallback fields (name, album, notes, artists) are used.","url":"https://recoupable.dev/docs/api-reference/songs/create","representation":"full","api":{"method":"POST","path":"/api/songs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/analyze","type":"docs","title":"Analyze Songs","description":"Analyze music using a state-of-the-art Audio Language Model ([Music Flamingo](https://www.universalmusic.com/universal-music-group-to-transform-music-experience-for-billions-of-fans-with-nvidia-ai/)) that listens directly to the audio waveform.","url":"https://recoupable.dev/docs/api-reference/songs/analyze","representation":"full","api":{"method":"POST","path":"/api/songs/analyze","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/analyze-presets","type":"docs","title":"List Analyze Presets","description":"Lists all available music analysis presets. Each preset is a curated prompt with optimized generation parameters for a specific use case (e.g. catalog metadata enrichment, sync licensing analysis, audience profiling). Requires authentication via API key or Bearer token.","url":"https://recoupable.dev/docs/api-reference/songs/analyze-presets","representation":"full","api":{"method":"GET","path":"/api/songs/analyze/presets","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalogs","type":"docs","title":"Get Catalogs","description":"Retrieve the catalogs visible to a specific account. Returns the catalogs the account owns directly, plus the catalogs owned by any organization the account belongs to - so every member of an organization sees that organization's catalogs without passing the organization's id. A catalog owned both directly and through an organization is returned once. An account that belongs to no organization receives only its own catalogs. Create an organization-owned catalog with [Create catalog](/api-reference/songs/catalogs-create) or [Run valuation](/api-reference/songs/valuation-run).","url":"https://recoupable.dev/docs/api-reference/songs/catalogs","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/catalogs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalogs-create","type":"docs","title":"Create Catalog","description":"Create a catalog, owned by the calling account or - with organization_id - by one of the caller's organizations, in which case every member of that organization sees it via [Get Catalogs](/api-reference/songs/catalogs). When materializing from a valuation snapshot, the endpoint also attaches the snapshot's canonical artist to the caller's roster: the measured songs' existing song-artist links are resolved to the dominant artist account, which is added to the caller's roster if not already present. The attach also runs on idempotent re-claims of an already-materialized snapshot. The roster attach always targets the calling account, even when the catalog is owned by an organization.","url":"https://recoupable.dev/docs/api-reference/songs/catalogs-create","representation":"full","api":{"method":"POST","path":"/api/catalogs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-rename","type":"docs","title":"Rename Catalog","description":"Rename a catalog. The only mutable field is the display name — catalog membership is managed through [Add catalog songs](/api-reference/songs/catalog-songs-add) and [Remove catalog songs](/api-reference/songs/catalog-songs-delete).","url":"https://recoupable.dev/docs/api-reference/songs/catalog-rename","representation":"full","api":{"method":"PATCH","path":"/api/catalogs/{catalogId}","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-delete","type":"docs","title":"Delete Catalog","description":"Delete a catalog. Removes the catalog, its song membership (catalog_songs), its ownership links (account_catalogs) and its stored valuation history (catalog_valuations).","url":"https://recoupable.dev/docs/api-reference/songs/catalog-delete","representation":"full","api":{"method":"DELETE","path":"/api/catalogs/{catalogId}","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/valuation-run","type":"docs","title":"Run Valuation","description":"Run valuation","url":"https://recoupable.dev/docs/api-reference/songs/valuation-run","representation":"full","api":{"method":"POST","path":"/api/valuation","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/runs","type":"docs","title":"Get Runs","description":"Get runs","url":"https://recoupable.dev/docs/api-reference/songs/runs","representation":"full","api":{"method":"GET","path":"/api/runs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-measurements","type":"docs","title":"Get Catalog Measurements","description":"Get the latest play counts and a derived valuation band for a catalog. Measurements are captured by [Create measurement job](/api-reference/research/measurement-jobs) runs; the band is computed at read time from the latest capture per song.","url":"https://recoupable.dev/docs/api-reference/songs/catalog-measurements","representation":"full","api":{"method":"GET","path":"/api/catalogs/{catalogId}/measurements","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-valuations","type":"docs","title":"Get Catalog Valuations","description":"Get the persisted valuation history for a catalog, latest first. A row is written each time a valuation band is computed for the whole catalog (valuation runs and measurement reads persist at most one row per catalog per day). Use limit=1 for the current value. History is what makes week-over-week deltas possible.","url":"https://recoupable.dev/docs/api-reference/songs/catalog-valuations","representation":"full","api":{"method":"GET","path":"/api/catalogs/{catalogId}/valuations","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-songs","type":"docs","title":"Get Catalog Songs","description":"Retrieve songs within a specific catalog with pagination support. This endpoint joins catalog_songs with songs, song_artists, and accounts to provide comprehensive song information for a given catalog.","url":"https://recoupable.dev/docs/api-reference/songs/catalog-songs","representation":"full","api":{"method":"GET","path":"/api/catalogs/songs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-songs-add","type":"docs","title":"Add Catalog Songs","description":"Batch add songs to a catalog by ISRC. For each song, the API attempts to look up metadata via internal search. If no data is found, optional fallback fields (name, album, notes, artists) are used.","url":"https://recoupable.dev/docs/api-reference/songs/catalog-songs-add","representation":"full","api":{"method":"POST","path":"/api/catalogs/songs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/songs/catalog-songs-delete","type":"docs","title":"Remove Catalog Songs","description":"Batch remove songs from a catalog by ISRC. Deletes the relationship in catalog_songs for each catalog_id and ISRC pair.","url":"https://recoupable.dev/docs/api-reference/songs/catalog-songs-delete","representation":"full","api":{"method":"DELETE","path":"/api/catalogs/songs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:workflows/generate-music-video","type":"docs","title":"Generate a Music Video","description":"End-to-end workflow to produce a vertical, social-ready music video — image, motion, caption — from an artist and a song.","url":"https://recoupable.dev/docs/workflows/generate-music-video","representation":"full"},{"id":"docs:api-reference/content/create","type":"docs","title":"Create Content","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).","url":"https://recoupable.dev/docs/api-reference/content/create","representation":"full","api":{"method":"POST","path":"/api/content/create","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/generate-image","type":"docs","title":"Generate Image","description":"Generate an image from a text prompt. Pass `image_urls` to edit those images with the prompt instead of generating a new one. Returns the image URL.","url":"https://recoupable.dev/docs/api-reference/content/generate-image","representation":"full","api":{"method":"POST","path":"/api/content/image","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/generate-video","type":"docs","title":"Generate Video","description":"Generate a video from a text prompt, optionally animating a still image (`image_url`) or transitioning between two images (`image_url` + `end_image_url`).","url":"https://recoupable.dev/docs/api-reference/content/generate-video","representation":"full","api":{"method":"POST","path":"/api/content/video","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/generate-caption","type":"docs","title":"Generate Caption","description":"Generate a short caption from a topic. Returns the text content and default styling (font, color, size).","url":"https://recoupable.dev/docs/api-reference/content/generate-caption","representation":"full","api":{"method":"POST","path":"/api/content/caption","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/transcribe-audio","type":"docs","title":"Transcribe Audio","description":"Transcribe audio into text with word-level timestamps. Pass one or more audio file URLs in `audio_urls`. Returns the full transcript and an array of timed segments.","url":"https://recoupable.dev/docs/api-reference/content/transcribe-audio","representation":"full","api":{"method":"POST","path":"/api/content/transcribe","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/edit","type":"docs","title":"Edit Content","description":"Apply ffmpeg edits to a video — trim, crop, resize, or overlay text. Pass a `template` for a preset edit pipeline, or build your own with an `operations` array.","url":"https://recoupable.dev/docs/api-reference/content/edit","representation":"full","api":{"method":"PATCH","path":"/api/content","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/upscale","type":"docs","title":"Upscale Content","description":"Upscale an image or video to higher resolution. Pass the URL and specify the type. Returns the upscaled URL.","url":"https://recoupable.dev/docs/api-reference/content/upscale","representation":"full","api":{"method":"POST","path":"/api/content/upscale","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/analyze-video","type":"docs","title":"Analyze Video","description":"Analyze a video and answer questions about it. Pass a video URL and a text prompt — for example, \"Describe what happens\" or \"Rate the visual quality 1-10.\" Returns the generated text.","url":"https://recoupable.dev/docs/api-reference/content/analyze-video","representation":"full","api":{"method":"POST","path":"/api/content/analyze","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/templates","type":"docs","title":"List Templates","description":"List all available content creation templates. Templates are optional — every content primitive works without one. When you do use a template, it provides a complete creative recipe: image prompts, video motion config, caption style rules, and edit operations. Returns template ID and description only — enough to pick the right one.","url":"https://recoupable.dev/docs/api-reference/content/templates","representation":"full","api":{"method":"GET","path":"/api/content/templates","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/template-detail","type":"docs","title":"Get Template Detail","description":"Get the full configuration for a specific content creation template. Returns the complete creative recipe including image prompts, video motion config, caption style rules, and edit operations.","url":"https://recoupable.dev/docs/api-reference/content/template-detail","representation":"full","api":{"method":"GET","path":"/api/content/templates/{id}","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/validate","type":"docs","title":"Validate Artist","description":"Check whether an artist has all the required files to run the content creation pipeline. Returns a structured report of each required and recommended file with its status. Required files must be present or the pipeline will fail. Recommended files improve output quality but are not strictly necessary. Provide `artist_account_id` as a query parameter.","url":"https://recoupable.dev/docs/api-reference/content/validate","representation":"full","api":{"method":"GET","path":"/api/content/validate","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content/estimate","type":"docs","title":"Estimate Cost","description":"Estimate the cost of running the content creation pipeline. Calculates per-step and per-video costs based on current pricing. Supports comparing multiple workflow profiles (e.g., premium vs. budget) and projecting batch costs. This endpoint is informational only — it does not trigger any pipeline execution or spend credits.","url":"https://recoupable.dev/docs/api-reference/content/estimate","representation":"full","api":{"method":"GET","path":"/api/content/estimate","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/image/generation","type":"docs","title":"Generate Image","description":"Generate high-quality images using AI models. Images are automatically stored on Arweave and include In Process moment metadata for provenance and ownership tracking.","url":"https://recoupable.dev/docs/api-reference/image/generation","representation":"full","api":{"method":"GET","path":"/api/image/generate","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/transcribe/audio","type":"docs","title":"Transcribe Audio","description":"Transcribe audio files using OpenAI Whisper. The API saves both the original audio file and the generated markdown transcript to the customer's files in Supabase Storage. The owner account is derived from your credentials; you must have access to the specified artist_account_id.","url":"https://recoupable.dev/docs/api-reference/transcribe/audio","representation":"full","api":{"method":"POST","path":"/api/transcribe","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/music/generate","type":"docs","title":"Generate Music","description":"Generate music","url":"https://recoupable.dev/docs/api-reference/music/generate","representation":"full","api":{"method":"POST","path":"/api/music","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/music/list","type":"docs","title":"List Music Generations","description":"List music generations","url":"https://recoupable.dev/docs/api-reference/music/list","representation":"full","api":{"method":"GET","path":"/api/music","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/music/get","type":"docs","title":"Get Music Generation","description":"Get music generation","url":"https://recoupable.dev/docs/api-reference/music/get","representation":"full","api":{"method":"GET","path":"/api/music/{generationId}","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/posts/get","type":"docs","title":"Get Artist Posts","description":"Retrieve all social media posts from an artist across all platforms. This endpoint aggregates posts from all connected social media profiles for the specified artist, newest first. Engagement counts (`views`, `likes`, `comments`, `reposts`) are the values captured by the most recent scrape of that profile; they are null on platforms that do not report them and on posts stored before engagement capture. Supports pagination for large post collections.","url":"https://recoupable.dev/docs/api-reference/posts/get","representation":"full","api":{"method":"GET","path":"/api/artists/{id}/posts","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/comments/get","type":"docs","title":"Get Comments","description":"Retrieve comments associated with an artist or a specific post, with support for pagination. This endpoint returns raw comment data including the comment text, associated post, and commenter's social profile reference.","url":"https://recoupable.dev/docs/api-reference/comments/get","representation":"full","api":{"method":"GET","path":"/api/comments","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/social/scrape","type":"docs","title":"Social Scrape","description":"Trigger a scrape of one social profile. Use [Get Artist Socials](/api-reference/artists/socials) first to get the social `id`. The response is the Apify run metadata; poll it with the [Scraper Results API](/api-reference/apify/scraper).","url":"https://recoupable.dev/docs/api-reference/social/scrape","representation":"full","api":{"method":"POST","path":"/api/socials/{id}/scrape","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/artist/socials-scrape","type":"docs","title":"api-reference/artist/socials-scrape","description":"Trigger scrape jobs for all social profiles linked to an artist. Returns a runId per social profile that you can poll for status and results via the [Scraper Results API](/api-reference/apify/scraper).","url":"https://recoupable.dev/docs/api-reference/artist/socials-scrape","representation":"full","api":{"method":"POST","path":"/api/artist/socials/scrape","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/spotify/search","type":"docs","title":"Search","description":"Search for artists, albums, tracks, and playlists using the Spotify API. This endpoint is a proxy to the official Spotify Search API.","url":"https://recoupable.dev/docs/api-reference/spotify/search","representation":"full","api":{"method":"GET","path":"/api/spotify/search","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/spotify/artist","type":"docs","title":"Get Artist","description":"Get Spotify catalog information for a single artist identified by their unique Spotify ID.","url":"https://recoupable.dev/docs/api-reference/spotify/artist","representation":"full","api":{"method":"GET","path":"/api/spotify/artist/","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/spotify/artist-albums","type":"docs","title":"Get Artist Albums","description":"Get Spotify catalog information about an artist's albums.","url":"https://recoupable.dev/docs/api-reference/spotify/artist-albums","representation":"full","api":{"method":"GET","path":"/api/spotify/artist/albums","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/spotify/artist-top-tracks","type":"docs","title":"Get Artist Top Tracks","description":"Get an artist's top tracks by country.","url":"https://recoupable.dev/docs/api-reference/spotify/artist-top-tracks","representation":"full","api":{"method":"GET","path":"/api/spotify/artist/topTracks","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/spotify/album","type":"docs","title":"Get Album","description":"Get Spotify catalog information for a single album.","url":"https://recoupable.dev/docs/api-reference/spotify/album","representation":"full","api":{"method":"GET","path":"/api/spotify/album","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/apple/songs","type":"docs","title":"Songs by ISRC","description":"Look up recordings in the Apple Music catalog by ISRC. Accepts up to 25 comma-separated ISRCs per request and returns one row per **requested** ISRC, so a recording that Apple does not carry comes back explicitly as `found: false` rather than being omitted. Complements `GET /api/spotify/search`, which reaches ISRCs only through a fuzzy `isrc:` search query; Apple matches the identifier exactly and additionally returns release-level rights metadata (`upc`, `record_label`, `copyright`) that Spotify does not expose.","url":"https://recoupable.dev/docs/api-reference/apple/songs","representation":"full","api":{"method":"GET","path":"/api/apple/songs","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/apify/scraper","type":"docs","title":"Scraper Results","description":"Check the status and retrieve results from Apify scraper runs. This endpoint uses the Apify API Client to fetch the current status of a scraper run and its results if available. Use the runId returned from endpoints like Instagram Comments, Instagram Profiles, Social Scrape, or Artist Socials Scrape to poll for results.","url":"https://recoupable.dev/docs/api-reference/apify/scraper","representation":"full","api":{"method":"GET","path":"/api/apify/runs/{runId}","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/agents/signup","type":"docs","title":"Agent Signup","description":"Register an agent. For new agent+ emails, returns an API key immediately. For all other cases, sends a verification code to the email — call [POST /api/agents/verify](/api-reference/agents/verify) with the code to get your API key.","url":"https://recoupable.dev/docs/api-reference/agents/signup","representation":"full","api":{"method":"POST","path":"/api/agents/signup","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/agents/verify","type":"docs","title":"Verify Agent Email","description":"Verify an agent's email with the code sent during signup. Returns an API key on success.","url":"https://recoupable.dev/docs/api-reference/agents/verify","representation":"full","api":{"method":"POST","path":"/api/agents/verify","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:agents","type":"docs","title":"Agents","description":"Programmatic agent onboarding — sign up and obtain API keys in one call, no dashboard, no human in the loop.","url":"https://recoupable.dev/docs/agents","representation":"full"},{"id":"docs:content-agent","type":"docs","title":"Content","description":"Generate images, videos, captions, and social-ready content using AI-powered primitives","url":"https://recoupable.dev/docs/content-agent","representation":"full"},{"id":"docs:api-reference/templates/list","type":"docs","title":"List Templates","description":"List templates","url":"https://recoupable.dev/docs/api-reference/templates/list","representation":"full","api":{"method":"GET","path":"/api/agents/templates","specificationUrl":"https://recoupable.dev/docs/spec/templates.json"}},{"id":"docs:api-reference/templates/create","type":"docs","title":"Create Template","description":"Create a template","url":"https://recoupable.dev/docs/api-reference/templates/create","representation":"full","api":{"method":"POST","path":"/api/agents/templates","specificationUrl":"https://recoupable.dev/docs/spec/templates.json"}},{"id":"docs:api-reference/templates/update","type":"docs","title":"Update Template","description":"Update a template","url":"https://recoupable.dev/docs/api-reference/templates/update","representation":"full","api":{"method":"PATCH","path":"/api/agents/templates/{id}","specificationUrl":"https://recoupable.dev/docs/spec/templates.json"}},{"id":"docs:api-reference/templates/delete","type":"docs","title":"Delete Template","description":"Delete a template","url":"https://recoupable.dev/docs/api-reference/templates/delete","representation":"full","api":{"method":"DELETE","path":"/api/agents/templates/{id}","specificationUrl":"https://recoupable.dev/docs/spec/templates.json"}},{"id":"docs:api-reference/templates/favorite","type":"docs","title":"Favorite Template","description":"Toggle favorite on a template","url":"https://recoupable.dev/docs/api-reference/templates/favorite","representation":"full","api":{"method":"PUT","path":"/api/agents/templates/{id}/favorite","specificationUrl":"https://recoupable.dev/docs/spec/templates.json"}},{"id":"docs:api-reference/tasks/get","type":"docs","title":"Get Tasks","description":"Retrieve scheduled tasks. Each task includes `recent_runs` (last 5 runs), `upcoming` (next scheduled run times) sourced directly from the Trigger.dev API, and `owner_email` when an account email exists for the task owner. Supports filtering by id, account_id, or artist_account_id.","url":"https://recoupable.dev/docs/api-reference/tasks/get","representation":"full","api":{"method":"GET","path":"/api/tasks","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/tasks/create","type":"docs","title":"Create Task","description":"Create a new scheduled task that runs a prompt against an artist on a recurring cron schedule. The response matches the [GET endpoint](/api-reference/tasks/get) (a `TasksResponse` with the created task in the `tasks` array).","url":"https://recoupable.dev/docs/api-reference/tasks/create","representation":"full","api":{"method":"POST","path":"/api/tasks","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/tasks/update","type":"docs","title":"Update Task","description":"Update scheduled task","url":"https://recoupable.dev/docs/api-reference/tasks/update","representation":"full","api":{"method":"PATCH","path":"/api/tasks","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/tasks/delete","type":"docs","title":"Delete Task","description":"Delete scheduled task","url":"https://recoupable.dev/docs/api-reference/tasks/delete","representation":"full","api":{"method":"DELETE","path":"/api/tasks","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/tasks/runs","type":"docs","title":"Get Task Runs","description":"Get task runs","url":"https://recoupable.dev/docs/api-reference/tasks/runs","representation":"full","api":{"method":"GET","path":"/api/tasks/runs","specificationUrl":"https://recoupable.dev/docs/spec/releases.json"}},{"id":"docs:api-reference/content-agent/webhook","type":"docs","title":"Slack Webhook","description":"Webhook endpoint for the Recoup Content Agent Slack bot. Receives @mention events from Slack and triggers content generation for the mentioned artist. The bot parses the mention text for `<artist_account_id> [template] [batch=N] [lipsync]`, validates the artist, calls POST /api/content/create, and starts a background polling task that reports results back to the Slack thread.","url":"https://recoupable.dev/docs/api-reference/content-agent/webhook","representation":"full","api":{"method":"POST","path":"/api/content-agent/{platform}","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/content-agent/callback","type":"docs","title":"Task Callback","description":"Internal callback endpoint for the `poll-content-run` Trigger.dev task. Receives content generation results and posts them back to the originating Slack thread. Authenticated via the `x-callback-secret` header.","url":"https://recoupable.dev/docs/api-reference/content-agent/callback","representation":"full","api":{"method":"POST","path":"/api/content-agent/callback","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/list","type":"docs","title":"List Sandboxes","description":"List all sandboxes associated with the authenticated account and their current statuses. Returns sandbox details including lifecycle state, timeout remaining, and creation timestamp. Pass account_id to retrieve sandboxes for a specific account the API key has access to. Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/list","representation":"full","api":{"method":"GET","path":"/api/sandboxes","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/create","type":"docs","title":"Create Sandbox","description":"Create a new ephemeral sandbox environment. Optionally executes a command or an OpenCode prompt if provided. Sandboxes are isolated Linux microVMs that can be used to evaluate account-generated code, run AI agent output safely, or execute reproducible tasks. The sandbox will automatically stop after the timeout period. If no command or prompt is provided, the sandbox is created without triggering any background task. Use the prompt parameter as a shortcut to run `opencode run \"<prompt>\"` in the sandbox. Pass account_id to create a sandbox for a specific account the API key has access to. Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/create","representation":"full","api":{"method":"POST","path":"/api/sandboxes","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/snapshot","type":"docs","title":"Update Snapshot","description":"Set a custom snapshot ID for an account. By default, updates the key owner's account. Pass account_id to target a specific account the API key has access to. This allows accounts to use a specific sandbox snapshot when creating new sandboxes, enabling reproducible environments with pre-configured tools, dependencies, and files.","url":"https://recoupable.dev/docs/api-reference/sandboxes/snapshot","representation":"full","api":{"method":"PATCH","path":"/api/sandboxes","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/delete","type":"docs","title":"Delete Sandbox","description":"Delete a sandbox environment for the authenticated account. This permanently deletes the associated GitHub repository and removes the account's snapshot record from the database. By default, deletes the sandbox for the key owner's account. Pass account_id to target a specific account the API key has access to. Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/delete","representation":"full","api":{"method":"DELETE","path":"/api/sandboxes","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/setup","type":"docs","title":"Setup Sandbox","description":"Triggers the setup-sandbox background task to create a personal sandbox, provision a GitHub repo, take a snapshot, and shut down. By default, sets up the sandbox for the key owner's account. Pass account_id to target a specific account the API key has access to. Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/setup","representation":"full","api":{"method":"POST","path":"/api/sandboxes/setup","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/get-file","type":"docs","title":"Get File Contents","description":"Retrieve the contents of a file from the authenticated account's sandbox GitHub repository. Resolves the github_repo from the [account's snapshot](/api-reference/sandboxes/list), then fetches the file at the specified path from the repository's main branch. **Text files are returned verbatim. Binary files (`.mp3`, `.png`, `.jpg`, `.mp4`, `.pdf`, etc.) are returned base64-encoded — decode before writing to disk.** Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/get-file","representation":"full","api":{"method":"GET","path":"/api/sandboxes/file","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/stage-file","type":"docs","title":"Stage File","description":"Issue a presigned upload token so the browser can upload a file directly to Vercel Blob, then call `POST /api/sandboxes/files` with the resulting blob URL to commit it to the sandbox repo. Use `upload()` from `@vercel/blob/client` rather than calling this route by hand. Max file size 100MB.","url":"https://recoupable.dev/docs/api-reference/sandboxes/stage-file","representation":"full","api":{"method":"POST","path":"/api/sandboxes/staged-file","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sandboxes/upload-files","type":"docs","title":"Upload Files","description":"Upload one or more files to the authenticated account's sandbox GitHub repository. Accepts an array of file URLs and commits each file to the specified directory path within the repository. Supports submodule resolution — if the target path falls within a git submodule, the file is committed to the submodule's repository. Authentication is handled via the x-api-key header or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/sandboxes/upload-files","representation":"full","api":{"method":"POST","path":"/api/sandboxes/files","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/sessions/create","type":"docs","title":"Create Session","description":"Create session","url":"https://recoupable.dev/docs/api-reference/sessions/create","representation":"full","api":{"method":"POST","path":"/api/sessions","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/get","type":"docs","title":"Get Session","description":"Get session by id","url":"https://recoupable.dev/docs/api-reference/sessions/get","representation":"full","api":{"method":"GET","path":"/api/sessions/{sessionId}","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/patch","type":"docs","title":"Update Session","description":"Rename a session, change lifecycle status, or update line counters.","url":"https://recoupable.dev/docs/api-reference/sessions/patch","representation":"full","api":{"method":"PATCH","path":"/api/sessions/{sessionId}","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/list-chats","type":"docs","title":"List Session Chats","description":"List session chats","url":"https://recoupable.dev/docs/api-reference/sessions/list-chats","representation":"full","api":{"method":"GET","path":"/api/sessions/{sessionId}/chats","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/create-chat","type":"docs","title":"Create Session Chat","description":"Create session chat","url":"https://recoupable.dev/docs/api-reference/sessions/create-chat","representation":"full","api":{"method":"POST","path":"/api/sessions/{sessionId}/chats","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/get-chat","type":"docs","title":"Get Session Chat","description":"Get session chat","url":"https://recoupable.dev/docs/api-reference/sessions/get-chat","representation":"full","api":{"method":"GET","path":"/api/sessions/{sessionId}/chats/{chatId}","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/patch-chat","type":"docs","title":"Update Session Chat","description":"Update session chat","url":"https://recoupable.dev/docs/api-reference/sessions/patch-chat","representation":"full","api":{"method":"PATCH","path":"/api/sessions/{sessionId}/chats/{chatId}","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/delete-chat","type":"docs","title":"Delete Session Chat","description":"Delete session chat","url":"https://recoupable.dev/docs/api-reference/sessions/delete-chat","representation":"full","api":{"method":"DELETE","path":"/api/sessions/{sessionId}/chats/{chatId}","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sessions/mark-chat-read","type":"docs","title":"Mark Chat Read","description":"Marks a session chat as read for the authenticated account.","url":"https://recoupable.dev/docs/api-reference/sessions/mark-chat-read","representation":"full","api":{"method":"POST","path":"/api/sessions/{sessionId}/chats/{chatId}/read","specificationUrl":"https://recoupable.dev/docs/spec/sessions.json"}},{"id":"docs:api-reference/sandbox/create","type":"docs","title":"Create or restore session sandbox","description":"Create or restore session sandbox","url":"https://recoupable.dev/docs/api-reference/sandbox/create","representation":"full","api":{"method":"POST","path":"/api/sandbox","specificationUrl":"https://recoupable.dev/docs/spec/sandbox.json"}},{"id":"docs:api-reference/sandbox/status","type":"docs","title":"Get session sandbox status","description":"Get session sandbox status","url":"https://recoupable.dev/docs/api-reference/sandbox/status","representation":"full","api":{"method":"GET","path":"/api/sandbox/status","specificationUrl":"https://recoupable.dev/docs/spec/sandbox.json"}},{"id":"docs:api-reference/sandbox/reconnect","type":"docs","title":"Reconnect to session sandbox","description":"Reconnect to session sandbox","url":"https://recoupable.dev/docs/api-reference/sandbox/reconnect","representation":"full","api":{"method":"GET","path":"/api/sandbox/reconnect","specificationUrl":"https://recoupable.dev/docs/spec/sandbox.json"}},{"id":"docs:api-reference/accounts/id","type":"docs","title":"Get Account ID","description":"Retrieve the ID of the authenticated account associated with the provided credentials. This is useful when you have an API key or access token but do not yet know the corresponding accountId.","url":"https://recoupable.dev/docs/api-reference/accounts/id","representation":"full","api":{"method":"GET","path":"/api/accounts/id","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/get","type":"docs","title":"Get Account","description":"Retrieve detailed account information by ID. Returns the account with associated profile info, emails, and wallet addresses.","url":"https://recoupable.dev/docs/api-reference/accounts/get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/create","type":"docs","title":"Create Account","description":"Create a new account or retrieve an existing account by email or wallet address. If an account with the provided email or wallet already exists, returns that account. Otherwise creates a new account and initializes credits.","url":"https://recoupable.dev/docs/api-reference/accounts/create","representation":"full","api":{"method":"POST","path":"/api/accounts","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/update","type":"docs","title":"Update Account","description":"Update an existing account's profile information including name, organization, image, instruction, job title, role type, company name, and knowledges. Requires authentication via x-api-key or Authorization Bearer token. The authenticated account may update itself or a permitted account_id override.","url":"https://recoupable.dev/docs/api-reference/accounts/update","representation":"full","api":{"method":"PATCH","path":"/api/accounts","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/add-artist","type":"docs","title":"Add Artist to Account","description":"Add an artist to an account's list of associated artists. If the artist is already associated with the account, returns success without modification.","url":"https://recoupable.dev/docs/api-reference/accounts/add-artist","representation":"full","api":{"method":"POST","path":"/api/accounts/artists","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/subscriptions/sessions-create","type":"docs","title":"Create Subscription Session","description":"Create a checkout session to start a subscription for the authenticated account. Returns a hosted checkout URL that the client should redirect to. `plan` picks the price: `pro` (default) is pre-configured with a 30-day trial period; `starter` is charged at checkout with no trial.","url":"https://recoupable.dev/docs/api-reference/subscriptions/sessions-create","representation":"full","api":{"method":"POST","path":"/api/subscriptions/sessions","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/subscriptions/claim-create","type":"docs","title":"Claim Subscription","description":"Attach a subscription bought through [Create Subscription Session](/api-reference/subscriptions/sessions-create) (anonymous path) to the authenticated account. Needed only when the signed-in email differs from the email typed into Stripe Checkout; when they match, the webhook already linked the subscription and this call is a no-op that returns 200.","url":"https://recoupable.dev/docs/api-reference/subscriptions/claim-create","representation":"full","api":{"method":"POST","path":"/api/subscriptions/claim","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/subscription-get","type":"docs","title":"Get Account Subscription","description":"Retrieve the subscription that confers an account's plan, directly or via an organization: `isPro`, `status`, `plan`, `source`, plus the billing fields `name`, `amountCents`, `currency`, `interval`, `collectionMethod` and `currentPeriodEnd`. Everything but `isPro` and `status` is null when `status` is `none`. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/subscription-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/subscription","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/portal-create","type":"docs","title":"Create Billing Portal Session","description":"Create a Stripe Customer Portal session for an account. Returns a hosted URL where the customer can update the card on file, view invoices, or cancel a Starter or Pro subscription; the client should redirect the user to that URL. `id` may be the authenticated account or an organization the caller belongs to. Enterprise (invoiced) plans are managed with your Recoup contact and the app does not offer this portal for them, but the endpoint works for any account with a Stripe customer.","url":"https://recoupable.dev/docs/api-reference/accounts/portal-create","representation":"full","api":{"method":"POST","path":"/api/accounts/{id}/portal","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/payment-method-get","type":"docs","title":"Get Default Payment Method","description":"Retrieve the default payment method on file for an account. Returns `card: null` when no payment method has been saved yet — the top-up dialog uses this to decide whether to show a pre-charge confirmation (card present) or route to a checkout session to collect one (`card: null`). Cards are returned even when expired; callers should compare `exp_month` / `exp_year` against the current date and warn the customer, since an off-session charge against an expired card will decline.","url":"https://recoupable.dev/docs/api-reference/accounts/payment-method-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/payment-method","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/payment-method-create","type":"docs","title":"Save a Payment Method","description":"Create a $0 card-on-file checkout session for an account. Stripe `setup` mode saves a payment method without charging anything or starting a subscription; the saved card becomes the account's default and is what credit purchases and auto top-up charge. The account's Stripe customer is created (and tagged with the account id) if it does not exist yet. Returns a hosted checkout URL that the client should redirect to. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/payment-method-create","representation":"full","api":{"method":"POST","path":"/api/accounts/{id}/payment-method","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/payment-method-delete","type":"docs","title":"Remove the Payment Method","description":"Detach the default card on file from an account. After this call `GET /api/accounts/{id}/payment-method` returns `card: null`, credit purchases route through checkout again, and auto top-up (if enabled) is turned off because it has nothing to charge. Subscriptions collected by invoice are unaffected. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/payment-method-delete","representation":"full","api":{"method":"DELETE","path":"/api/accounts/{id}/payment-method","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/payments-get","type":"docs","title":"List Account Payments","description":"List the invoices paid or owed by an account, newest first: subscription renewals, credit purchases, and invoiced enterprise plans alike. Non-draft rows carry the hosted invoice URL for the receipt; `url` is null for drafts. Returns an empty list (not 404) when the account has no Stripe customer or no invoices yet. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/payments-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/payments","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/auto-top-up-get","type":"docs","title":"Get Auto Top-up Settings","description":"Read the auto top-up settings for an account. Auto top-up is opt-in: it is off for every account until the account turns it on and chooses both the amount to buy and the balance that triggers it. When it is on, the api charges the default card on file for `amountCents` the first time a credit deduction leaves the balance below `thresholdCents`, then grants the credits and emails a receipt. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/auto-top-up-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/auto-top-up","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/auto-top-up-update","type":"docs","title":"Update Auto Top-up Settings","description":"Set the auto top-up settings for an account. All three fields are required on every call; there is no partial update. Turning it on requires a card on file (`GET /api/accounts/{id}/payment-method` returns a card), an amount between 5.00 and 1,000.00 USD, and a threshold below the amount. Turning it off keeps the last amount and threshold so the account can turn it back on without retyping them. Guardrails that apply once it is on: at most one top-up per account per 10 minutes; a card decline turns `enabled` back to `false`, records `lastError`, and emails the account instead of retrying; removing the card turns it off. `id` may be the authenticated account or an organization the caller belongs to.","url":"https://recoupable.dev/docs/api-reference/accounts/auto-top-up-update","representation":"full","api":{"method":"PUT","path":"/api/accounts/{id}/auto-top-up","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/credits/sessions-create","type":"docs","title":"Create Credits Top-Up Session","description":"Top up credits on the authenticated account.","url":"https://recoupable.dev/docs/api-reference/credits/sessions-create","representation":"full","api":{"method":"POST","path":"/api/credits/sessions","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/credits-get","type":"docs","title":"Get Account Credits","description":"Retrieve the current credit balance for an account. Returns the remaining credits along with the plan-derived monthly total and used count, plus a flag indicating whether the account is on a pro plan (directly or via an organization). Credits refill monthly; the `timestamp` field reflects the last refill or balance update.","url":"https://recoupable.dev/docs/api-reference/accounts/credits-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/credits","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/accounts/usage-get","type":"docs","title":"Get Account Usage","description":"List the charges that consumed an account's credits: one line item per deduction from `usage_events`, newest first, over a period. Each item carries the amount as the raw ledger integer (`credits_deducted`, micro-dollars: 1,000,000 = $1.00) and the same amount formatted as a dollar string (`usd`), and the response carries the total for the whole period, not just the page. Access is the same as [`GET /api/accounts/{id}/credits`](/api-reference/accounts/credits-get): the authenticated account itself, or another account reachable through organization membership.","url":"https://recoupable.dev/docs/api-reference/accounts/usage-get","representation":"full","api":{"method":"GET","path":"/api/accounts/{id}/usage","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/pulses/update","type":"docs","title":"Update Pulse","description":"Update the pulse settings for an account. Use this to enable or disable the pulse. Returns an array of pulses for consistency with the GET endpoint.","url":"https://recoupable.dev/docs/api-reference/pulses/update","representation":"full","api":{"method":"PATCH","path":"/api/pulses","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/pulses/list","type":"docs","title":"List Pulses","description":"Retrieve pulse information for the authenticated account. If the account has access to organizations, pass account_id to filter to a specific account within those organizations.","url":"https://recoupable.dev/docs/api-reference/pulses/list","representation":"full","api":{"method":"GET","path":"/api/pulses","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/list","type":"docs","title":"Get Organizations","description":"Retrieve all organizations that the authenticated account belongs to. Pass account_id to retrieve organizations for a specific account the API key has access to.","url":"https://recoupable.dev/docs/api-reference/organizations/list","representation":"full","api":{"method":"GET","path":"/api/organizations","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/create","type":"docs","title":"Create Organization","description":"Create a new organization. The creator is automatically added as a member of the organization.","url":"https://recoupable.dev/docs/api-reference/organizations/create","representation":"full","api":{"method":"POST","path":"/api/organizations","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/add-artist","type":"docs","title":"Add Artist to Organization","description":"Add an artist to an organization. This allows organization members to access and manage the artist. This endpoint is idempotent - calling it multiple times with the same artistId and organizationId will not create duplicate records.","url":"https://recoupable.dev/docs/api-reference/organizations/add-artist","representation":"full","api":{"method":"POST","path":"/api/organizations/artists","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/add-member","type":"docs","title":"Add Member to Organization","description":"Add a member to an organization. This endpoint is idempotent - Adding an existing member returns the existing membership.","url":"https://recoupable.dev/docs/api-reference/organizations/add-member","representation":"full","api":{"method":"POST","path":"/api/organizations/members","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/remove-member","type":"docs","title":"Remove Member from Organization","description":"Remove a member from an organization. This endpoint is idempotent - Removing an account that is not a member succeeds without error.","url":"https://recoupable.dev/docs/api-reference/organizations/remove-member","representation":"full","api":{"method":"DELETE","path":"/api/organizations/members","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/list-domains","type":"docs","title":"List Organization Domains","description":"List the email domains mapped to an organization. Accounts that sign up with an email at a mapped domain automatically join the organization.","url":"https://recoupable.dev/docs/api-reference/organizations/list-domains","representation":"full","api":{"method":"GET","path":"/api/organizations/domains","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/add-domain","type":"docs","title":"Add Organization Domain","description":"Map an email domain to an organization for automatic membership. After mapping, any account that signs up (or signs in) with an email at this domain is automatically added to the organization. A domain can belong to at most one organization.  This endpoint is idempotent - re-adding the same domain to the same organization returns the existing mapping.","url":"https://recoupable.dev/docs/api-reference/organizations/add-domain","representation":"full","api":{"method":"POST","path":"/api/organizations/domains","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/organizations/remove-domain","type":"docs","title":"Remove Organization Domain","description":"Remove an email domain mapping from an organization. New signups at this domain will no longer auto-join the organization; existing members are not affected. This endpoint is idempotent.","url":"https://recoupable.dev/docs/api-reference/organizations/remove-domain","representation":"full","api":{"method":"DELETE","path":"/api/organizations/domains","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/check","type":"docs","title":"Check Admin Status","description":"Check if the authenticated account is a Recoup admin. An account is considered an admin if it is a member of the Recoup organization. No input parameters required — authentication is performed via the x-api-key or Authorization header.","url":"https://recoupable.dev/docs/api-reference/admins/check","representation":"full","api":{"method":"GET","path":"/api/admins","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/sandboxes","type":"docs","title":"List Account Sandboxes (Admin)","description":"Returns a list of all accounts and their sandbox usage statistics. Each item includes the account email, total number of sandboxes created, and the timestamp of the most recently created sandbox. Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/sandboxes","representation":"full","api":{"method":"GET","path":"/api/admins/sandboxes","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/sandboxes-orgs","type":"docs","title":"List Org Repo Stats (Admin)","description":"Returns commit statistics for each repository in the recoupable GitHub organization. Each item includes the repo name, URL, total commit count, latest 5 commit messages, earliest and latest commit timestamps, and the list of account repo URLs that include this org repo as a submodule. Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/sandboxes-orgs","representation":"full","api":{"method":"GET","path":"/api/admins/sandboxes/orgs","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/emails","type":"docs","title":"List Account Emails (Admin)","description":"Returns Resend emails including HTML content. Provide either account_id (returns all emails for an account) or email_id (returns a single email by Resend ID). Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token. Email response shape matches the [Resend Retrieve Email API](https://resend.com/docs/api-reference/emails/retrieve-email).","url":"https://recoupable.dev/docs/api-reference/admins/emails","representation":"full","api":{"method":"GET","path":"/api/admins/emails","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/privy","type":"docs","title":"List Privy Logins (Admin)","description":"Returns Privy login statistics for a given time period. Results include counts for new accounts (created_at), active accounts (latest_verified_at), total Privy accounts across all time, and the full, unmodified Privy account objects. See [Privy User object documentation](https://docs.privy.io/api-reference/users/get-all) for the complete type definition. Defaults to period=all (no date filter). Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/privy","representation":"full","api":{"method":"GET","path":"/api/admins/privy","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/coding-agent-slack-tags","type":"docs","title":"List Coding Agent Slack Tags (Admin)","description":"Returns a list of Slack mentions of the Recoup Coding Agent bot, pulled directly from the Slack API as the source of truth. Each entry includes the tagger's information, the prompt they sent, the timestamp, the channel, and any GitHub pull request URLs opened in response. Also returns aggregate pull request statistics. Supports optional time-period filtering. Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/coding-agent-slack-tags","representation":"full","api":{"method":"GET","path":"/api/admins/coding/slack","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/coding-pr","type":"docs","title":"Get Coding Agent PR Merged Status (Admin)","description":"Returns the status (open, closed, or merged) for each provided GitHub pull request URL. Accepts one or more `pull_requests` query parameters containing GitHub PR URLs. Uses the GitHub REST API to check each pull request's state. Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/coding-pr","representation":"full","api":{"method":"GET","path":"/api/admins/coding/pr","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/content-slack-tags","type":"docs","title":"List Content Agent Slack Tags (Admin)","description":"Returns a list of Slack mentions of the Recoup Content Agent bot, pulled directly from the Slack API as the source of truth. Each entry includes the tagger's information, the prompt they sent, the timestamp, the channel, and any video link responses. Also returns aggregate video statistics for measuring tag-to-video conversion. Supports optional time-period filtering. Requires the authenticated account to be a Recoup admin. Authentication via x-api-key or Authorization Bearer token.","url":"https://recoupable.dev/docs/api-reference/admins/content-slack-tags","representation":"full","api":{"method":"GET","path":"/api/admins/content/slack","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/agent-signups","type":"docs","title":"List Agent Sign-Ups (Admin)","description":"Returns API key sign-up records created by AI agents. Agent sign-ups are identified by the agent+ email prefix in the associated account email. Supports period filtering and returns individual API key records with their associated email and creation timestamp, suitable for building sign-up trend charts. Requires admin authentication.","url":"https://recoupable.dev/docs/api-reference/admins/agent-signups","representation":"full","api":{"method":"GET","path":"/api/admins/agent/signups","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/artists-pro","type":"docs","title":"List Pro Artists (Admin)","description":"Retrieve the deduplicated list of artist IDs owned by pro accounts. An account is \"pro\" when its email belongs to an enterprise domain or it has an active Stripe subscription. Admin-scoped: requires an admin-flagged API key because the response identifies paying customer accounts.","url":"https://recoupable.dev/docs/api-reference/admins/artists-pro","representation":"full","api":{"method":"GET","path":"/api/admins/artists/pro","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/credits-rollup","type":"docs","title":"Credit Usage Rollup (Admin)","description":"Returns the per-account rollup of credit usage over the selected period, sorted by total credits deducted descending. Each row carries the account identity (UUID + display name + primary email) and the aggregated spend so the admin dashboard can render a top-spenders table without joining client-side. Pair with [`GET /api/admins/credits/events?account_id=…&period=…`](/api-reference/admins/credits-events) to drill into the individual `usage_events` rows for a single account. Requires the authenticated account to be a Recoup admin.","url":"https://recoupable.dev/docs/api-reference/admins/credits-rollup","representation":"full","api":{"method":"GET","path":"/api/admins/credits/rollup","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/credits-events","type":"docs","title":"Credit Usage Events (Admin)","description":"Returns the raw `usage_events` rows for a single account over the selected period, sorted by `created_at` descending. Powers the drilldown view that expands when a row in the [`/api/admins/credits/rollup`](/api-reference/admins/credits-rollup) table is opened. Each event represents one debit (main agent turn, subagent step, chat completion, or research call), with token counts and `credits_deducted` matching the wallet drop on `credits_usage` for that account.","url":"https://recoupable.dev/docs/api-reference/admins/credits-events","representation":"full","api":{"method":"GET","path":"/api/admins/credits/events","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/admins/credits-grant","type":"docs","title":"Grant Credits (Admin)","description":"Sets an account's credit balance, and records who set it and why. Requires the authenticated account to be a Recoup admin.","url":"https://recoupable.dev/docs/api-reference/admins/credits-grant","representation":"full","api":{"method":"POST","path":"/api/admins/credits","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/emails/create","type":"docs","title":"Send Email","description":"Send an email to one or more recipients. Emails are sent from `Agent by Recoup <agent@recoupable.dev>`.","url":"https://recoupable.dev/docs/api-reference/emails/create","representation":"full","api":{"method":"POST","path":"/api/emails","specificationUrl":"https://recoupable.dev/docs/spec/accounts.json"}},{"id":"docs:api-reference/projects/get","type":"docs","title":"Get Project","description":"Get project","url":"https://recoupable.dev/docs/api-reference/projects/get","representation":"full","api":{"method":"GET","path":"/api/projects/{projectId}","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/task-get","type":"docs","title":"Get Project Task","description":"Get project task","url":"https://recoupable.dev/docs/api-reference/projects/task-get","representation":"full","api":{"method":"GET","path":"/api/projects/{projectId}/tasks/{taskId}","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/task-create","type":"docs","title":"Create Project Task","description":"Create project task","url":"https://recoupable.dev/docs/api-reference/projects/task-create","representation":"full","api":{"method":"POST","path":"/api/projects/{projectId}/tasks","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/task-update","type":"docs","title":"Update Project Task","description":"Update project task","url":"https://recoupable.dev/docs/api-reference/projects/task-update","representation":"full","api":{"method":"PATCH","path":"/api/projects/{projectId}/tasks/{taskId}","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/task-delete","type":"docs","title":"Delete Project Task","description":"Delete project task","url":"https://recoupable.dev/docs/api-reference/projects/task-delete","representation":"full","api":{"method":"DELETE","path":"/api/projects/{projectId}/tasks/{taskId}","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/comments-get","type":"docs","title":"List Task Comments","description":"List task comments","url":"https://recoupable.dev/docs/api-reference/projects/comments-get","representation":"full","api":{"method":"GET","path":"/api/projects/{projectId}/tasks/{taskId}/comments","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:api-reference/projects/comments-create","type":"docs","title":"Add Task Comment","description":"Add task comment","url":"https://recoupable.dev/docs/api-reference/projects/comments-create","representation":"full","api":{"method":"POST","path":"/api/projects/{projectId}/tasks/{taskId}/comments","specificationUrl":"https://recoupable.dev/docs/spec/projects.json"}},{"id":"docs:connectors/ownership","type":"docs","title":"Connection Ownership","description":"The connector connection-ownership and authority contract: who owns a connection, who can act through it, and why roster membership never grants execute rights.","url":"https://recoupable.dev/docs/connectors/ownership","representation":"full"},{"id":"docs:api-reference/connectors/list","type":"docs","title":"List Connectors","description":"List available connectors and their connection status. Returns all supported third-party integrations (e.g., Google Sheets, TikTok, YouTube, X (Twitter), LinkedIn) along with whether they are currently connected.","url":"https://recoupable.dev/docs/api-reference/connectors/list","representation":"full","api":{"method":"GET","path":"/api/connectors","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/connectors/authorize","type":"docs","title":"Authorize Connector","description":"Generate an OAuth authorization URL for connecting a third-party service. Redirect to the returned URL to complete the OAuth flow.","url":"https://recoupable.dev/docs/api-reference/connectors/authorize","representation":"full","api":{"method":"POST","path":"/api/connectors","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/connectors/disconnect","type":"docs","title":"Disconnect Connector","description":"Disconnect a connected account from a third-party service. This revokes the OAuth connection and removes stored credentials.","url":"https://recoupable.dev/docs/api-reference/connectors/disconnect","representation":"full","api":{"method":"DELETE","path":"/api/connectors","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/connectors/list-actions","type":"docs","title":"List Connector Actions","description":"List the executable actions available across the authenticated account's connectors. Each action is a single tool that can be invoked via POST /api/connectors/actions — for example, the `googlesheets` connector exposes actions like `GOOGLESHEETS_WRITE_SPREADSHEET`. Actions whose parent connector is not yet connected are returned with `isConnected: false` and cannot be executed until the connector is authorized via POST /api/connectors.","url":"https://recoupable.dev/docs/api-reference/connectors/list-actions","representation":"full","api":{"method":"GET","path":"/api/connectors/actions","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/connectors/upload-file","type":"docs","title":"Upload Connector File","description":"Stage an image into Connector file storage so it can be attached to a connector action that accepts a file_uploadable field. The returned descriptor is embedded in a file_uploadable array on [Execute Connector Action](/api-reference/connectors/execute-action).","url":"https://recoupable.dev/docs/api-reference/connectors/upload-file","representation":"full","api":{"method":"POST","path":"/api/connectors/files","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/connectors/execute-action","type":"docs","title":"Execute Connector Action","description":"Execute a connector action with the given parameters. The `actionSlug` must come from a prior call to GET /api/connectors/actions, and `parameters` must match the `parameters` JSON Schema returned for that action. The action's parent connector must be currently connected (`isConnected: true` in the catalog) — otherwise this endpoint returns 409. The `result` field passes through whatever the underlying connector returns; its shape is action-specific. To attach an image to a `file_uploadable` parameter (e.g. `images`), first stage it with [Upload Connector File](/api-reference/connectors/upload-file) and pass the returned descriptor.","url":"https://recoupable.dev/docs/api-reference/connectors/execute-action","representation":"full","api":{"method":"POST","path":"/api/connectors/actions","specificationUrl":"https://recoupable.dev/docs/spec/social.json"}},{"id":"docs:api-reference/complete/content/post-music-compose","type":"docs","title":"Compose music","description":"Generate a song from a text prompt or a composition plan. The prompt can describe mood, genre, instruments, lyrics, and structure. Alternatively, pass a full composition_plan for fine-grained control over sections, styles, and lyrics. Returns binary audio in the requested format (default MP3).","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-compose","representation":"full","api":{"method":"POST","path":"/api/music/compose","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/complete/content/post-music-compose-detailed","type":"docs","title":"POST /api/music/compose/detailed","description":"Generate a song with metadata and optional word-level timestamps. Returns a multipart/mixed response: the first part is JSON metadata (song ID, duration, seed, etc.) and the second part is binary audio. Use with_timestamps to get precise timing for each word in the lyrics.","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-compose-detailed","representation":"full","api":{"method":"POST","path":"/api/music/compose/detailed","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/complete/content/post-music-stream","type":"docs","title":"Stream music","description":"Generate a song and stream audio chunks in real time. Use this endpoint when you want to begin playback before the full song is generated. The response streams binary audio chunks as they are produced.","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-stream","representation":"full","api":{"method":"POST","path":"/api/music/stream","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/complete/content/post-music-plan","type":"docs","title":"Create a composition plan","description":"Create a composition plan from a text prompt. A composition plan is a structured representation of a song — sections, styles, lyrics, and durations — that you can review and tweak before passing to the compose endpoint. This endpoint is free and does not consume credits.","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-plan","representation":"full","api":{"method":"POST","path":"/api/music/plan","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/complete/content/post-music-video-to-music","type":"docs","title":"Create music from video","description":"Generate background music from video files. Upload 1–10 video files via multipart/form-data (max 200 MB total). The AI analyzes the video content and generates music that matches the mood, pacing, and style. Optionally provide a text description and style tags to guide the output.","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-video-to-music","representation":"full","api":{"method":"POST","path":"/api/music/video-to-music","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"docs:api-reference/complete/content/post-music-stem-separation","type":"docs","title":"Separate audio stems","description":"Separate an audio file into individual stems (vocals, drums, bass, etc.). Upload an audio file via multipart/form-data. Choose between two-stem separation (vocals + instrumental) or six-stem separation (vocals, drums, bass, guitar, piano, other). Returns a ZIP archive containing the separated stems.","url":"https://recoupable.dev/docs/api-reference/complete/content/post-music-stem-separation","representation":"full","api":{"method":"POST","path":"/api/music/stem-separation","specificationUrl":"https://recoupable.dev/docs/spec/content.json"}},{"id":"blog:music-executive-guide-ai-agents","type":"blog","title":"The Music Executive's Guide to AI Agents: What to Buy, What to Build, What to Ignore","description":"A decision framework for music executives evaluating AI: what to buy, what to build, and how to test a useful first workflow.","url":"https://recoupable.dev/blog/music-executive-guide-ai-agents","representation":"full","publishedAt":"2026-05-18","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:why-artists-need-ai-agents","type":"blog","title":"Why Artists Need AI Agents, Not AI Tools","description":"How a connected AI workflow can help musicians organize drafts, context, and review—and how to tell whether it is actually saving effort.","url":"https://recoupable.dev/blog/why-artists-need-ai-agents","representation":"full","publishedAt":"2026-05-09","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-content-creation-musicians","type":"blog","title":"How to Create a Month of Content in One Day","description":"A practical batching exercise for turning artist material into a month of planned drafts, with clear steps for review and scheduling.","url":"https://recoupable.dev/blog/ai-content-creation-musicians","representation":"full","publishedAt":"2026-05-09","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:music-release-strategy-2026","type":"blog","title":"The Complete Music Release Strategy for 2026","description":"A phase-by-phase music release strategy covering pre-release, launch week, and long-tail promotion with platform-specific tactics for 2026.","url":"https://recoupable.dev/blog/music-release-strategy-2026","representation":"full","publishedAt":"2026-05-09","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-ar-artist-discovery","type":"blog","title":"AI A&R: How Labels Are Using AI to Find the Next Hit Artist","description":"How to use AI for sourced artist briefs, catalog comparisons, and an A&R research pipeline your team can evaluate.","url":"https://recoupable.dev/blog/ai-ar-artist-discovery","representation":"full","publishedAt":"2026-05-18","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-catalog-marketing-passive-revenue","type":"blog","title":"Your Catalog Is Dying. AI Agents Can Revive It.","description":"How to identify catalog work worth testing, prepare a reviewed campaign, and measure effort separately from revenue outcomes.","url":"https://recoupable.dev/blog/ai-catalog-marketing-passive-revenue","representation":"full","publishedAt":"2026-05-17","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-for-record-labels","type":"blog","title":"AI for Record Labels: How Smart Labels Are Cutting Costs and Scaling Output","description":"Where AI can help a label’s marketing team: recurring preparation, content drafts, catalog research, and reporting—with a practical way to evaluate the cost and quality.","url":"https://recoupable.dev/blog/ai-for-record-labels","representation":"full","publishedAt":"2026-05-12","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-music-distribution-automation","type":"blog","title":"AI for Music Distributors: Automate the Ops That Are Killing Your Margins","description":"How to evaluate AI for metadata checks, marketing preparation, reporting, and catalog monitoring without losing review and service quality.","url":"https://recoupable.dev/blog/ai-music-distribution-automation","representation":"full","publishedAt":"2026-05-18","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-music-manager-tools","type":"blog","title":"The Best AI Tools for Music Managers in 2026","description":"A workflow-based guide to choosing AI tools for artist management: context, data access, approvals, total cost, and useful output.","url":"https://recoupable.dev/blog/ai-music-manager-tools","representation":"full","publishedAt":"2026-05-12","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-music-marketing-roi","type":"blog","title":"The ROI of AI Music Marketing: What the Numbers Say","description":"How to compare software, setup, review time, and actual cash savings when evaluating AI for music marketing.","url":"https://recoupable.dev/blog/ai-music-marketing-roi","representation":"full","publishedAt":"2026-05-09","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-music-marketing","type":"blog","title":"How AI is Changing Music Marketing","description":"A practical workflow for connecting artist context, content drafts, review, and publishing preparation with AI.","url":"https://recoupable.dev/blog/ai-music-marketing","representation":"full","publishedAt":"2026-03-16","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-replacing-music-marketing-teams","type":"blog","title":"Why Labels Are Replacing Marketing Teams with AI Agents","description":"Which marketing tasks can AI assist with, and what should a label measure before changing staffing or spend?","url":"https://recoupable.dev/blog/ai-replacing-music-marketing-teams","representation":"full","publishedAt":"2026-05-17","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:how-labels-use-ai","type":"blog","title":"How Labels Use AI in 2026: From Catalog Reactivation to Autonomous Marketing","description":"Five AI workflows a label can evaluate, from catalog research and content localization to artist marketing preparation and performance review.","url":"https://recoupable.dev/blog/how-labels-use-ai","representation":"full","publishedAt":"2026-05-12","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:how-much-does-ai-music-marketing-cost","type":"blog","title":"How Much Does AI Music Marketing Actually Cost? A Real Breakdown","description":"The costs to include when budgeting for AI music marketing, from subscriptions and implementation to review and ongoing support.","url":"https://recoupable.dev/blog/how-much-does-ai-music-marketing-cost","representation":"full","publishedAt":"2026-05-17","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:independent-artist-marketing-guide","type":"blog","title":"The Independent Artist's Marketing Guide: No Label, No Budget, No Problem","description":"A small-budget music marketing plan with content ideas, a suggested weekly schedule, relevant outreach, and practical ways to test AI.","url":"https://recoupable.dev/blog/independent-artist-marketing-guide","representation":"full","publishedAt":"2026-05-09","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-for-music-managers","type":"blog","title":"AI for Music Managers: Automate the Busywork, Keep the Relationships","description":"How managers can evaluate AI for reporting, content drafts, and outreach preparation while keeping ownership of artist relationships.","url":"https://recoupable.dev/blog/ai-for-music-managers","representation":"full","publishedAt":"2026-05-19","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-music-marketing-guide-2026","type":"blog","title":"AI Music Marketing: The Complete Guide for 2026","description":"Workflows to test for music marketing, the data and review controls they need, and how artists, managers, and labels can evaluate the results.","url":"https://recoupable.dev/blog/ai-music-marketing-guide-2026","representation":"full","publishedAt":"2026-05-20","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:ai-playlist-pitching","type":"blog","title":"AI Playlist Pitching: How to Get More Placements Without More Hours","description":"How to use AI for playlist research, relevant pitch drafts, and response tracking, with checks for fit, approvals, and measurable results.","url":"https://recoupable.dev/blog/ai-playlist-pitching","representation":"full","publishedAt":"2026-05-16","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:chatgpt-vs-music-ai-agents","type":"blog","title":"ChatGPT vs. Music AI Agents: Why Generic AI Falls Short","description":"How to compare general-purpose assistants and music-focused workflows by data access, context, recurring tasks, and review controls.","url":"https://recoupable.dev/blog/chatgpt-vs-music-ai-agents","representation":"full","publishedAt":"2026-05-17","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:meta-bought-manus-agents-break","type":"blog","title":"Meta Bought Manus Because Agents Still Break","description":"Meta's $2-3B acquisition of Manus signals where AI value is accumulating: not in models, but in orchestration layers that keep agents coherent across real work.","url":"https://recoupable.dev/blog/meta-bought-manus-agents-break","representation":"full","publishedAt":"2026-01-01"},{"id":"blog:music-label-ai-agents","type":"blog","title":"Why Music Labels Are Hiring AI Agents Instead of More Interns","description":"A practical way for labels to evaluate AI for catalog research, A&R preparation, and artist operations without assuming staffing or revenue gains.","url":"https://recoupable.dev/blog/music-label-ai-agents","representation":"full","publishedAt":"2026-05-18","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:recoup-in-2026","type":"blog","title":"Recoup in 2026","description":"In 2026, we’re optimizing Recoup for enterprise label teams: recurring value for every seat, measurable time saved, and clearer outcomes per campaign.","url":"https://recoupable.dev/blog/recoup-in-2026","representation":"full","publishedAt":"2026-01-05","updatedAt":"2026-01-05T18:19:54.879000Z"},{"id":"blog:sandbox-for-record-labels","type":"blog","title":"Sandbox for Record Labels","description":"Use Recoup sandboxes to give your music team's AI agents a file system, documents, and tools for working with artist context.","url":"https://recoupable.dev/blog/sandbox-for-record-labels","representation":"full","publishedAt":"2026-01-26","updatedAt":"2026-01-26T17:07:40.764000Z"},{"id":"blog:open-labels","type":"blog","title":"Open Labels","description":"How Recoup's API and agent tools let you build a programmable record label around your artists, catalog, and music workflows.","url":"https://recoupable.dev/blog/open-labels","representation":"full","publishedAt":"2026-04-22","updatedAt":"2026-09-10T00:00:00.000Z"},{"id":"blog:install-marketplace-claude-desktop","type":"blog","title":"Install the Recoup Skills & Plugins Marketplace on Claude Desktop","description":"Install the Recoup Skills & Plugins Marketplace in Claude Desktop, add Recoup skills, and connect your music workspace.","url":"https://recoupable.dev/blog/install-marketplace-claude-desktop","representation":"full","publishedAt":"2026-05-15","updatedAt":"2026-05-15T06:55:30.349000Z"},{"id":"blog:bring-your-own-agent","type":"blog","title":"Bring your own agent","description":"Connect your own AI agent to Recoup with its API, CLI, and MCP server, and bring music workflows into the tools you already use.","url":"https://recoupable.dev/blog/bring-your-own-agent","representation":"full","publishedAt":"2026-05-19","updatedAt":"2026-05-19T21:22:22.878000Z"},{"id":"playbook:choose-the-work","type":"playbook","title":"Choose the work worth improving","description":"Start with a recurring task, a clear owner, and a useful result.","url":"https://recoupable.dev/playbook/download#choose-the-work","representation":"full"},{"id":"playbook:content","type":"playbook","title":"Build a repeatable content process","description":"Create a batch, review it together, and use what you learn next time.","url":"https://recoupable.dev/playbook/download#content","representation":"full"},{"id":"playbook:audience","type":"playbook","title":"Research the audience","description":"Turn available audience information into a brief your team can act on.","url":"https://recoupable.dev/playbook/download#audience","representation":"full"},{"id":"playbook:release","type":"playbook","title":"Plan the whole release","description":"Organize pre-release, launch, and follow-up work around one calendar.","url":"https://recoupable.dev/playbook/download#release","representation":"full"},{"id":"playbook:roster","type":"playbook","title":"Manage work across a roster","description":"Keep each artist’s context distinct while sharing useful methods.","url":"https://recoupable.dev/playbook/download#roster","representation":"full"},{"id":"playbook:catalog","type":"playbook","title":"Put the catalog to work","description":"Apply the same discipline to older releases, reporting, and label operations.","url":"https://recoupable.dev/playbook/download#catalog","representation":"full"},{"id":"playbook:first-build","type":"playbook","title":"Start with one useful build","description":"Turn an idea into a small project the team can evaluate.","url":"https://recoupable.dev/playbook/download#first-build","representation":"full"}],"tools":[{"name":"search_recoup","description":"Search Recoup’s public website, guides, API documentation, blog, and playbook. Returns matching public content with IDs for read_recoup_page. Use a relevant query and optional content type; follow the returned cursor for more matches.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":240,"description":"Words or a question to search for."},"type":{"type":"string","enum":["all","page","docs","blog","playbook"],"default":"all"},"limit":{"type":"integer","minimum":1,"maximum":10,"default":5},"cursor":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque pagination cursor returned by the previous search."}},"required":["query"],"additionalProperties":false},"annotations":{"readOnlyHint":true}},{"name":"read_recoup_page","description":"Read the public text of a Recoup page by an ID returned by search_recoup. Use the returned continuation offset when the content is longer than one response. Does not browse arbitrary URLs or read private account data.","inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":300,"description":"Public content ID returned by search_recoup."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Character offset supplied by the previous response; start at zero."},"maxLength":{"type":"integer","minimum":1,"maximum":12000,"default":6000,"description":"Maximum characters to return."}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true}},{"name":"estimate_workflow_roi","description":"Calculate the potential value of time saved on one workflow using five explicit assumptions. Returns hours saved, capacity value, recurring net value, first-year net value, and payback. All costs are USD. Capacity value is not guaranteed cash savings; this does not generate a quote or submit a lead.","inputSchema":{"type":"object","properties":{"monthlyHours":{"type":"number","minimum":0,"maximum":100000,"description":"Current total team hours spent on this workflow per month, in hours/month."},"hourlyCost":{"type":"number","minimum":0,"maximum":10000,"description":"Loaded labor cost in USD per person-hour."},"timeReduction":{"type":"number","minimum":0,"maximum":100,"description":"Assumed share of current work time saved, in percent from 0 to 100. Supply your own assumption; this is not a Recoup performance promise."},"monthlySystemCost":{"type":"number","minimum":0,"maximum":1000000,"description":"Estimated recurring system and operating cost, in USD/month."},"setupCost":{"type":"number","minimum":0,"maximum":10000000,"description":"Estimated one-time implementation cost, in USD."}},"required":["monthlyHours","hourlyCost","timeReduction","monthlySystemCost","setupCost"],"additionalProperties":false},"annotations":{"readOnlyHint":true}},{"name":"assess_workflow_readiness","description":"Recommend a practical next step for one music-business workflow using all seven answers from Recoup’s readiness check. Ask the user for any missing answer; do not infer it. Returns a recommendation and next steps, not a numerical score, certification, or promise of readiness.","inputSchema":{"type":"object","properties":{"answers":{"type":"object","properties":{"workflow":{"type":"string","enum":["Reporting and finance","Research and acquisition review","Content and release planning","Still deciding"],"description":"Which recurring work would you like to improve?"},"frequency":{"type":"string","enum":["Every day","Every week","Every month","Occasionally"],"description":"How often does your team do this work?"},"information":{"type":"string","enum":["Mostly in one system","Across several tools and files","We need to identify it"],"description":"Where is the information the task needs?"},"access":{"type":"string","enum":["Yes, with the permissions we need","Some of it; we need to arrange access","We are not sure yet"],"description":"Can your team access that information?"},"method":{"type":"string","enum":["Yes, the steps are documented","With help from the person doing it","Not yet; it changes each time"],"description":"Could someone else follow your current process?"},"owner":{"type":"string","enum":["We have someone in mind","We need to agree on an owner","We need help training the team"],"description":"Who would review and own the new workflow?"},"ai":{"type":"string","enum":["We have a repeatable workflow","A few people use individual tools","We are getting started"],"description":"How is the team using AI today?"}},"required":["workflow","frequency","information","access","method","owner","ai"],"additionalProperties":false}},"required":["answers"],"additionalProperties":false},"annotations":{"readOnlyHint":true}},{"name":"prepare_project_brief","description":"Prepare a short project inquiry draft from a workflow, desired outcome, and optional tools and frequency. Returns text the user can review on /contact. Does not save information, submit an inquiry, contact Recoup, book a call, or promise scope or pricing.","inputSchema":{"type":"object","properties":{"workflow":{"type":"string","minLength":20,"maxLength":500,"description":"Describe the current workflow and where work gets difficult. Do not include passwords or confidential records."},"desiredOutcome":{"type":"string","minLength":10,"maxLength":500,"description":"What the team would like to improve or produce."},"tools":{"type":"string","minLength":1,"maxLength":500,"description":"Optional tools or data sources involved."},"frequency":{"type":"string","minLength":1,"maxLength":120,"description":"Optional description of how often the work happens."},"interest":{"type":"string","enum":["AI strategy","Custom systems","Team training","Not sure yet"],"default":"Not sure yet"}},"required":["workflow","desiredOutcome"],"additionalProperties":false},"annotations":{"readOnlyHint":true}}],"interfaces":{"http":{"endpoint":"https://recoupable.dev/agent-api/v1/tools","method":"POST","authentication":"none","effects":"Public reading, calculation, and draft generation. Does not submit inquiries or modify a platform account."},"webmcp":{"registration":"document.modelContext","scope":"top-level browser document","availability":"Compatible browsers only; proposed standard.","draftEffect":"prepare_project_brief opens a local review panel. Nothing is submitted."}},"platform":{"rest":{"baseUrl":"https://api.recoupable.dev/api","documentation":"https://recoupable.dev/docs/authentication","apiKeyHeader":"x-api-key"},"mcp":{"url":"https://api.recoupable.dev/mcp","documentation":"https://recoupable.dev/docs/mcp","authentication":"Authorization: Bearer <Recoup API key>"}},"contact":"https://recoupable.dev/contact"}