diff --git a/api-reference/openapi.json b/api-reference/openapi.json
index f7999eb..2393a65 100644
--- a/api-reference/openapi.json
+++ b/api-reference/openapi.json
@@ -2821,7 +2821,7 @@
},
"/api/sandboxes/files": {
"post": {
- "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.",
+ "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 \u2014 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.",
"requestBody": {
"description": "JSON body containing file URLs and target path",
"required": true,
@@ -4043,7 +4043,7 @@
},
"/api/content/create": {
"post": {
- "description": "Trigger the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` — an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).",
+ "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` \u2014 an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).",
"security": [
{
"apiKeyAuth": []
@@ -4065,7 +4065,7 @@
},
"responses": {
"202": {
- "description": "Pipeline triggered successfully. Returns `runIds` — an array of run IDs. Poll each via [GET /api/tasks/runs](/api-reference/tasks/runs) to check progress.",
+ "description": "Pipeline triggered successfully. Returns `runIds` \u2014 an array of run IDs. Poll each via [GET /api/tasks/runs](/api-reference/tasks/runs) to check progress.",
"content": {
"application/json": {
"schema": {
@@ -4075,7 +4075,7 @@
}
},
"400": {
- "description": "Validation failed — missing artist identifier, artist is missing required files, or template not found",
+ "description": "Validation failed \u2014 missing artist identifier, artist is missing required files, or template not found",
"content": {
"application/json": {
"schema": {
@@ -4085,7 +4085,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -4095,7 +4095,7 @@
}
},
"404": {
- "description": "Artist not found — the provided artist_account_id does not match any artist",
+ "description": "Artist not found \u2014 the provided artist_account_id does not match any artist",
"content": {
"application/json": {
"schema": {
@@ -4130,7 +4130,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -4178,7 +4178,7 @@
}
},
"400": {
- "description": "Bad request — artist_account_id is required",
+ "description": "Bad request \u2014 artist_account_id is required",
"content": {
"application/json": {
"schema": {
@@ -4188,7 +4188,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -4198,7 +4198,7 @@
}
},
"404": {
- "description": "Artist not found — the provided artist_account_id does not match any artist",
+ "description": "Artist not found \u2014 the provided artist_account_id does not match any artist",
"content": {
"application/json": {
"schema": {
@@ -4212,7 +4212,7 @@
},
"/api/content/estimate": {
"get": {
- "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.",
+ "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 \u2014 it does not trigger any pipeline execution or spend credits.",
"security": [
{
"apiKeyAuth": []
@@ -4268,7 +4268,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -4343,7 +4343,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key / Bearer token",
+ "description": "Unauthorized \u2014 invalid or missing API key / Bearer token",
"content": {
"application/json": {
"schema": {
@@ -4357,7 +4357,7 @@
},
"/api/songs/analyze": {
"post": {
- "description": "Analyze music using a state-of-the-art Audio Language Model that listens directly to the audio waveform. Unlike text-based AI, this model processes the actual sound — identifying harmony, structure, timbre, lyrics, and cultural context through deep music understanding. Supports audio up to 20 minutes (MP3, WAV, FLAC). Two modes: (1) **Presets** — pass a `preset` name like `catalog_metadata`, `mood_tags`, or `full_report` for structured, optimized output. (2) **Custom prompt** — pass a `prompt` for free-form questions. The `full_report` preset runs all 13 presets in parallel and returns a comprehensive music intelligence report. Use `GET /api/songs/analyze/presets` to list available presets.",
+ "description": "Analyze music using a state-of-the-art Audio Language Model that listens directly to the audio waveform. Unlike text-based AI, this model processes the actual sound \u2014 identifying harmony, structure, timbre, lyrics, and cultural context through deep music understanding. Supports audio up to 20 minutes (MP3, WAV, FLAC). Two modes: (1) **Presets** \u2014 pass a `preset` name like `catalog_metadata`, `mood_tags`, or `full_report` for structured, optimized output. (2) **Custom prompt** \u2014 pass a `prompt` for free-form questions. The `full_report` preset runs all 13 presets in parallel and returns a comprehensive music intelligence report. Use `GET /api/songs/analyze/presets` to list available presets.",
"security": [
{
"apiKeyAuth": []
@@ -4389,7 +4389,7 @@
}
},
"400": {
- "description": "Bad request — missing or invalid fields",
+ "description": "Bad request \u2014 missing or invalid fields",
"content": {
"application/json": {
"schema": {
@@ -4399,7 +4399,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key / Bearer token",
+ "description": "Unauthorized \u2014 invalid or missing API key / Bearer token",
"content": {
"application/json": {
"schema": {
@@ -4409,7 +4409,7 @@
}
},
"500": {
- "description": "Server error — upstream model unavailable or inference failed",
+ "description": "Server error \u2014 upstream model unavailable or inference failed",
"content": {
"application/json": {
"schema": {
@@ -4481,7 +4481,7 @@
},
"/api/admins": {
"get": {
- "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.",
+ "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 \u2014 authentication is performed via the x-api-key or Authorization header.",
"parameters": [],
"security": [
{
@@ -5318,7 +5318,7 @@
"application/json": {
"schema": {
"type": "object",
- "description": "Slack Events API envelope — the shape depends on the event type"
+ "description": "Slack Events API envelope \u2014 the shape depends on the event type"
}
}
}
@@ -5342,12 +5342,13 @@
"404": {
"description": "Unknown platform"
}
- }
+ },
+ "security": []
}
},
"/api/content-agent/callback": {
"post": {
- "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.\n\nThis endpoint is not intended for external use — it is called automatically by the polling task when content runs complete, fail, or time out.",
+ "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.\n\nThis endpoint is not intended for external use \u2014 it is called automatically by the polling task when content runs complete, fail, or time out.",
"requestBody": {
"description": "Content generation results from the polling task",
"required": true,
@@ -5484,7 +5485,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5494,7 +5495,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5518,7 +5519,7 @@
},
"/api/content/analyze": {
"post": {
- "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.",
+ "description": "Analyze a video and answer questions about it. Pass a video URL and a text prompt \u2014 for example, \"Describe what happens\" or \"Rate the visual quality 1-10.\" Returns the generated text.",
"security": [
{
"apiKeyAuth": []
@@ -5550,7 +5551,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5560,7 +5561,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5616,7 +5617,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5626,7 +5627,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5682,7 +5683,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5692,7 +5693,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5716,7 +5717,7 @@
},
"/api/content/video": {
"post": {
- "description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` — create a video from a text description\n- `animate` — animate a still image\n- `reference` — use an image as a style/subject reference (not the first frame)\n- `extend` — continue an existing video\n- `first-last` — generate a video that transitions between two images\n- `lipsync` — sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",
+ "description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` \u2014 create a video from a text description\n- `animate` \u2014 animate a still image\n- `reference` \u2014 use an image as a style/subject reference (not the first frame)\n- `extend` \u2014 continue an existing video\n- `first-last` \u2014 generate a video that transitions between two images\n- `lipsync` \u2014 sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",
"security": [
{
"apiKeyAuth": []
@@ -5748,7 +5749,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5758,7 +5759,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5780,7 +5781,7 @@
}
},
"patch": {
- "description": "Apply edits to a video or audio file — trim, crop, resize, overlay text, or add an audio track. Pass a `template` for a preset edit pipeline, or build your own with an `operations` array. Everything runs in one pass.",
+ "description": "Apply edits to a video or audio file \u2014 trim, crop, resize, overlay text, or add an audio track. Pass a `template` for a preset edit pipeline, or build your own with an `operations` array. Everything runs in one pass.",
"security": [
{
"apiKeyAuth": []
@@ -5812,7 +5813,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5822,7 +5823,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5878,7 +5879,7 @@
}
},
"400": {
- "description": "Validation failed — invalid or missing request body fields",
+ "description": "Validation failed \u2014 invalid or missing request body fields",
"content": {
"application/json": {
"schema": {
@@ -5888,7 +5889,7 @@
}
},
"401": {
- "description": "Unauthorized — invalid or missing API key",
+ "description": "Unauthorized \u2014 invalid or missing API key",
"content": {
"application/json": {
"schema": {
@@ -5909,568 +5910,2760 @@
}
}
}
- }
- },
- "components": {
- "schemas": {
- "Error": {
- "required": [
- "error",
- "message"
- ],
- "type": "object",
- "properties": {
- "error": {
- "type": "integer",
- "format": "int32"
- },
- "message": {
- "type": "string"
- }
- }
- },
- "CreateNotificationRequest": {
- "type": "object",
- "required": [
- "subject"
- ],
- "properties": {
- "cc": {
- "type": "array",
- "items": {
- "type": "string",
- "format": "email"
- },
- "description": "Optional CC email addresses",
- "example": [
- "cc@example.com"
- ]
- },
- "subject": {
- "type": "string",
- "description": "Email subject line",
- "example": "Weekly Pulse Report"
- },
- "text": {
- "type": "string",
- "description": "Plain text or Markdown body. Rendered as HTML via Markdown if no `html` is provided.",
- "example": "# Pulse Report\n\nHere's your weekly summary."
- },
- "html": {
- "type": "string",
- "description": "Raw HTML body. Takes precedence over `text` when both are provided.",
- "example": "
Pulse Report
Here's your weekly summary.
"
- },
- "headers": {
- "type": "object",
- "additionalProperties": {
+ },
+ "/api/research": {
+ "get": {
+ "description": "Search for artists by name. Returns matching results with profile summaries.",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": true,
+ "description": "Artist name to search for.",
+ "schema": {
"type": "string"
- },
- "description": "Optional custom email headers"
- },
- "room_id": {
- "type": "string",
- "description": "Room ID to include a chat link in the email footer"
- },
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the account to send the notification for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, sends the notification for the API key's own account."
- }
- }
- },
- "NotificationResponse": {
- "type": "object",
- "properties": {
- "success": {
- "type": "boolean",
- "description": "Whether the notification was sent successfully",
- "example": true
+ }
},
- "message": {
- "type": "string",
- "description": "Human-readable result message",
- "example": "Email sent successfully from Agent by Recoup to user@example.com."
+ {
+ "name": "type",
+ "in": "query",
+ "required": false,
+ "description": "Entity type.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "artists",
+ "tracks",
+ "albums",
+ "playlists",
+ "curators",
+ "stations"
+ ],
+ "default": "artists"
+ }
},
- "id": {
- "type": "string",
- "description": "Resend email ID",
- "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "description": "Maximum number of results.",
+ "schema": {
+ "type": "integer",
+ "default": 10
+ }
}
- }
- },
- "ConnectorInfo": {
- "type": "object",
- "required": [
- "slug",
- "name",
- "isConnected"
],
- "properties": {
- "slug": {
- "type": "string",
- "description": "Unique identifier for the connector (e.g., 'googlesheets', 'tiktok')"
- },
- "name": {
- "type": "string",
- "description": "Human-readable name of the connector"
- },
- "isConnected": {
- "type": "boolean",
- "description": "Whether the connector is currently connected"
- },
- "connectedAccountId": {
- "type": "string",
- "description": "The connected account ID (only present when isConnected is true)"
+ "responses": {
+ "200": {
+ "description": "Search results",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchSearchResponse"
+ }
+ }
+ }
}
}
- },
- "ConnectorsResponse": {
- "type": "object",
- "required": [
- "success",
- "connectors"
+ }
+ },
+ "/api/research/albums": {
+ "get": {
+ "description": "Get an artist's full discography \u2014 albums, EPs, and singles with release dates.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
],
- "properties": {
- "success": {
- "type": "boolean"
- },
- "connectors": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ConnectorInfo"
- },
- "description": "List of available connectors with connection status"
+ "responses": {
+ "200": {
+ "description": "Artist albums",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchAlbumsResponse"
+ }
+ }
+ }
}
}
- },
- "AuthorizeConnectorRequest": {
- "type": "object",
- "required": [
- "connector"
- ],
- "properties": {
- "connector": {
- "type": "string",
- "description": "The connector slug to authorize (e.g., 'googlesheets', 'tiktok')"
- },
- "callback_url": {
- "type": "string",
- "format": "uri",
- "description": "Optional custom callback URL after OAuth completion"
+ }
+ },
+ "/api/research/audience": {
+ "get": {
+ "description": "Get audience demographics for an artist on a specific platform \u2014 age, gender, and country breakdown.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
},
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "Optional account ID to connect a service for a different account (e.g., an artist, workspace, or organization). Use this when connecting an artist's TikTok or other service. The authenticated account must have access. Omit to connect for your own account."
+ {
+ "name": "platform",
+ "in": "query",
+ "required": false,
+ "description": "Platform to get demographics for. Defaults to instagram.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "instagram",
+ "tiktok",
+ "youtube"
+ ],
+ "default": "instagram"
+ }
}
- }
- },
- "AuthorizeConnectorResponse": {
- "type": "object",
- "required": [
- "success",
- "data"
],
- "properties": {
- "success": {
- "type": "boolean"
- },
- "data": {
- "type": "object",
- "required": [
- "connector",
- "redirectUrl"
- ],
- "properties": {
- "connector": {
- "type": "string",
- "description": "The connector slug being authorized"
- },
- "redirectUrl": {
- "type": "string",
- "format": "uri",
- "description": "URL to redirect to for OAuth authorization"
+ "responses": {
+ "200": {
+ "description": "Audience demographics",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchAudienceResponse"
+ }
}
}
}
}
- },
- "DisconnectConnectorRequest": {
- "type": "object",
- "required": [
- "connected_account_id"
- ],
- "properties": {
+ }
+ },
+ "/api/research/career": {
+ "get": {
+ "description": "Get an artist's career timeline \u2014 key milestones, trajectory, and career stage.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Career timeline",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchCareerResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/charts": {
+ "get": {
+ "description": "Get global chart positions for a platform \u2014 Spotify, Apple Music, TikTok, YouTube, iTunes, Shazam, etc. NOT artist-scoped. Returns ranked entries with track and artist info.",
+ "parameters": [
+ {
+ "name": "platform",
+ "in": "query",
+ "required": true,
+ "description": "Chart platform: spotify, applemusic, tiktok, youtube, itunes, shazam, etc.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "country",
+ "in": "query",
+ "required": false,
+ "description": "Two-letter country code (e.g. US, GB, DE).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "interval",
+ "in": "query",
+ "required": false,
+ "description": "Time interval (e.g. daily, weekly).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "required": false,
+ "description": "Chart type (varies by platform).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "latest",
+ "in": "query",
+ "required": false,
+ "description": "Return only the latest chart.",
+ "schema": {
+ "type": "string",
+ "default": "true"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Chart data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchChartsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/cities": {
+ "get": {
+ "description": "Get the top cities where an artist's fans listen, ranked by listener concentration.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Top listener cities",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchCitiesResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/curator": {
+ "get": {
+ "description": "Get curator profile \u2014 who curates a playlist, their other playlists, and follower reach.",
+ "parameters": [
+ {
+ "name": "platform",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "spotify",
+ "applemusic",
+ "deezer",
+ "amazon",
+ "youtube"
+ ]
+ },
+ "description": "Streaming platform."
+ },
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "description": "Curator ID.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Curator profile",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchCuratorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/deep": {
+ "post": {
+ "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.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchDeepRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Deep research report with citations",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchDeepResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/discover": {
+ "get": {
+ "description": "Discover artists by criteria \u2014 filter by country, genre, Spotify monthly listener range, and sort by growth metrics.",
+ "parameters": [
+ {
+ "name": "country",
+ "in": "query",
+ "required": false,
+ "description": "ISO country code (e.g., US, BR, GB).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "genre",
+ "in": "query",
+ "required": false,
+ "description": "Genre ID (use GET /api/research/genres to list).",
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "sp_monthly_listeners_min",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "sp_monthly_listeners_max",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "required": false,
+ "description": "Sort field (e.g., weekly_diff.sp_monthly_listeners).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 20
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Filtered artist list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchDiscoverResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/enrich": {
+ "post": {
+ "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.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchEnrichRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Structured enrichment data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchEnrichResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/extract": {
+ "post": {
+ "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.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchExtractRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Extracted content from URLs",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchExtractResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/festivals": {
+ "get": {
+ "description": "List music festivals.",
+ "responses": {
+ "200": {
+ "description": "Festival list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchFestivalsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/genres": {
+ "get": {
+ "description": "List all available genre IDs and names. Use these IDs with the discover endpoint at GET /api/research/discover.",
+ "responses": {
+ "200": {
+ "description": "Genre list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchGenresResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/insights": {
+ "get": {
+ "description": "Get AI-generated insights about an artist \u2014 automatically surfaced trends, milestones, and observations.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "AI-generated insights",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchInsightsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/instagram-posts": {
+ "get": {
+ "description": "Get an artist's top Instagram posts and reels, sorted by engagement.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Top Instagram posts and reels",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchInstagramPostsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/lookup": {
+ "get": {
+ "description": "Look up an artist by a platform URL or ID \u2014 Spotify URL, Spotify ID, Apple Music URL, etc.",
+ "parameters": [
+ {
+ "name": "url",
+ "in": "query",
+ "required": true,
+ "description": "Platform URL or ID (e.g., Spotify artist URL, Spotify ID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Artist profile matching the platform URL",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchLookupResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/metrics": {
+ "get": {
+ "description": "Get platform-specific metrics for an artist over time \u2014 followers, listeners, views, engagement. Supports 14 platforms.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "source",
+ "in": "query",
+ "required": true,
+ "description": "Platform to get metrics for.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "spotify",
+ "instagram",
+ "tiktok",
+ "twitter",
+ "facebook",
+ "youtube_channel",
+ "youtube_artist",
+ "soundcloud",
+ "deezer",
+ "twitch",
+ "line",
+ "melon",
+ "wikipedia",
+ "bandsintown"
+ ]
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Platform metrics over time",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchMetricsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/milestones": {
+ "get": {
+ "description": "Get an artist's activity feed \u2014 playlist adds, chart entries, and other notable events. Each milestone includes a date, summary, platform, track name, and star rating.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Milestone list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchMilestonesResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/people": {
+ "post": {
+ "description": "Search for people in the music industry \u2014 artists, managers, A&R reps, producers. Returns multi-source profiles including LinkedIn data.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchPeopleRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "People search results",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchPeopleResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/playlist": {
+ "get": {
+ "description": "Get playlist metadata \u2014 name, description, follower count, track count, and curator info.",
+ "parameters": [
+ {
+ "name": "platform",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "spotify",
+ "applemusic",
+ "deezer",
+ "amazon",
+ "youtube"
+ ]
+ },
+ "description": "Streaming platform."
+ },
+ {
+ "name": "id",
+ "in": "query",
+ "required": true,
+ "description": "Playlist ID on the platform.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Playlist metadata",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchPlaylistResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/playlists": {
+ "get": {
+ "description": "Get an artist's playlist placements \u2014 editorial, algorithmic, and indie playlists across platforms.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "platform",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "spotify",
+ "applemusic",
+ "deezer",
+ "amazon",
+ "youtube"
+ ],
+ "default": "spotify"
+ }
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "current",
+ "past"
+ ],
+ "default": "current"
+ }
+ },
+ {
+ "name": "editorial",
+ "in": "query",
+ "required": false,
+ "description": "Only editorial playlists.",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "since",
+ "in": "query",
+ "required": false,
+ "description": "Filter by date (YYYY-MM-DD).",
+ "schema": {
+ "type": "string",
+ "format": "date"
+ }
+ },
+ {
+ "name": "sort",
+ "in": "query",
+ "required": false,
+ "description": "Sort results by this field.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 20
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Playlist placements",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchPlaylistsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/profile": {
+ "get": {
+ "description": "Get a full artist profile \u2014 bio, genres, social URLs, label, career stage, and basic metrics.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Artist profile",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchProfileResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/radio": {
+ "get": {
+ "description": "List radio stations tracked by Chartmetric. NOT artist-scoped. Returns station names, formats, and markets.",
+ "responses": {
+ "200": {
+ "description": "Radio station list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchRadioResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/rank": {
+ "get": {
+ "description": "Get an artist's global Chartmetric ranking as a single integer value.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Artist rank",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchRankResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/similar": {
+ "get": {
+ "description": "Find similar artists based on audience overlap, genre, mood, and musicality. Use for competitive analysis and collaboration discovery.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "audience",
+ "in": "query",
+ "required": false,
+ "description": "Audience overlap weight.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "high",
+ "medium",
+ "low"
+ ]
+ }
+ },
+ {
+ "name": "genre",
+ "in": "query",
+ "required": false,
+ "description": "Genre similarity weight.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "high",
+ "medium",
+ "low"
+ ]
+ }
+ },
+ {
+ "name": "mood",
+ "in": "query",
+ "required": false,
+ "description": "Mood similarity weight.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "high",
+ "medium",
+ "low"
+ ]
+ }
+ },
+ {
+ "name": "musicality",
+ "in": "query",
+ "required": false,
+ "description": "Musicality similarity weight.",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "high",
+ "medium",
+ "low"
+ ]
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 10
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Similar artists with overlap scores",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchSimilarResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/track": {
+ "get": {
+ "description": "Get track metadata \u2014 title, artist, album, release date, popularity, and platform IDs.",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": true,
+ "description": "Track name or Spotify URL.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Track metadata",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchTrackResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/tracks": {
+ "get": {
+ "description": "Get all tracks by an artist with popularity data.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Artist tracks",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchTracksResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/urls": {
+ "get": {
+ "description": "Get all social and streaming URLs for an artist \u2014 Spotify, Instagram, TikTok, YouTube, Twitter, SoundCloud, and more.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID (UUID).",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Social and streaming URLs",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchUrlsResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/venues": {
+ "get": {
+ "description": "Get venues an artist has performed at, including capacity and location data.",
+ "parameters": [
+ {
+ "name": "artist",
+ "in": "query",
+ "required": true,
+ "description": "Artist name or Recoup artist ID.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Venue list",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchVenuesResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/research/web": {
+ "post": {
+ "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.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchWebRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Web search results",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResearchWebResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Error": {
+ "required": [
+ "error",
+ "message"
+ ],
+ "type": "object",
+ "properties": {
+ "error": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ }
+ }
+ },
+ "CreateNotificationRequest": {
+ "type": "object",
+ "required": [
+ "subject"
+ ],
+ "properties": {
+ "cc": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "email"
+ },
+ "description": "Optional CC email addresses",
+ "example": [
+ "cc@example.com"
+ ]
+ },
+ "subject": {
+ "type": "string",
+ "description": "Email subject line",
+ "example": "Weekly Pulse Report"
+ },
+ "text": {
+ "type": "string",
+ "description": "Plain text or Markdown body. Rendered as HTML via Markdown if no `html` is provided.",
+ "example": "# Pulse Report\n\nHere's your weekly summary."
+ },
+ "html": {
+ "type": "string",
+ "description": "Raw HTML body. Takes precedence over `text` when both are provided.",
+ "example": "Pulse Report
Here's your weekly summary.
"
+ },
+ "headers": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Optional custom email headers"
+ },
+ "room_id": {
+ "type": "string",
+ "description": "Room ID to include a chat link in the email footer"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the account to send the notification for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, sends the notification for the API key's own account."
+ }
+ }
+ },
+ "NotificationResponse": {
+ "type": "object",
+ "properties": {
+ "success": {
+ "type": "boolean",
+ "description": "Whether the notification was sent successfully",
+ "example": true
+ },
+ "message": {
+ "type": "string",
+ "description": "Human-readable result message",
+ "example": "Email sent successfully from Agent by Recoup to user@example.com."
+ },
+ "id": {
+ "type": "string",
+ "description": "Resend email ID",
+ "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
+ }
+ }
+ },
+ "ConnectorInfo": {
+ "type": "object",
+ "required": [
+ "slug",
+ "name",
+ "isConnected"
+ ],
+ "properties": {
+ "slug": {
+ "type": "string",
+ "description": "Unique identifier for the connector (e.g., 'googlesheets', 'tiktok')"
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the connector"
+ },
+ "isConnected": {
+ "type": "boolean",
+ "description": "Whether the connector is currently connected"
+ },
+ "connectedAccountId": {
+ "type": "string",
+ "description": "The connected account ID (only present when isConnected is true)"
+ }
+ }
+ },
+ "ConnectorsResponse": {
+ "type": "object",
+ "required": [
+ "success",
+ "connectors"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean"
+ },
+ "connectors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConnectorInfo"
+ },
+ "description": "List of available connectors with connection status"
+ }
+ }
+ },
+ "AuthorizeConnectorRequest": {
+ "type": "object",
+ "required": [
+ "connector"
+ ],
+ "properties": {
+ "connector": {
+ "type": "string",
+ "description": "The connector slug to authorize (e.g., 'googlesheets', 'tiktok')"
+ },
+ "callback_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Optional custom callback URL after OAuth completion"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Optional account ID to connect a service for a different account (e.g., an artist, workspace, or organization). Use this when connecting an artist's TikTok or other service. The authenticated account must have access. Omit to connect for your own account."
+ }
+ }
+ },
+ "AuthorizeConnectorResponse": {
+ "type": "object",
+ "required": [
+ "success",
+ "data"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "connector",
+ "redirectUrl"
+ ],
+ "properties": {
+ "connector": {
+ "type": "string",
+ "description": "The connector slug being authorized"
+ },
+ "redirectUrl": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL to redirect to for OAuth authorization"
+ }
+ }
+ }
+ }
+ },
+ "DisconnectConnectorRequest": {
+ "type": "object",
+ "required": [
+ "connected_account_id"
+ ],
+ "properties": {
"connected_account_id": {
"type": "string",
- "description": "The connected account ID to disconnect (from ConnectorInfo.connectedAccountId)"
+ "description": "The connected account ID to disconnect (from ConnectorInfo.connectedAccountId)"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Optional account ID when disconnecting a connection that belongs to a different account (e.g., an artist). Required when the connection was created for another account rather than your own. The authenticated account must have access."
+ }
+ }
+ },
+ "DisconnectConnectorResponse": {
+ "type": "object",
+ "required": [
+ "success"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean"
+ },
+ "message": {
+ "type": "string",
+ "description": "Status message"
+ }
+ }
+ },
+ "CompactChatsRequest": {
+ "type": "object",
+ "required": [
+ "chatId"
+ ],
+ "properties": {
+ "chatId": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "description": "Array of chat IDs to compact"
+ },
+ "prompt": {
+ "type": "string",
+ "description": "Optional prompt to control what information gets preserved in the compacted summary"
+ }
+ }
+ },
+ "CompactChatsResponse": {
+ "type": "object",
+ "required": [
+ "chats"
+ ],
+ "properties": {
+ "chats": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CompactedChat"
+ },
+ "description": "Array of compacted chat results"
+ }
+ }
+ },
+ "CompactedChat": {
+ "type": "object",
+ "required": [
+ "chatId",
+ "compacted"
+ ],
+ "properties": {
+ "chatId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The ID of the chat that was compacted"
+ },
+ "compacted": {
+ "type": "string",
+ "description": "The compacted summary text of the chat"
+ }
+ }
+ },
+ "TasksResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "tasks"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "tasks": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Task"
+ },
+ "description": "Array of task objects"
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
+ }
+ }
+ },
+ "Task": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Unique identifier for the task"
+ },
+ "title": {
+ "type": "string",
+ "description": "Descriptive title or name of the task"
+ },
+ "prompt": {
+ "type": "string",
+ "description": "Detailed instruction or prompt for task execution"
+ },
+ "schedule": {
+ "type": "string",
+ "description": "Cron expression defining when the task should execute (e.g., '0 10 * * *')"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Unique identifier for the associated account"
+ },
+ "artist_account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Unique identifier for the associated artist account"
+ },
+ "enabled": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Whether the task is enabled. Defaults to true."
+ },
+ "trigger_schedule_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier for the trigger schedule associated with this task"
+ },
+ "recent_runs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TaskRunResponse"
+ },
+ "description": "Last 5 runs for this task, sourced from the Trigger.dev API."
+ },
+ "upcoming": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "description": "Next scheduled run times, sourced from the latest Trigger.dev run payload."
+ }
+ }
+ },
+ "CreateTaskRequest": {
+ "type": "object",
+ "required": [
+ "title",
+ "prompt",
+ "schedule",
+ "account_id",
+ "artist_account_id"
+ ],
+ "properties": {
+ "title": {
+ "type": "string",
+ "description": "Descriptive title of the task",
+ "example": "Weekly Genre Pulse Check"
+ },
+ "prompt": {
+ "type": "string",
+ "description": "Instruction/prompt executed by the task",
+ "example": "Execute this weekly genre analysis workflow and email a summary to the team."
+ },
+ "schedule": {
+ "type": "string",
+ "description": "Cron expression defining when the task runs (e.g., '0 9 * * 4' for Thursdays at 9 AM)",
+ "example": "0 9 * * 4"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the associated account",
+ "example": "848cd58d-700f-4b38-ab4c-d9f52a1b2c3d"
+ },
+ "artist_account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the associated artist account",
+ "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
+ }
+ }
+ },
+ "UpdateTaskRequest": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the task to update",
+ "example": "aade2bce-55c7-468e-a606-c4e76fb2ea2a"
+ },
+ "title": {
+ "type": "string",
+ "description": "New descriptive title of the task",
+ "example": "Weekly Genre Pulse Check (Updated)"
+ },
+ "prompt": {
+ "type": "string",
+ "description": "New instruction/prompt executed by the task",
+ "example": "Execute this weekly genre analysis workflow and email a summary to the team."
+ },
+ "schedule": {
+ "type": "string",
+ "description": "New cron expression defining when the task runs",
+ "example": "0 10 * * 4"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "New UUID of the associated account",
+ "example": "848cd58d-700f-4b38-ab4c-d9f52a1b2c3d"
+ },
+ "artist_account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "New UUID of the associated artist account",
+ "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
+ },
+ "enabled": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Whether the task is enabled. Can be true, false, or null.",
+ "example": true
+ }
+ }
+ },
+ "DeleteTaskRequest": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the task to delete",
+ "example": "aade2bce-55c7-468e-a606-c4e76fb2ea2a"
+ }
+ }
+ },
+ "DeleteTaskResponse": {
+ "type": "object",
+ "required": [
+ "status"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the delete operation"
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
+ }
+ }
+ },
+ "Account": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Unique identifier for the account"
+ },
+ "name": {
+ "type": "string",
+ "description": "Account display name"
+ },
+ "image": {
+ "type": "string",
+ "nullable": true,
+ "description": "Profile image URL"
+ },
+ "instruction": {
+ "type": "string",
+ "nullable": true,
+ "description": "Custom AI instructions for this account"
+ },
+ "knowledges": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "$ref": "#/components/schemas/Knowledge"
+ },
+ "description": "Knowledge base files attached to this account"
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "Primary email address"
+ },
+ "wallet_address": {
+ "type": "string",
+ "nullable": true,
+ "description": "Connected wallet address"
+ }
+ }
+ },
+ "Knowledge": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to the knowledge file"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the knowledge file"
+ },
+ "type": {
+ "type": "string",
+ "description": "MIME type of the file"
+ }
+ }
+ },
+ "GetAccountResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "account"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "account": {
+ "$ref": "#/components/schemas/Account",
+ "description": "The account details"
+ }
+ }
+ },
+ "GetAccountIdResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "accountId"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "accountId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The unique identifier (UUID) of the authenticated account"
+ }
+ }
+ },
+ "AccountErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "CreateAccountRequest": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Email address to associate with the account. If an account with this email exists, it will be returned."
+ },
+ "wallet": {
+ "type": "string",
+ "description": "Wallet address to associate with the account. If an account with this wallet exists, it will be returned."
+ }
+ },
+ "description": "At least one of email or wallet should be provided to identify or create an account."
+ },
+ "UpdateAccountRequest": {
+ "type": "object",
+ "required": [
+ "accountId"
+ ],
+ "properties": {
+ "accountId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The unique identifier of the account to update"
+ },
+ "name": {
+ "type": "string",
+ "description": "Display name for the account"
+ },
+ "instruction": {
+ "type": "string",
+ "description": "Custom instruction or bio for the account"
+ },
+ "organization": {
+ "type": "string",
+ "description": "Organization name associated with the account"
+ },
+ "image": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL of the account's profile image"
+ },
+ "jobTitle": {
+ "type": "string",
+ "description": "Job title of the account holder"
+ },
+ "roleType": {
+ "type": "string",
+ "description": "Role type within the organization"
+ },
+ "companyName": {
+ "type": "string",
+ "description": "Company name associated with the account"
+ },
+ "knowledges": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "List of knowledge areas or expertise"
+ }
+ }
+ },
+ "AddArtistToAccountRequest": {
+ "type": "object",
+ "required": [
+ "email",
+ "artistId"
+ ],
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Email address of the account to add the artist to"
+ },
+ "artistId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The unique identifier of the artist to add"
+ }
+ }
+ },
+ "AccountDataResponse": {
+ "type": "object",
+ "required": [
+ "data"
+ ],
+ "properties": {
+ "data": {
+ "$ref": "#/components/schemas/AccountData",
+ "description": "The account data"
+ }
+ }
+ },
+ "AccountData": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The unique identifier of the account"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The account ID (same as id, for consistency)"
+ },
+ "name": {
+ "type": "string",
+ "description": "Display name of the account"
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Email address associated with the account"
+ },
+ "wallet": {
+ "type": "string",
+ "description": "Wallet address associated with the account"
+ },
+ "image": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL of the account's profile image"
+ },
+ "instruction": {
+ "type": "string",
+ "description": "Custom instruction or bio"
+ },
+ "organization": {
+ "type": "string",
+ "description": "Organization name"
+ },
+ "job_title": {
+ "type": "string",
+ "description": "Job title"
+ },
+ "role_type": {
+ "type": "string",
+ "description": "Role type"
+ },
+ "company_name": {
+ "type": "string",
+ "description": "Company name"
+ },
+ "knowledges": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "List of knowledge areas"
+ }
+ }
+ },
+ "AddArtistSuccessResponse": {
+ "type": "object",
+ "required": [
+ "success"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean",
+ "enum": [
+ true
+ ],
+ "description": "Indicates the artist was successfully added"
+ }
+ }
+ },
+ "Artist": {
+ "type": "object",
+ "properties": {
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist account"
+ },
+ "name": {
+ "type": "string",
+ "description": "Artist display name"
+ },
+ "image": {
+ "type": "string",
+ "nullable": true,
+ "description": "Artist profile image URL"
+ },
+ "pinned": {
+ "type": "boolean",
+ "description": "Whether the account has pinned this artist"
+ },
+ "socials": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ArtistSocial"
+ },
+ "description": "Social media profiles linked to the artist"
+ }
+ }
+ },
+ "ArtistSocial": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the social profile"
+ },
+ "platform": {
+ "type": "string",
+ "description": "Social media platform (e.g., instagram, twitter, tiktok)"
+ },
+ "username": {
+ "type": "string",
+ "description": "Username on the platform"
+ },
+ "profile_url": {
+ "type": "string",
+ "description": "Full URL to the social media profile"
+ }
+ }
+ },
+ "ArtistsResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "artists"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Artist"
+ },
+ "description": "List of artist objects"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
+ }
+ }
+ },
+ "ArtistsErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "CreateArtistRequest": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The name of the artist to create"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the account to create the artist for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the artist is created for the API key's own account."
+ },
+ "organization_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Optional organization ID to link the new artist to"
+ }
+ }
+ },
+ "CreateArtistResponse": {
+ "type": "object",
+ "required": [
+ "artist"
+ ],
+ "properties": {
+ "artist": {
+ "$ref": "#/components/schemas/CreatedArtist"
+ }
+ }
+ },
+ "CreatedArtist": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the created artist account"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist account (same as id)"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the artist"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true,
+ "description": "ISO timestamp of when the artist was created"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true,
+ "description": "ISO timestamp of when the artist was last updated"
+ },
+ "image": {
+ "type": "string",
+ "nullable": true,
+ "description": "Artist profile image URL"
+ },
+ "instruction": {
+ "type": "string",
+ "nullable": true,
+ "description": "Custom AI instruction for this artist"
+ },
+ "knowledges": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "description": "Knowledge base references for this artist"
+ },
+ "label": {
+ "type": "string",
+ "nullable": true,
+ "description": "Record label name"
+ },
+ "organization": {
+ "type": "string",
+ "nullable": true,
+ "description": "Organization name"
+ },
+ "company_name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Company name"
+ },
+ "job_title": {
+ "type": "string",
+ "nullable": true,
+ "description": "Job title"
+ },
+ "role_type": {
+ "type": "string",
+ "nullable": true,
+ "description": "Role type"
+ },
+ "onboarding_status": {
+ "type": "string",
+ "nullable": true,
+ "description": "Onboarding status"
+ },
+ "onboarding_data": {
+ "nullable": true,
+ "description": "Onboarding data"
+ },
+ "account_info": {
+ "type": "array",
+ "description": "Account info records"
+ },
+ "account_socials": {
+ "type": "array",
+ "description": "Linked social media accounts"
+ }
+ }
+ },
+ "CreateArtistError": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "missing_fields": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "List of missing or invalid field names"
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message describing the validation failure"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message (for invalid JSON or other errors)"
+ }
+ }
+ },
+ "ArtistSegment": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist_segments record"
+ },
+ "artist_account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist's accounts record"
+ },
+ "segment_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the segments record"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the segment data was last updated"
+ },
+ "segment_name": {
+ "type": "string",
+ "description": "Name of the segment (e.g., 'Twitter Followers')"
+ },
+ "artist_name": {
+ "type": "string",
+ "description": "Name of the artist"
+ }
+ }
+ },
+ "ArtistSegmentsPagination": {
+ "type": "object",
+ "properties": {
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of segments available"
+ },
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "Number of segments per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
+ }
+ }
+ },
+ "ArtistSegmentsResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "segments",
+ "pagination"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "segments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ArtistSegment"
+ },
+ "description": "List of segment objects associated with the artist"
+ },
+ "pagination": {
+ "$ref": "#/components/schemas/ArtistSegmentsPagination",
+ "description": "Pagination metadata for the response"
+ }
+ }
+ },
+ "ArtistSegmentsErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "SocialProfile": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist's account_socials record"
+ },
+ "social_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the artist's socials account"
+ },
+ "username": {
+ "type": "string",
+ "description": "Username on the platform"
+ },
+ "profile_url": {
+ "type": "string",
+ "description": "Direct URL to the profile"
+ },
+ "avatar": {
+ "type": "string",
+ "nullable": true,
+ "description": "URL to the profile avatar image"
+ },
+ "bio": {
+ "type": "string",
+ "nullable": true,
+ "description": "Profile biography or description"
},
- "account_id": {
+ "follower_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of followers on this platform"
+ },
+ "following_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of accounts followed on this platform"
+ },
+ "region": {
"type": "string",
- "format": "uuid",
- "description": "Optional account ID when disconnecting a connection that belongs to a different account (e.g., an artist). Required when the connection was created for another account rather than your own. The authenticated account must have access."
+ "nullable": true,
+ "description": "Geographic region of the profile"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the profile was last updated"
}
}
},
- "DisconnectConnectorResponse": {
+ "ArtistSocialsPagination": {
"type": "object",
- "required": [
- "success"
- ],
"properties": {
- "success": {
- "type": "boolean"
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of social profiles available"
},
- "message": {
- "type": "string",
- "description": "Status message"
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "Number of social profiles per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "CompactChatsRequest": {
+ "ArtistSocialsResponse": {
"type": "object",
"required": [
- "chatId"
+ "status",
+ "socials",
+ "pagination"
],
"properties": {
- "chatId": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "socials": {
"type": "array",
- "minItems": 1,
"items": {
- "type": "string",
- "format": "uuid"
+ "$ref": "#/components/schemas/SocialProfile"
},
- "description": "Array of chat IDs to compact"
+ "description": "List of social media profiles associated with the artist"
},
- "prompt": {
- "type": "string",
- "description": "Optional prompt to control what information gets preserved in the compacted summary"
+ "pagination": {
+ "$ref": "#/components/schemas/ArtistSocialsPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "CompactChatsResponse": {
+ "ArtistSocialsErrorResponse": {
"type": "object",
"required": [
- "chats"
+ "status",
+ "message"
],
"properties": {
- "chats": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CompactedChat"
- },
- "description": "Array of compacted chat results"
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
}
}
},
- "CompactedChat": {
+ "ArtistSocialsScrapeRequest": {
"type": "object",
"required": [
- "chatId",
- "compacted"
+ "artist_account_id"
],
"properties": {
- "chatId": {
+ "artist_account_id": {
"type": "string",
"format": "uuid",
- "description": "The ID of the chat that was compacted"
+ "description": "UUID of the artist account to scrape socials for",
+ "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
+ }
+ }
+ },
+ "ApifyRunResult": {
+ "type": "object",
+ "properties": {
+ "runId": {
+ "type": "string",
+ "description": "Unique identifier for the Apify run"
},
- "compacted": {
+ "datasetId": {
"type": "string",
- "description": "The compacted summary text of the chat"
+ "description": "Unique identifier for the dataset containing scraped data"
+ },
+ "error": {
+ "type": "string",
+ "nullable": true,
+ "description": "Error message if the run failed (null if successful)"
}
}
},
- "TasksResponse": {
+ "InstagramErrorResponse": {
"type": "object",
- "required": [
- "status",
- "tasks"
- ],
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
"error"
],
"description": "Status of the request"
},
- "tasks": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Task"
- },
- "description": "Array of task objects"
- },
- "error": {
+ "message": {
"type": "string",
- "description": "Error message (only present if status is error)"
+ "description": "Error message describing what went wrong"
}
}
},
- "Task": {
+ "ApifyScraperInProgressResponse": {
"type": "object",
+ "required": [
+ "status",
+ "datasetId"
+ ],
+ "description": "Response when the Apify run is still in progress",
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "Unique identifier for the task"
- },
- "title": {
- "type": "string",
- "description": "Descriptive title or name of the task"
- },
- "prompt": {
- "type": "string",
- "description": "Detailed instruction or prompt for task execution"
- },
- "schedule": {
+ "status": {
"type": "string",
- "description": "Cron expression defining when the task should execute (e.g., '0 10 * * *')"
+ "description": "Current status of the Apify run (e.g., 'RUNNING', 'READY')",
+ "example": "RUNNING"
},
- "account_id": {
+ "datasetId": {
"type": "string",
- "format": "uuid",
- "description": "Unique identifier for the associated account"
- },
- "artist_account_id": {
+ "description": "ID of the dataset that will contain the results when the run completes",
+ "example": "def456uvw"
+ }
+ }
+ },
+ "ApifyScraperCompletedResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "datasetId",
+ "data"
+ ],
+ "description": "Response when the Apify run has completed successfully",
+ "properties": {
+ "status": {
"type": "string",
- "format": "uuid",
- "description": "Unique identifier for the associated artist account"
- },
- "enabled": {
- "type": "boolean",
- "nullable": true,
- "description": "Whether the task is enabled. Defaults to true."
+ "description": "Final status of the Apify run (typically 'SUCCEEDED')",
+ "example": "SUCCEEDED"
},
- "trigger_schedule_id": {
+ "datasetId": {
"type": "string",
- "nullable": true,
- "description": "Identifier for the trigger schedule associated with this task"
+ "description": "ID of the dataset containing the results",
+ "example": "def456uvw"
},
- "recent_runs": {
+ "data": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/TaskRunResponse"
+ "type": "object",
+ "additionalProperties": true
},
- "description": "Last 5 runs for this task, sourced from the Trigger.dev API."
+ "description": "Array of dataset items returned by the scraper. The structure of each item varies depending on the scraper type (Instagram Profile, Instagram Comments, etc.)",
+ "example": [
+ {
+ "id": "123456789",
+ "username": "example_user",
+ "fullName": "Example User",
+ "biography": "This is a sample biography",
+ "followersCount": 1000,
+ "followsCount": 500,
+ "profilePicUrl": "https://example.com/profile.jpg"
+ }
+ ]
+ }
+ }
+ },
+ "ApifyScraperErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "description": "Error response from the Apify scraper results endpoint",
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status indicating an error occurred"
},
- "upcoming": {
- "type": "array",
- "items": {
- "type": "string",
- "format": "date-time"
- },
- "description": "Next scheduled run times, sourced from the latest Trigger.dev run payload."
+ "message": {
+ "type": "string",
+ "description": "Error message describing what went wrong",
+ "example": "runId is required"
}
}
},
- "CreateTaskRequest": {
+ "ArtistSocialsScrapeResponse": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ApifyRunResult"
+ },
+ "description": "Array of Apify run results, one for each social profile scraped"
+ },
+ "ArtistProfileSocialProfile": {
"type": "object",
- "required": [
- "title",
- "prompt",
- "schedule",
- "account_id",
- "artist_account_id"
- ],
"properties": {
- "title": {
+ "id": {
"type": "string",
- "description": "Descriptive title of the task",
- "example": "Weekly Genre Pulse Check"
+ "description": "Unique identifier for the social profile"
},
- "prompt": {
+ "username": {
"type": "string",
- "description": "Instruction/prompt executed by the task",
- "example": "Execute this weekly genre analysis workflow and email a summary to the team."
+ "description": "Username on the platform"
},
- "schedule": {
+ "profile_url": {
"type": "string",
- "description": "Cron expression defining when the task runs (e.g., '0 9 * * 4' for Thursdays at 9 AM)",
- "example": "0 9 * * 4"
+ "description": "Direct URL to the profile"
},
- "account_id": {
+ "avatar": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the associated account",
- "example": "848cd58d-700f-4b38-ab4c-d9f52a1b2c3d"
+ "nullable": true,
+ "description": "URL to the profile avatar image"
},
- "artist_account_id": {
+ "bio": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the associated artist account",
- "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
+ "nullable": true,
+ "description": "Profile biography or description"
+ },
+ "follower_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of followers on this platform"
+ },
+ "following_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of accounts followed on this platform"
+ },
+ "post_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of posts on this platform"
+ },
+ "region": {
+ "type": "string",
+ "nullable": true,
+ "description": "Geographic region of the profile"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the profile was last updated"
}
}
},
- "UpdateTaskRequest": {
+ "ArtistProfile": {
"type": "object",
- "required": [
- "id"
- ],
"properties": {
"id": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the task to update",
- "example": "aade2bce-55c7-468e-a606-c4e76fb2ea2a"
+ "description": "Unique identifier for the artist"
},
- "title": {
- "type": "string",
- "description": "New descriptive title of the task",
- "example": "Weekly Genre Pulse Check (Updated)"
+ "profiles": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ArtistProfileSocialProfile"
+ },
+ "description": "List of social media profiles"
},
- "prompt": {
- "type": "string",
- "description": "New instruction/prompt executed by the task",
- "example": "Execute this weekly genre analysis workflow and email a summary to the team."
+ "total_followers": {
+ "type": "integer",
+ "description": "Sum of followers across all platforms"
},
- "schedule": {
- "type": "string",
- "description": "New cron expression defining when the task runs",
- "example": "0 10 * * 4"
+ "total_following": {
+ "type": "integer",
+ "description": "Sum of following across all platforms"
},
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "New UUID of the associated account",
- "example": "848cd58d-700f-4b38-ab4c-d9f52a1b2c3d"
+ "total_posts": {
+ "type": "integer",
+ "description": "Sum of posts across all platforms"
},
- "artist_account_id": {
+ "updated_at": {
"type": "string",
- "format": "uuid",
- "description": "New UUID of the associated artist account",
- "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
- },
- "enabled": {
- "type": "boolean",
- "nullable": true,
- "description": "Whether the task is enabled. Can be true, false, or null.",
- "example": true
+ "format": "date-time",
+ "description": "ISO timestamp of when the data was last updated"
}
}
},
- "DeleteTaskRequest": {
+ "ArtistProfileResponse": {
"type": "object",
"required": [
- "id"
+ "status",
+ "profile"
],
"properties": {
- "id": {
+ "status": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the task to delete",
- "example": "aade2bce-55c7-468e-a606-c4e76fb2ea2a"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "profile": {
+ "$ref": "#/components/schemas/ArtistProfile",
+ "description": "The artist's comprehensive profile information"
}
}
},
- "DeleteTaskResponse": {
+ "ArtistProfileErrorResponse": {
"type": "object",
"required": [
- "status"
+ "status",
+ "message"
],
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
"error"
],
- "description": "Status of the delete operation"
+ "description": "Status of the request"
},
- "error": {
+ "message": {
"type": "string",
- "description": "Error message (only present if status is error)"
+ "description": "Error message describing what went wrong"
}
}
},
- "Account": {
+ "ChatRoom": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
- "description": "Unique identifier for the account"
+ "description": "UUID of the chat room"
},
- "name": {
+ "account_id": {
"type": "string",
- "description": "Account display name"
+ "format": "uuid",
+ "nullable": true,
+ "description": "UUID of the associated account (can be null if not set)"
},
- "image": {
+ "topic": {
"type": "string",
"nullable": true,
- "description": "Profile image URL"
+ "description": "Optional topic or description of the room (null if not provided)"
},
- "instruction": {
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of the last update to the room"
+ },
+ "artist_id": {
"type": "string",
+ "format": "uuid",
"nullable": true,
- "description": "Custom AI instructions for this account"
+ "description": "UUID of the associated artist account (null when not applicable)"
+ }
+ }
+ },
+ "GetChatsResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "chats"
+ ],
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "knowledges": {
+ "chats": {
"type": "array",
- "nullable": true,
"items": {
- "$ref": "#/components/schemas/Knowledge"
+ "$ref": "#/components/schemas/ChatRoom"
},
- "description": "Knowledge base files attached to this account"
- },
- "email": {
+ "description": "Array of chat room objects"
+ }
+ }
+ },
+ "GetChatsErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
+ "properties": {
+ "status": {
"type": "string",
- "nullable": true,
- "description": "Primary email address"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "wallet_address": {
+ "error": {
"type": "string",
- "nullable": true,
- "description": "Connected wallet address"
+ "description": "Error message describing what went wrong"
}
}
},
- "Knowledge": {
+ "GetChatArtistResponse": {
"type": "object",
+ "required": [
+ "status",
+ "room_id",
+ "artist_id",
+ "artist_exists"
+ ],
"properties": {
- "url": {
+ "status": {
"type": "string",
- "description": "URL to the knowledge file"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "name": {
+ "room_id": {
"type": "string",
- "description": "Name of the knowledge file"
+ "format": "uuid",
+ "description": "UUID of the chat room"
},
- "type": {
+ "artist_id": {
"type": "string",
- "description": "MIME type of the file"
+ "format": "uuid",
+ "nullable": true,
+ "description": "UUID of the artist account associated with the chat, or null when no artist is linked"
+ },
+ "artist_exists": {
+ "type": "boolean",
+ "description": "Whether an artist is linked to the chat room"
}
}
},
- "GetAccountResponse": {
+ "GetChatArtistErrorResponse": {
"type": "object",
"required": [
"status",
- "account"
+ "error"
],
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
+ "error"
],
"description": "Status of the request"
},
- "account": {
- "$ref": "#/components/schemas/Account",
- "description": "The account details"
+ "error": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
}
}
},
- "GetAccountIdResponse": {
+ "GetChatSegmentResponse": {
"type": "object",
"required": [
"status",
- "accountId"
+ "room_id",
+ "segment_id",
+ "segment_exists"
],
"properties": {
"status": {
@@ -6480,18 +8673,28 @@
],
"description": "Status of the request"
},
- "accountId": {
+ "room_id": {
"type": "string",
"format": "uuid",
- "description": "The unique identifier (UUID) of the authenticated account"
+ "description": "UUID of the chat room"
+ },
+ "segment_id": {
+ "type": "string",
+ "format": "uuid",
+ "nullable": true,
+ "description": "UUID of the segment associated with the chat, or null when no segment is linked"
+ },
+ "segment_exists": {
+ "type": "boolean",
+ "description": "Whether a segment is linked to the chat room"
}
}
},
- "AccountErrorResponse": {
+ "GetChatSegmentErrorResponse": {
"type": "object",
"required": [
"status",
- "message"
+ "error"
],
"properties": {
"status": {
@@ -6501,263 +8704,251 @@
],
"description": "Status of the request"
},
- "message": {
+ "error": {
"type": "string",
"description": "Error message describing what went wrong"
}
}
},
- "CreateAccountRequest": {
- "type": "object",
- "properties": {
- "email": {
- "type": "string",
- "format": "email",
- "description": "Email address to associate with the account. If an account with this email exists, it will be returned."
- },
- "wallet": {
- "type": "string",
- "description": "Wallet address to associate with the account. If an account with this wallet exists, it will be returned."
- }
- },
- "description": "At least one of email or wallet should be provided to identify or create an account."
- },
- "UpdateAccountRequest": {
+ "ChatMessage": {
"type": "object",
"required": [
- "accountId"
+ "id",
+ "room_id",
+ "content",
+ "updated_at"
],
"properties": {
- "accountId": {
+ "id": {
"type": "string",
"format": "uuid",
- "description": "The unique identifier of the account to update"
- },
- "name": {
- "type": "string",
- "description": "Display name for the account"
- },
- "instruction": {
- "type": "string",
- "description": "Custom instruction or bio for the account"
- },
- "organization": {
- "type": "string",
- "description": "Organization name associated with the account"
- },
- "image": {
- "type": "string",
- "format": "uri",
- "description": "URL of the account's profile image"
+ "description": "UUID of the memory message"
},
- "jobTitle": {
+ "room_id": {
"type": "string",
- "description": "Job title of the account holder"
+ "format": "uuid",
+ "description": "UUID of the parent chat room"
},
- "roleType": {
- "type": "string",
- "description": "Role type within the organization"
+ "content": {
+ "type": "object",
+ "description": "Structured message payload stored for the memory"
},
- "companyName": {
+ "updated_at": {
"type": "string",
- "description": "Company name associated with the account"
- },
- "knowledges": {
+ "format": "date-time",
+ "description": "ISO timestamp of the memory update"
+ }
+ }
+ },
+ "GetChatMessagesResponse": {
+ "type": "object",
+ "required": [
+ "data"
+ ],
+ "properties": {
+ "data": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/ChatMessage"
},
- "description": "List of knowledge areas or expertise"
+ "description": "Chronologically ordered list of messages for the chat"
}
}
},
- "AddArtistToAccountRequest": {
+ "GetChatMessagesErrorResponse": {
"type": "object",
"required": [
- "email",
- "artistId"
+ "status",
+ "error"
],
"properties": {
- "email": {
+ "status": {
"type": "string",
- "format": "email",
- "description": "Email address of the account to add the artist to"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "artistId": {
+ "error": {
"type": "string",
- "format": "uuid",
- "description": "The unique identifier of the artist to add"
+ "description": "Error message describing what went wrong"
}
}
},
- "AccountDataResponse": {
+ "CopyChatMessagesRequest": {
"type": "object",
"required": [
- "data"
+ "targetChatId"
],
"properties": {
- "data": {
- "$ref": "#/components/schemas/AccountData",
- "description": "The account data"
+ "targetChatId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Target chat room UUID to receive the copied messages."
+ },
+ "clearExisting": {
+ "type": "boolean",
+ "default": true,
+ "description": "When true, existing messages in the target chat are deleted before copy."
}
}
},
- "AccountData": {
+ "CopyChatMessagesResponse": {
"type": "object",
+ "required": [
+ "status",
+ "source_chat_id",
+ "target_chat_id",
+ "copied_count",
+ "cleared_existing"
+ ],
"properties": {
- "id": {
+ "status": {
"type": "string",
- "format": "uuid",
- "description": "The unique identifier of the account"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "account_id": {
+ "source_chat_id": {
"type": "string",
"format": "uuid",
- "description": "The account ID (same as id, for consistency)"
- },
- "name": {
- "type": "string",
- "description": "Display name of the account"
- },
- "email": {
- "type": "string",
- "format": "email",
- "description": "Email address associated with the account"
- },
- "wallet": {
- "type": "string",
- "description": "Wallet address associated with the account"
- },
- "image": {
- "type": "string",
- "format": "uri",
- "description": "URL of the account's profile image"
- },
- "instruction": {
- "type": "string",
- "description": "Custom instruction or bio"
+ "description": "Source chat room UUID."
},
- "organization": {
+ "target_chat_id": {
"type": "string",
- "description": "Organization name"
+ "format": "uuid",
+ "description": "Target chat room UUID."
},
- "job_title": {
- "type": "string",
- "description": "Job title"
+ "copied_count": {
+ "type": "integer",
+ "description": "Number of messages copied from source to target."
},
- "role_type": {
+ "cleared_existing": {
+ "type": "boolean",
+ "description": "Whether existing target messages were deleted before copy."
+ }
+ }
+ },
+ "CopyChatMessagesErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
+ "properties": {
+ "status": {
"type": "string",
- "description": "Role type"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "company_name": {
+ "error": {
"type": "string",
- "description": "Company name"
- },
- "knowledges": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "List of knowledge areas"
+ "description": "Error message describing what went wrong."
}
}
},
- "AddArtistSuccessResponse": {
+ "DeleteTrailingChatMessagesResponse": {
"type": "object",
"required": [
- "success"
+ "status",
+ "chat_id",
+ "from_message_id"
],
"properties": {
- "success": {
- "type": "boolean",
+ "status": {
+ "type": "string",
"enum": [
- true
+ "success"
],
- "description": "Indicates the artist was successfully added"
+ "description": "Status of the request"
+ },
+ "chat_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The chat UUID where deletion was applied."
+ },
+ "from_message_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The message UUID used as the trailing deletion boundary."
}
}
},
- "Artist": {
+ "DeleteTrailingChatMessagesErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the artist account"
- },
- "name": {
+ "status": {
"type": "string",
- "description": "Artist display name"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "image": {
+ "error": {
"type": "string",
- "nullable": true,
- "description": "Artist profile image URL"
- },
- "pinned": {
- "type": "boolean",
- "description": "Whether the account has pinned this artist"
+ "description": "Error message describing what went wrong."
},
- "socials": {
+ "missing_fields": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ArtistSocial"
+ "type": "string"
},
- "description": "Social media profiles linked to the artist"
+ "description": "List of missing or invalid parameter fields (when validation fails)."
}
}
},
- "ArtistSocial": {
+ "CreateChatRequest": {
"type": "object",
"properties": {
- "id": {
+ "artistId": {
"type": "string",
"format": "uuid",
- "description": "UUID of the social profile"
+ "description": "UUID of the artist account the chat is associated with"
},
- "platform": {
+ "chatId": {
"type": "string",
- "description": "Social media platform (e.g., instagram, twitter, tiktok)"
+ "format": "uuid",
+ "description": "UUID for the new chat (client-generated). If not provided, one will be generated automatically."
},
- "username": {
+ "accountId": {
"type": "string",
- "description": "Username on the platform"
+ "format": "uuid",
+ "description": "UUID of the account to create the chat for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the chat is created for the API key's own account."
},
- "profile_url": {
+ "topic": {
"type": "string",
- "description": "Full URL to the social media profile"
+ "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
}
}
},
- "ArtistsResponse": {
+ "CreateChatResponse": {
"type": "object",
"required": [
"status",
- "artists"
+ "chat"
],
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
- "error"
+ "success"
],
"description": "Status of the request"
},
- "artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Artist"
- },
- "description": "List of artist objects"
- },
- "message": {
- "type": "string",
- "description": "Error message (only present if status is error)"
+ "chat": {
+ "$ref": "#/components/schemas/ChatRoom",
+ "description": "The created chat room object"
}
}
},
- "ArtistsErrorResponse": {
+ "CreateChatErrorResponse": {
"type": "object",
"required": [
"status",
@@ -6777,133 +8968,111 @@
}
}
},
- "CreateArtistRequest": {
+ "UpdateChatRequest": {
"type": "object",
"required": [
- "name"
+ "chatId",
+ "topic"
],
"properties": {
- "name": {
- "type": "string",
- "minLength": 1,
- "description": "The name of the artist to create"
- },
- "account_id": {
+ "chatId": {
"type": "string",
"format": "uuid",
- "description": "UUID of the account to create the artist for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the artist is created for the API key's own account."
+ "description": "The unique identifier (UUID) of the chat room to update"
},
- "organization_id": {
+ "topic": {
"type": "string",
- "format": "uuid",
- "description": "Optional organization ID to link the new artist to"
+ "minLength": 3,
+ "maxLength": 50,
+ "description": "The new display name for the chat room. Must be between 3 and 50 characters."
}
}
},
- "CreateArtistResponse": {
+ "UpdateChatResponse": {
"type": "object",
"required": [
- "artist"
+ "status",
+ "chat"
],
"properties": {
- "artist": {
- "$ref": "#/components/schemas/CreatedArtist"
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
+ },
+ "chat": {
+ "$ref": "#/components/schemas/ChatRoom",
+ "description": "The updated chat room object"
}
}
},
- "CreatedArtist": {
+ "UpdateChatErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the created artist account"
- },
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the artist account (same as id)"
- },
- "name": {
- "type": "string",
- "description": "Name of the artist"
- },
- "created_at": {
- "type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "ISO timestamp of when the artist was created"
- },
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "ISO timestamp of when the artist was last updated"
- },
- "image": {
- "type": "string",
- "nullable": true,
- "description": "Artist profile image URL"
- },
- "instruction": {
- "type": "string",
- "nullable": true,
- "description": "Custom AI instruction for this artist"
- },
- "knowledges": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "nullable": true,
- "description": "Knowledge base references for this artist"
- },
- "label": {
+ "status": {
"type": "string",
- "nullable": true,
- "description": "Record label name"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "organization": {
+ "message": {
"type": "string",
- "nullable": true,
- "description": "Organization name"
- },
- "company_name": {
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "DeleteChatRequest": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
"type": "string",
- "nullable": true,
- "description": "Company name"
- },
- "job_title": {
+ "format": "uuid",
+ "description": "The unique identifier (UUID) of the chat room to delete."
+ }
+ }
+ },
+ "DeleteChatResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "id",
+ "message"
+ ],
+ "properties": {
+ "status": {
"type": "string",
- "nullable": true,
- "description": "Job title"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "role_type": {
+ "id": {
"type": "string",
- "nullable": true,
- "description": "Role type"
+ "format": "uuid",
+ "description": "The UUID of the deleted chat room."
},
- "onboarding_status": {
+ "message": {
"type": "string",
- "nullable": true,
- "description": "Onboarding status"
- },
- "onboarding_data": {
- "nullable": true,
- "description": "Onboarding data"
- },
- "account_info": {
- "type": "array",
- "description": "Account info records"
- },
- "account_socials": {
- "type": "array",
- "description": "Linked social media accounts"
+ "description": "Success message describing the deletion result."
}
}
},
- "CreateArtistError": {
+ "DeleteChatErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
"status": {
"type": "string",
@@ -6912,106 +9081,186 @@
],
"description": "Status of the request"
},
- "missing_fields": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "List of missing or invalid field names"
- },
"error": {
"type": "string",
- "description": "Error message describing the validation failure"
+ "description": "Error message describing what went wrong."
+ }
+ }
+ },
+ "UIMessage": {
+ "type": "object",
+ "description": "A message in the chat conversation. See https://ai-sdk.dev/docs/reference/ai-sdk-core/ui-message for details.",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier for the message"
+ },
+ "role": {
+ "type": "string",
+ "enum": [
+ "user",
+ "assistant",
+ "system"
+ ],
+ "description": "The role of the message sender"
},
- "message": {
+ "content": {
"type": "string",
- "description": "Error message (for invalid JSON or other errors)"
+ "description": "The text content of the message"
}
}
},
- "ArtistSegment": {
+ "ChatGenerateRequest": {
"type": "object",
+ "description": "Request body for chat generation. Exactly one of 'prompt' or 'messages' must be provided.",
"properties": {
- "id": {
+ "prompt": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the artist_segments record"
+ "description": "Single text prompt for the assistant. Required if 'messages' is not provided."
},
- "artist_account_id": {
+ "messages": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/UIMessage"
+ },
+ "description": "Array of UIMessage objects for context. Required if 'prompt' is not provided."
+ },
+ "artistId": {
"type": "string",
"format": "uuid",
- "description": "UUID of the artist's accounts record"
+ "description": "The unique identifier of the artist (optional)"
},
- "segment_id": {
+ "model": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the segments record"
+ "description": "The AI model to use for text generation (optional)",
+ "example": "openai/gpt-5-mini"
},
- "updated_at": {
+ "excludeTools": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Array of tool names to exclude from execution",
+ "example": [
+ "create_scheduled_actions"
+ ]
+ },
+ "roomId": {
"type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the segment data was last updated"
+ "format": "uuid",
+ "description": "UUID of the chat room. If not provided, one will be generated automatically."
},
- "segment_name": {
+ "topic": {
"type": "string",
- "description": "Name of the segment (e.g., 'Twitter Followers')"
+ "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). Only applies when creating a new room - ignored if room already exists. To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
+ }
+ }
+ },
+ "ContentPart": {
+ "type": "object",
+ "description": "A part of the response content. See https://ai-sdk.dev/docs/reference/ai-sdk-core/generate-text#content for details.",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "text",
+ "tool-call",
+ "tool-result"
+ ],
+ "description": "The type of content part"
},
- "artist_name": {
+ "text": {
"type": "string",
- "description": "Name of the artist"
+ "description": "The text content (present when type is 'text')"
}
}
},
- "ArtistSegmentsPagination": {
+ "ChatGenerateUsage": {
"type": "object",
+ "description": "Token usage information with detailed breakdown",
"properties": {
- "total_count": {
+ "inputTokens": {
"type": "integer",
- "description": "Total number of segments available"
+ "description": "Number of input tokens processed"
},
- "page": {
+ "outputTokens": {
"type": "integer",
- "description": "Current page number"
+ "description": "Number of output tokens generated"
},
- "limit": {
+ "totalTokens": {
"type": "integer",
- "description": "Number of segments per page"
+ "description": "Total tokens used (input + output)"
},
- "total_pages": {
+ "reasoningTokens": {
"type": "integer",
- "description": "Total number of pages available"
+ "description": "Number of reasoning tokens used"
+ },
+ "cachedInputTokens": {
+ "type": "integer",
+ "description": "Number of cached input tokens"
}
}
},
- "ArtistSegmentsResponse": {
+ "ChatGenerateResponseMeta": {
"type": "object",
- "required": [
- "status",
- "segments",
- "pagination"
- ],
+ "description": "Additional response metadata",
"properties": {
- "status": {
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ },
+ "description": "Response messages"
+ },
+ "headers": {
+ "type": "object",
+ "description": "Response headers"
+ },
+ "body": {
+ "type": "object",
+ "description": "Response body"
+ }
+ }
+ },
+ "ChatGenerateResponse": {
+ "type": "object",
+ "description": "Response from the chat generation endpoint",
+ "properties": {
+ "text": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContentPart"
+ },
+ "description": "Array of content parts from the AI model response"
+ },
+ "reasoningText": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "nullable": true,
+ "description": "Optional reasoning or explanation for the response"
},
- "segments": {
+ "sources": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ArtistSegment"
+ "type": "object"
},
- "description": "List of segment objects associated with the artist"
+ "description": "Optional array of sources used for the response"
},
- "pagination": {
- "$ref": "#/components/schemas/ArtistSegmentsPagination",
- "description": "Pagination metadata for the response"
+ "finishReason": {
+ "type": "string",
+ "description": "The reason why the generation finished",
+ "example": "stop"
+ },
+ "usage": {
+ "$ref": "#/components/schemas/ChatGenerateUsage",
+ "description": "Token usage information"
+ },
+ "response": {
+ "$ref": "#/components/schemas/ChatGenerateResponseMeta",
+ "description": "Additional response metadata"
}
}
},
- "ArtistSegmentsErrorResponse": {
+ "ChatGenerateErrorResponse": {
"type": "object",
"required": [
"status",
@@ -7031,86 +9280,101 @@
}
}
},
- "SocialProfile": {
+ "ChatStreamRequest": {
"type": "object",
+ "description": "Request body for chat streaming. Exactly one of 'prompt' or 'messages' must be provided.",
"properties": {
- "id": {
+ "prompt": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the artist's account_socials record"
+ "description": "Single text prompt for the assistant. Required if 'messages' is not provided."
},
- "social_id": {
+ "messages": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/UIMessage"
+ },
+ "description": "Array of UIMessage objects for context. Required if 'prompt' is not provided."
+ },
+ "artistId": {
"type": "string",
"format": "uuid",
- "description": "UUID of the artist's socials account"
+ "description": "The unique identifier of the artist (optional)"
},
- "username": {
+ "model": {
"type": "string",
- "description": "Username on the platform"
+ "description": "The AI model to use for text generation (optional)",
+ "example": "openai/gpt-5-mini"
},
- "profile_url": {
- "type": "string",
- "description": "Direct URL to the profile"
+ "excludeTools": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Array of tool names to exclude from execution",
+ "example": [
+ "create_scheduled_actions"
+ ]
},
- "avatar": {
+ "roomId": {
"type": "string",
- "nullable": true,
- "description": "URL to the profile avatar image"
+ "format": "uuid",
+ "description": "UUID of the chat room. If not provided, one will be generated automatically."
},
- "bio": {
+ "topic": {
"type": "string",
- "nullable": true,
- "description": "Profile biography or description"
- },
- "follower_count": {
- "type": "integer",
- "nullable": true,
- "description": "Number of followers on this platform"
- },
- "following_count": {
- "type": "integer",
- "nullable": true,
- "description": "Number of accounts followed on this platform"
- },
- "region": {
+ "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). Only applies when creating a new room - ignored if room already exists. To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
+ }
+ }
+ },
+ "ChatStreamErrorResponse": {
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "properties": {
+ "status": {
"type": "string",
- "nullable": true,
- "description": "Geographic region of the profile"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "updated_at": {
+ "message": {
"type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the profile was last updated"
+ "description": "Error message describing what went wrong"
}
}
},
- "ArtistSocialsPagination": {
+ "Organization": {
"type": "object",
"properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of social profiles available"
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the membership record"
},
- "page": {
- "type": "integer",
- "description": "Current page number"
+ "organization_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the organization account"
},
- "limit": {
- "type": "integer",
- "description": "Number of social profiles per page"
+ "organization_name": {
+ "type": "string",
+ "description": "Display name of the organization"
},
- "total_pages": {
- "type": "integer",
- "description": "Total number of pages available"
+ "organization_image": {
+ "type": "string",
+ "nullable": true,
+ "description": "Organization logo/image URL"
}
}
},
- "ArtistSocialsResponse": {
+ "GetOrganizationsResponse": {
"type": "object",
"required": [
"status",
- "socials",
- "pagination"
+ "organizations"
],
"properties": {
"status": {
@@ -7120,20 +9384,16 @@
],
"description": "Status of the request"
},
- "socials": {
+ "organizations": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SocialProfile"
+ "$ref": "#/components/schemas/Organization"
},
- "description": "List of social media profiles associated with the artist"
- },
- "pagination": {
- "$ref": "#/components/schemas/ArtistSocialsPagination",
- "description": "Pagination metadata for the response"
+ "description": "List of organizations the account belongs to"
}
}
},
- "ArtistSocialsErrorResponse": {
+ "OrganizationsErrorResponse": {
"type": "object",
"required": [
"status",
@@ -7153,1071 +9413,1049 @@
}
}
},
- "ArtistSocialsScrapeRequest": {
+ "CreateOrganizationRequest": {
"type": "object",
"required": [
- "artist_account_id"
+ "name",
+ "accountId"
],
"properties": {
- "artist_account_id": {
+ "name": {
+ "type": "string",
+ "description": "The name of the organization to create",
+ "example": "My New Label"
+ },
+ "accountId": {
"type": "string",
"format": "uuid",
- "description": "UUID of the artist account to scrape socials for",
- "example": "1873859c-dd37-4e9a-9bac-80d35a1b2c3d"
+ "description": "The account ID of the creator",
+ "example": "123e4567-e89b-12d3-a456-426614174000"
}
}
},
- "ApifyRunResult": {
+ "CreatedOrganization": {
"type": "object",
"properties": {
- "runId": {
- "type": "string",
- "description": "Unique identifier for the Apify run"
- },
- "datasetId": {
+ "id": {
"type": "string",
- "description": "Unique identifier for the dataset containing scraped data"
+ "format": "uuid",
+ "description": "UUID of the new organization account"
},
- "error": {
+ "name": {
"type": "string",
- "nullable": true,
- "description": "Error message if the run failed (null if successful)"
+ "description": "Name of the organization"
}
}
},
- "InstagramErrorResponse": {
+ "CreateOrganizationResponse": {
"type": "object",
+ "required": [
+ "status",
+ "organization"
+ ],
"properties": {
"status": {
"type": "string",
"enum": [
- "error"
+ "success"
],
"description": "Status of the request"
},
- "message": {
- "type": "string",
- "description": "Error message describing what went wrong"
+ "organization": {
+ "$ref": "#/components/schemas/CreatedOrganization",
+ "description": "The created organization"
}
}
},
- "ApifyScraperInProgressResponse": {
+ "CreateWorkspaceRequest": {
"type": "object",
- "required": [
- "status",
- "datasetId"
- ],
- "description": "Response when the Apify run is still in progress",
"properties": {
- "status": {
+ "name": {
"type": "string",
- "description": "Current status of the Apify run (e.g., 'RUNNING', 'READY')",
- "example": "RUNNING"
+ "description": "Name of the workspace (defaults to \"Untitled\")"
},
- "datasetId": {
+ "account_id": {
"type": "string",
- "description": "ID of the dataset that will contain the results when the run completes",
- "example": "def456uvw"
+ "format": "uuid",
+ "description": "UUID of the account to create the workspace for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the workspace is created for the API key's own account."
+ },
+ "organization_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Organization to link the workspace to"
}
}
},
- "ApifyScraperCompletedResponse": {
+ "CreateWorkspaceResponse": {
"type": "object",
"required": [
- "status",
- "datasetId",
- "data"
+ "workspace"
],
- "description": "Response when the Apify run has completed successfully",
"properties": {
- "status": {
+ "workspace": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "name": {
+ "type": "string"
+ },
+ "account_id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "isWorkspace": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "AddArtistToOrganizationRequest": {
+ "type": "object",
+ "required": [
+ "artistId",
+ "organizationId"
+ ],
+ "properties": {
+ "artistId": {
"type": "string",
- "description": "Final status of the Apify run (typically 'SUCCEEDED')",
- "example": "SUCCEEDED"
+ "format": "uuid",
+ "description": "The account ID of the artist to add",
+ "example": "artist-account-uuid"
},
- "datasetId": {
+ "organizationId": {
"type": "string",
- "description": "ID of the dataset containing the results",
- "example": "def456uvw"
- },
- "data": {
- "type": "array",
- "items": {
- "type": "object",
- "additionalProperties": true
- },
- "description": "Array of dataset items returned by the scraper. The structure of each item varies depending on the scraper type (Instagram Profile, Instagram Comments, etc.)",
- "example": [
- {
- "id": "123456789",
- "username": "example_user",
- "fullName": "Example User",
- "biography": "This is a sample biography",
- "followersCount": 1000,
- "followsCount": 500,
- "profilePicUrl": "https://example.com/profile.jpg"
- }
- ]
+ "format": "uuid",
+ "description": "The account ID of the organization",
+ "example": "org-account-uuid"
}
}
},
- "ApifyScraperErrorResponse": {
+ "AddArtistToOrganizationResponse": {
"type": "object",
"required": [
"status",
- "message"
+ "id"
],
- "description": "Error response from the Apify scraper results endpoint",
"properties": {
"status": {
"type": "string",
"enum": [
- "error"
+ "success"
],
- "description": "Status indicating an error occurred"
+ "description": "Status of the request"
},
- "message": {
+ "id": {
"type": "string",
- "description": "Error message describing what went wrong",
- "example": "runId is required"
+ "format": "uuid",
+ "description": "UUID of the created artist-organization link"
}
}
},
- "ArtistSocialsScrapeResponse": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ApifyRunResult"
- },
- "description": "Array of Apify run results, one for each social profile scraped"
- },
- "ArtistProfileSocialProfile": {
+ "SpotifyImage": {
"type": "object",
"properties": {
- "id": {
- "type": "string",
- "description": "Unique identifier for the social profile"
- },
- "username": {
- "type": "string",
- "description": "Username on the platform"
- },
- "profile_url": {
- "type": "string",
- "description": "Direct URL to the profile"
- },
- "avatar": {
- "type": "string",
- "nullable": true,
- "description": "URL to the profile avatar image"
- },
- "bio": {
+ "url": {
"type": "string",
- "nullable": true,
- "description": "Profile biography or description"
- },
- "follower_count": {
- "type": "integer",
- "nullable": true,
- "description": "Number of followers on this platform"
+ "description": "The source URL of the image"
},
- "following_count": {
+ "height": {
"type": "integer",
"nullable": true,
- "description": "Number of accounts followed on this platform"
+ "description": "The image height in pixels"
},
- "post_count": {
+ "width": {
"type": "integer",
"nullable": true,
- "description": "Number of posts on this platform"
- },
- "region": {
+ "description": "The image width in pixels"
+ }
+ }
+ },
+ "SpotifyExternalUrls": {
+ "type": "object",
+ "properties": {
+ "spotify": {
"type": "string",
- "nullable": true,
- "description": "Geographic region of the profile"
- },
- "updated_at": {
+ "description": "The Spotify URL for the object"
+ }
+ }
+ },
+ "SpotifyFollowers": {
+ "type": "object",
+ "properties": {
+ "href": {
"type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the profile was last updated"
+ "nullable": true,
+ "description": "This will always be set to null"
+ },
+ "total": {
+ "type": "integer",
+ "description": "The total number of followers"
}
}
},
- "ArtistProfile": {
+ "SpotifyArtistObject": {
"type": "object",
"properties": {
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "followers": {
+ "$ref": "#/components/schemas/SpotifyFollowers"
+ },
+ "genres": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "A list of the genres the artist is associated with"
+ },
+ "href": {
+ "type": "string",
+ "description": "A link to the Web API endpoint providing full details"
+ },
"id": {
"type": "string",
- "description": "Unique identifier for the artist"
+ "description": "The Spotify ID for the artist"
},
- "profiles": {
+ "images": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ArtistProfileSocialProfile"
+ "$ref": "#/components/schemas/SpotifyImage"
},
- "description": "List of social media profiles"
- },
- "total_followers": {
- "type": "integer",
- "description": "Sum of followers across all platforms"
+ "description": "Images of the artist in various sizes"
},
- "total_following": {
- "type": "integer",
- "description": "Sum of following across all platforms"
+ "name": {
+ "type": "string",
+ "description": "The name of the artist"
},
- "total_posts": {
+ "popularity": {
"type": "integer",
- "description": "Sum of posts across all platforms"
+ "description": "The popularity of the artist (0-100)"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the data was last updated"
- }
- }
- },
- "ArtistProfileResponse": {
- "type": "object",
- "required": [
- "status",
- "profile"
- ],
- "properties": {
- "status": {
+ "type": {
"type": "string",
"enum": [
- "success"
+ "artist"
],
- "description": "Status of the request"
+ "description": "The object type, always 'artist'"
},
- "profile": {
- "$ref": "#/components/schemas/ArtistProfile",
- "description": "The artist's comprehensive profile information"
+ "uri": {
+ "type": "string",
+ "description": "The Spotify URI for the artist"
}
}
},
- "ArtistProfileErrorResponse": {
+ "SpotifySimplifiedArtist": {
"type": "object",
- "required": [
- "status",
- "message"
- ],
"properties": {
- "status": {
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "href": {
+ "type": "string",
+ "description": "A link to the Web API endpoint providing full details"
+ },
+ "id": {
+ "type": "string",
+ "description": "The Spotify ID for the artist"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the artist"
+ },
+ "type": {
"type": "string",
"enum": [
- "error"
+ "artist"
],
- "description": "Status of the request"
+ "description": "The object type, always 'artist'"
},
- "message": {
+ "uri": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "The Spotify URI for the artist"
}
}
},
- "ChatRoom": {
+ "SpotifyArtistsPaginated": {
"type": "object",
"properties": {
- "id": {
+ "href": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the chat room"
+ "description": "A link to the Web API endpoint returning the full result"
},
- "account_id": {
- "type": "string",
- "format": "uuid",
- "nullable": true,
- "description": "UUID of the associated account (can be null if not set)"
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifyArtistObject"
+ },
+ "description": "List of artist objects"
},
- "topic": {
+ "limit": {
+ "type": "integer",
+ "description": "The maximum number of items in the response"
+ },
+ "next": {
"type": "string",
"nullable": true,
- "description": "Optional topic or description of the room (null if not provided)"
+ "description": "URL to the next page of items"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of the last update to the room"
+ "offset": {
+ "type": "integer",
+ "description": "The offset of the items returned"
},
- "artist_id": {
+ "previous": {
"type": "string",
- "format": "uuid",
"nullable": true,
- "description": "UUID of the associated artist account (null when not applicable)"
+ "description": "URL to the previous page of items"
+ },
+ "total": {
+ "type": "integer",
+ "description": "The total number of items available"
}
}
},
- "GetChatsResponse": {
+ "SpotifySearchResponse": {
"type": "object",
- "required": [
- "status",
- "chats"
- ],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "artists": {
+ "$ref": "#/components/schemas/SpotifyArtistsPaginated",
+ "description": "Search results for artists (if type includes artist)"
},
- "chats": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ChatRoom"
- },
- "description": "Array of chat room objects"
+ "albums": {
+ "type": "object",
+ "description": "Search results for albums (if type includes album)"
+ },
+ "tracks": {
+ "type": "object",
+ "description": "Search results for tracks (if type includes track)"
+ },
+ "playlists": {
+ "type": "object",
+ "description": "Search results for playlists (if type includes playlist)"
}
}
},
- "GetChatsErrorResponse": {
+ "SpotifyGetArtistResponse": {
"type": "object",
- "required": [
- "status",
- "error"
- ],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
+ "artist": {
+ "$ref": "#/components/schemas/SpotifyArtistObject",
+ "nullable": true,
+ "description": "The Spotify artist object (null if error)"
},
"error": {
- "type": "string",
- "description": "Error message describing what went wrong"
+ "type": "object",
+ "nullable": true,
+ "description": "Error object if request failed (null if successful)"
}
}
},
- "GetChatArtistResponse": {
+ "SpotifySimplifiedAlbum": {
"type": "object",
- "required": [
- "status",
- "room_id",
- "artist_id",
- "artist_exists"
- ],
"properties": {
- "status": {
+ "album_type": {
"type": "string",
"enum": [
- "success"
+ "album",
+ "single",
+ "compilation"
],
- "description": "Status of the request"
+ "description": "The type of the album"
},
- "room_id": {
+ "total_tracks": {
+ "type": "integer",
+ "description": "The number of tracks in the album"
+ },
+ "available_markets": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Markets in which the album is available"
+ },
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "href": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the chat room"
+ "description": "A link to the Web API endpoint providing full details"
},
- "artist_id": {
+ "id": {
"type": "string",
- "format": "uuid",
- "nullable": true,
- "description": "UUID of the artist account associated with the chat, or null when no artist is linked"
+ "description": "The Spotify ID for the album"
},
- "artist_exists": {
- "type": "boolean",
- "description": "Whether an artist is linked to the chat room"
- }
- }
- },
- "GetChatArtistErrorResponse": {
- "type": "object",
- "required": [
- "status",
- "error"
- ],
- "properties": {
- "status": {
+ "images": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifyImage"
+ },
+ "description": "The cover art for the album in various sizes"
+ },
+ "name": {
"type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
+ "description": "The name of the album"
},
- "error": {
+ "release_date": {
"type": "string",
- "description": "Error message describing what went wrong"
- }
- }
- },
- "GetChatSegmentResponse": {
- "type": "object",
- "required": [
- "status",
- "room_id",
- "segment_id",
- "segment_exists"
- ],
- "properties": {
- "status": {
+ "description": "The date the album was first released"
+ },
+ "release_date_precision": {
"type": "string",
"enum": [
- "success"
+ "year",
+ "month",
+ "day"
],
- "description": "Status of the request"
+ "description": "The precision with which release_date value is known"
},
- "room_id": {
+ "restrictions": {
+ "type": "object",
+ "properties": {
+ "reason": {
+ "type": "string",
+ "description": "The reason for the restriction"
+ }
+ },
+ "description": "Included when a content restriction is applied"
+ },
+ "type": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the chat room"
+ "enum": [
+ "album"
+ ],
+ "description": "The object type, always 'album'"
},
- "segment_id": {
+ "uri": {
"type": "string",
- "format": "uuid",
- "nullable": true,
- "description": "UUID of the segment associated with the chat, or null when no segment is linked"
+ "description": "The Spotify URI for the album"
},
- "segment_exists": {
- "type": "boolean",
- "description": "Whether a segment is linked to the chat room"
- }
- }
- },
- "GetChatSegmentErrorResponse": {
- "type": "object",
- "required": [
- "status",
- "error"
- ],
- "properties": {
- "status": {
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifySimplifiedArtist"
+ },
+ "description": "The artists of the album"
+ },
+ "album_group": {
"type": "string",
"enum": [
- "error"
+ "album",
+ "single",
+ "compilation",
+ "appears_on"
],
- "description": "Status of the request"
- },
- "error": {
- "type": "string",
- "description": "Error message describing what went wrong"
+ "description": "The field to distinguish albums by various groups"
}
}
},
- "ChatMessage": {
+ "SpotifyArtistAlbumsResponse": {
"type": "object",
- "required": [
- "id",
- "room_id",
- "content",
- "updated_at"
- ],
"properties": {
- "id": {
+ "href": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the memory message"
+ "description": "A link to the Web API endpoint returning the full result"
},
- "room_id": {
+ "limit": {
+ "type": "integer",
+ "description": "The maximum number of items in the response"
+ },
+ "next": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the parent chat room"
+ "nullable": true,
+ "description": "URL to the next page of items"
},
- "content": {
- "type": "object",
- "description": "Structured message payload stored for the memory"
+ "offset": {
+ "type": "integer",
+ "description": "The offset of the items returned"
},
- "updated_at": {
+ "previous": {
"type": "string",
- "format": "date-time",
- "description": "ISO timestamp of the memory update"
- }
- }
- },
- "GetChatMessagesResponse": {
- "type": "object",
- "required": [
- "data"
- ],
- "properties": {
- "data": {
+ "nullable": true,
+ "description": "URL to the previous page of items"
+ },
+ "total": {
+ "type": "integer",
+ "description": "The total number of items available"
+ },
+ "items": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ChatMessage"
+ "$ref": "#/components/schemas/SpotifySimplifiedAlbum"
},
- "description": "Chronologically ordered list of messages for the chat"
+ "description": "Array of simplified album objects"
}
}
},
- "GetChatMessagesErrorResponse": {
+ "SpotifyTrack": {
"type": "object",
- "required": [
- "status",
- "error"
- ],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
+ "album": {
+ "$ref": "#/components/schemas/SpotifySimplifiedAlbum",
+ "description": "The album the track appears on"
},
- "error": {
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifySimplifiedArtist"
+ },
+ "description": "Artists who performed the track"
+ },
+ "available_markets": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Markets in which the track is available"
+ },
+ "disc_number": {
+ "type": "integer",
+ "description": "Disc number the track is on"
+ },
+ "duration_ms": {
+ "type": "integer",
+ "description": "Track length in milliseconds"
+ },
+ "explicit": {
+ "type": "boolean",
+ "description": "Whether the track has explicit lyrics"
+ },
+ "external_ids": {
+ "type": "object",
+ "properties": {
+ "isrc": {
+ "type": "string",
+ "description": "International Standard Recording Code"
+ },
+ "ean": {
+ "type": "string",
+ "description": "International Article Number"
+ },
+ "upc": {
+ "type": "string",
+ "description": "Universal Product Code"
+ }
+ },
+ "description": "Known external IDs for the track"
+ },
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "href": {
"type": "string",
- "description": "Error message describing what went wrong"
- }
- }
- },
- "CopyChatMessagesRequest": {
- "type": "object",
- "required": [
- "targetChatId"
- ],
- "properties": {
- "targetChatId": {
+ "description": "Link to the Web API endpoint with full details"
+ },
+ "id": {
"type": "string",
- "format": "uuid",
- "description": "Target chat room UUID to receive the copied messages."
+ "description": "Spotify ID for the track"
},
- "clearExisting": {
+ "is_playable": {
"type": "boolean",
- "default": true,
- "description": "When true, existing messages in the target chat are deleted before copy."
- }
- }
- },
- "CopyChatMessagesResponse": {
- "type": "object",
- "required": [
- "status",
- "source_chat_id",
- "target_chat_id",
- "copied_count",
- "cleared_existing"
- ],
- "properties": {
- "status": {
- "type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "description": "If true, the track is playable in the given market"
+ },
+ "linked_from": {
+ "type": "object",
+ "description": "Information about the originally requested track when track relinking is applied"
},
- "source_chat_id": {
- "type": "string",
- "format": "uuid",
- "description": "Source chat room UUID."
+ "restrictions": {
+ "type": "object",
+ "properties": {
+ "reason": {
+ "type": "string",
+ "description": "The reason for the restriction"
+ }
+ },
+ "description": "Content restriction information"
},
- "target_chat_id": {
+ "name": {
"type": "string",
- "format": "uuid",
- "description": "Target chat room UUID."
+ "description": "Track name"
},
- "copied_count": {
+ "popularity": {
"type": "integer",
- "description": "Number of messages copied from source to target."
+ "description": "Popularity score (0-100)"
},
- "cleared_existing": {
- "type": "boolean",
- "description": "Whether existing target messages were deleted before copy."
- }
- }
- },
- "CopyChatMessagesErrorResponse": {
- "type": "object",
- "required": [
- "status",
- "error"
- ],
- "properties": {
- "status": {
+ "preview_url": {
"type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
+ "nullable": true,
+ "description": "URL to a 30 second preview, if available"
},
- "error": {
- "type": "string",
- "description": "Error message describing what went wrong."
- }
- }
- },
- "DeleteTrailingChatMessagesResponse": {
- "type": "object",
- "required": [
- "status",
- "chat_id",
- "from_message_id"
- ],
- "properties": {
- "status": {
+ "track_number": {
+ "type": "integer",
+ "description": "Track number on the album"
+ },
+ "type": {
"type": "string",
"enum": [
- "success"
+ "track"
],
- "description": "Status of the request"
+ "description": "The object type, always 'track'"
},
- "chat_id": {
+ "uri": {
"type": "string",
- "format": "uuid",
- "description": "The chat UUID where deletion was applied."
+ "description": "The Spotify URI for the track"
},
- "from_message_id": {
- "type": "string",
- "format": "uuid",
- "description": "The message UUID used as the trailing deletion boundary."
+ "is_local": {
+ "type": "boolean",
+ "description": "Whether the track is from a local file"
}
}
},
- "DeleteTrailingChatMessagesErrorResponse": {
+ "SpotifyArtistTopTracksResponse": {
"type": "object",
- "required": [
- "status",
- "error"
- ],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
- },
- "error": {
- "type": "string",
- "description": "Error message describing what went wrong."
- },
- "missing_fields": {
+ "tracks": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/SpotifyTrack"
},
- "description": "List of missing or invalid parameter fields (when validation fails)."
+ "description": "Array of track objects"
}
}
},
- "CreateChatRequest": {
+ "SpotifySimplifiedTrack": {
"type": "object",
"properties": {
- "artistId": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the artist account the chat is associated with"
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifySimplifiedArtist"
+ },
+ "description": "The artists who performed the track"
},
- "chatId": {
+ "available_markets": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Markets in which the track is available"
+ },
+ "disc_number": {
+ "type": "integer",
+ "description": "Disc number the track is on"
+ },
+ "duration_ms": {
+ "type": "integer",
+ "description": "Track length in milliseconds"
+ },
+ "explicit": {
+ "type": "boolean",
+ "description": "Whether the track has explicit lyrics"
+ },
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "href": {
"type": "string",
- "format": "uuid",
- "description": "UUID for the new chat (client-generated). If not provided, one will be generated automatically."
+ "description": "Link to the Web API endpoint"
},
- "accountId": {
+ "id": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the account to create the chat for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the chat is created for the API key's own account."
+ "description": "Spotify ID for the track"
},
- "topic": {
+ "is_playable": {
+ "type": "boolean",
+ "description": "If true, the track is playable"
+ },
+ "linked_from": {
+ "type": "object",
+ "description": "Track relinking info"
+ },
+ "restrictions": {
+ "type": "object",
+ "properties": {
+ "reason": {
+ "type": "string"
+ }
+ }
+ },
+ "name": {
"type": "string",
- "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
- }
- }
- },
- "CreateChatResponse": {
- "type": "object",
- "required": [
- "status",
- "chat"
- ],
- "properties": {
- "status": {
+ "description": "Track name"
+ },
+ "preview_url": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "nullable": true,
+ "description": "URL to a 30 second preview"
},
- "chat": {
- "$ref": "#/components/schemas/ChatRoom",
- "description": "The created chat room object"
- }
- }
- },
- "CreateChatErrorResponse": {
- "type": "object",
- "required": [
- "status",
- "message"
- ],
- "properties": {
- "status": {
+ "track_number": {
+ "type": "integer",
+ "description": "Track number on the album"
+ },
+ "type": {
"type": "string",
"enum": [
- "error"
- ],
- "description": "Status of the request"
+ "track"
+ ]
},
- "message": {
+ "uri": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "Spotify URI for the track"
+ },
+ "is_local": {
+ "type": "boolean",
+ "description": "Whether from a local file"
}
}
},
- "UpdateChatRequest": {
+ "SpotifyAlbumTracks": {
"type": "object",
- "required": [
- "chatId",
- "topic"
- ],
"properties": {
- "chatId": {
+ "href": {
"type": "string",
- "format": "uuid",
- "description": "The unique identifier (UUID) of the chat room to update"
+ "description": "A link to the Web API endpoint"
},
- "topic": {
+ "limit": {
+ "type": "integer",
+ "description": "The maximum number of items in the response"
+ },
+ "next": {
"type": "string",
- "minLength": 3,
- "maxLength": 50,
- "description": "The new display name for the chat room. Must be between 3 and 50 characters."
+ "nullable": true,
+ "description": "URL to the next page of items"
+ },
+ "offset": {
+ "type": "integer",
+ "description": "The offset of the items returned"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "description": "URL to the previous page"
+ },
+ "total": {
+ "type": "integer",
+ "description": "Total number of items available"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifySimplifiedTrack"
+ },
+ "description": "Array of simplified track objects"
}
}
},
- "UpdateChatResponse": {
+ "SpotifyCopyright": {
"type": "object",
- "required": [
- "status",
- "chat"
- ],
"properties": {
- "status": {
+ "text": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "description": "The copyright text"
},
- "chat": {
- "$ref": "#/components/schemas/ChatRoom",
- "description": "The updated chat room object"
+ "type": {
+ "type": "string",
+ "description": "The type of copyright"
}
}
},
- "UpdateChatErrorResponse": {
+ "SpotifyAlbum": {
"type": "object",
- "required": [
- "status",
- "message"
- ],
"properties": {
- "status": {
+ "album_type": {
"type": "string",
"enum": [
- "error"
+ "album",
+ "single",
+ "compilation"
],
- "description": "Status of the request"
+ "description": "The type of the album"
},
- "message": {
+ "total_tracks": {
+ "type": "integer",
+ "description": "The number of tracks in the album"
+ },
+ "available_markets": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Markets in which the album is available"
+ },
+ "external_urls": {
+ "$ref": "#/components/schemas/SpotifyExternalUrls"
+ },
+ "href": {
"type": "string",
- "description": "Error message describing what went wrong"
- }
- }
- },
- "DeleteChatRequest": {
- "type": "object",
- "required": [
- "id"
- ],
- "properties": {
+ "description": "A link to the Web API endpoint providing full details"
+ },
"id": {
"type": "string",
- "format": "uuid",
- "description": "The unique identifier (UUID) of the chat room to delete."
- }
- }
- },
- "DeleteChatResponse": {
- "type": "object",
- "required": [
- "status",
- "id",
- "message"
- ],
- "properties": {
- "status": {
+ "description": "The Spotify ID for the album"
+ },
+ "images": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifyImage"
+ },
+ "description": "The cover art for the album in various sizes"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the album"
+ },
+ "release_date": {
+ "type": "string",
+ "description": "The date the album was first released"
+ },
+ "release_date_precision": {
"type": "string",
"enum": [
- "success"
+ "year",
+ "month",
+ "day"
],
- "description": "Status of the request"
+ "description": "The precision with which release_date value is known"
},
- "id": {
+ "restrictions": {
+ "type": "object",
+ "properties": {
+ "reason": {
+ "type": "string"
+ }
+ },
+ "description": "Included when a content restriction is applied"
+ },
+ "type": {
"type": "string",
- "format": "uuid",
- "description": "The UUID of the deleted chat room."
+ "enum": [
+ "album"
+ ],
+ "description": "The object type, always 'album'"
},
- "message": {
+ "uri": {
"type": "string",
- "description": "Success message describing the deletion result."
+ "description": "The Spotify URI for the album"
+ },
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifySimplifiedArtist"
+ },
+ "description": "The artists of the album"
+ },
+ "tracks": {
+ "$ref": "#/components/schemas/SpotifyAlbumTracks",
+ "description": "The tracks of the album"
+ },
+ "copyrights": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SpotifyCopyright"
+ },
+ "description": "Copyright statements of the album"
+ },
+ "external_ids": {
+ "type": "object",
+ "properties": {
+ "isrc": {
+ "type": "string"
+ },
+ "ean": {
+ "type": "string"
+ },
+ "upc": {
+ "type": "string"
+ }
+ },
+ "description": "Known external IDs for the album"
+ },
+ "genres": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Deprecated. Always empty."
+ },
+ "label": {
+ "type": "string",
+ "description": "The label associated with the album"
+ },
+ "popularity": {
+ "type": "integer",
+ "description": "Popularity of the album (0-100)"
}
}
},
- "DeleteChatErrorResponse": {
+ "SpotifyErrorResponse": {
"type": "object",
- "required": [
- "status",
- "error"
- ],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
- },
"error": {
- "type": "string",
- "description": "Error message describing what went wrong."
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "integer",
+ "description": "HTTP status code"
+ },
+ "message": {
+ "type": "string",
+ "description": "Error message"
+ }
+ },
+ "description": "Error details"
}
}
},
- "UIMessage": {
+ "TwitterPhoto": {
"type": "object",
- "description": "A message in the chat conversation. See https://ai-sdk.dev/docs/reference/ai-sdk-core/ui-message for details.",
"properties": {
"id": {
"type": "string",
- "description": "Unique identifier for the message"
- },
- "role": {
- "type": "string",
- "enum": [
- "user",
- "assistant",
- "system"
- ],
- "description": "The role of the message sender"
+ "description": "Photo ID"
},
- "content": {
+ "url": {
"type": "string",
- "description": "The text content of the message"
+ "description": "URL of the photo"
}
}
},
- "ChatGenerateRequest": {
+ "TwitterVideo": {
"type": "object",
- "description": "Request body for chat generation. Exactly one of 'prompt' or 'messages' must be provided.",
"properties": {
- "prompt": {
- "type": "string",
- "description": "Single text prompt for the assistant. Required if 'messages' is not provided."
- },
- "messages": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/UIMessage"
- },
- "description": "Array of UIMessage objects for context. Required if 'prompt' is not provided."
- },
- "artistId": {
- "type": "string",
- "format": "uuid",
- "description": "The unique identifier of the artist (optional)"
- },
- "model": {
+ "id": {
"type": "string",
- "description": "The AI model to use for text generation (optional)",
- "example": "openai/gpt-5-mini"
- },
- "excludeTools": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Array of tool names to exclude from execution",
- "example": [
- "create_scheduled_actions"
- ]
+ "description": "Video ID"
},
- "roomId": {
+ "preview": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the chat room. If not provided, one will be generated automatically."
+ "description": "URL of the video preview image"
},
- "topic": {
+ "url": {
"type": "string",
- "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). Only applies when creating a new room - ignored if room already exists. To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
+ "description": "URL of the video"
}
}
},
- "ContentPart": {
+ "Tweet": {
"type": "object",
- "description": "A part of the response content. See https://ai-sdk.dev/docs/reference/ai-sdk-core/generate-text#content for details.",
"properties": {
- "type": {
+ "id": {
"type": "string",
- "enum": [
- "text",
- "tool-call",
- "tool-result"
- ],
- "description": "The type of content part"
+ "description": "Tweet ID"
},
"text": {
"type": "string",
- "description": "The text content (present when type is 'text')"
- }
- }
- },
- "ChatGenerateUsage": {
- "type": "object",
- "description": "Token usage information with detailed breakdown",
- "properties": {
- "inputTokens": {
- "type": "integer",
- "description": "Number of input tokens processed"
+ "description": "Tweet text content"
},
- "outputTokens": {
+ "username": {
+ "type": "string",
+ "description": "Username of the tweet author"
+ },
+ "timestamp": {
"type": "integer",
- "description": "Number of output tokens generated"
+ "description": "Unix timestamp (ms) of when the tweet was posted"
},
- "totalTokens": {
+ "createdAt": {
+ "type": "string",
+ "description": "ISO timestamp of when the tweet was posted"
+ },
+ "isReply": {
+ "type": "boolean",
+ "description": "Whether the tweet is a reply"
+ },
+ "isRetweet": {
+ "type": "boolean",
+ "description": "Whether the tweet is a retweet"
+ },
+ "likes": {
"type": "integer",
- "description": "Total tokens used (input + output)"
+ "description": "Number of likes"
},
- "reasoningTokens": {
+ "retweetCount": {
"type": "integer",
- "description": "Number of reasoning tokens used"
+ "description": "Number of retweets"
},
- "cachedInputTokens": {
+ "replies": {
"type": "integer",
- "description": "Number of cached input tokens"
- }
- }
- },
- "ChatGenerateResponseMeta": {
- "type": "object",
- "description": "Additional response metadata",
- "properties": {
- "messages": {
+ "description": "Number of replies"
+ },
+ "photos": {
"type": "array",
"items": {
- "type": "object"
+ "$ref": "#/components/schemas/TwitterPhoto"
},
- "description": "Response messages"
- },
- "headers": {
- "type": "object",
- "description": "Response headers"
+ "description": "Array of photo objects"
},
- "body": {
- "type": "object",
- "description": "Response body"
- }
- }
- },
- "ChatGenerateResponse": {
- "type": "object",
- "description": "Response from the chat generation endpoint",
- "properties": {
- "text": {
+ "videos": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ContentPart"
+ "$ref": "#/components/schemas/TwitterVideo"
},
- "description": "Array of content parts from the AI model response"
- },
- "reasoningText": {
- "type": "string",
- "nullable": true,
- "description": "Optional reasoning or explanation for the response"
+ "description": "Array of video objects"
},
- "sources": {
+ "urls": {
"type": "array",
"items": {
- "type": "object"
+ "type": "string"
},
- "description": "Optional array of sources used for the response"
+ "description": "Array of URLs included in the tweet"
},
- "finishReason": {
+ "permanentUrl": {
"type": "string",
- "description": "The reason why the generation finished",
- "example": "stop"
+ "description": "Permanent URL to the tweet"
},
- "usage": {
- "$ref": "#/components/schemas/ChatGenerateUsage",
- "description": "Token usage information"
+ "quotedStatusId": {
+ "type": "string",
+ "description": "ID of the quoted tweet (if applicable)"
},
- "response": {
- "$ref": "#/components/schemas/ChatGenerateResponseMeta",
- "description": "Additional response metadata"
+ "inReplyToStatusId": {
+ "type": "string",
+ "description": "ID of the tweet this is replying to (if applicable)"
+ },
+ "hashtags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Array of hashtags in the tweet"
}
}
},
- "ChatGenerateErrorResponse": {
+ "TwitterSearchResponse": {
"type": "object",
- "required": [
- "status",
- "message"
- ],
"properties": {
"status": {
"type": "string",
+ "description": "Status of the request",
"enum": [
+ "success",
"error"
- ],
- "description": "Status of the request"
+ ]
},
- "message": {
- "type": "string",
- "description": "Error message describing what went wrong"
+ "tweets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Tweet"
+ },
+ "description": "List of tweet objects"
}
}
},
- "ChatStreamRequest": {
+ "TwitterTrendsResponse": {
"type": "object",
- "description": "Request body for chat streaming. Exactly one of 'prompt' or 'messages' must be provided.",
"properties": {
- "prompt": {
- "type": "string",
- "description": "Single text prompt for the assistant. Required if 'messages' is not provided."
- },
- "messages": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/UIMessage"
- },
- "description": "Array of UIMessage objects for context. Required if 'prompt' is not provided."
- },
- "artistId": {
- "type": "string",
- "format": "uuid",
- "description": "The unique identifier of the artist (optional)"
- },
- "model": {
+ "status": {
"type": "string",
- "description": "The AI model to use for text generation (optional)",
- "example": "openai/gpt-5-mini"
+ "description": "Status of the request",
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "excludeTools": {
+ "trends": {
"type": "array",
"items": {
"type": "string"
},
- "description": "Array of tool names to exclude from execution",
- "example": [
- "create_scheduled_actions"
- ]
- },
- "roomId": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the chat room. If not provided, one will be generated automatically."
- },
- "topic": {
- "type": "string",
- "description": "Topic name for the new chat room (e.g., 'Pulse Feb 2'). Only applies when creating a new room - ignored if room already exists. To edit the topic of an existing room, use [PATCH /api/chats](/api-reference/chat/update)."
+ "description": "List of current trending topics on Twitter"
}
}
},
- "ChatStreamErrorResponse": {
+ "TwitterErrorResponse": {
"type": "object",
- "required": [
- "status",
- "message"
- ],
"properties": {
"status": {
"type": "string",
@@ -8228,63 +10466,98 @@
},
"message": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "Error message"
}
}
},
- "Organization": {
+ "SocialScrapeRequest": {
+ "type": "object",
+ "required": [
+ "social_id"
+ ],
+ "properties": {
+ "social_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the social profile to scrape. Obtain this from the Get Artist Socials API."
+ }
+ }
+ },
+ "SocialPost": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the membership record"
+ "description": "UUID of the social's social_posts record"
},
- "organization_id": {
+ "post_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the organization account"
+ "description": "UUID of the social's posts record"
},
- "organization_name": {
+ "social_id": {
"type": "string",
- "description": "Display name of the organization"
+ "format": "uuid",
+ "description": "UUID of the social's socials record"
},
- "organization_image": {
+ "post_url": {
"type": "string",
- "nullable": true,
- "description": "Organization logo/image URL"
+ "description": "Direct URL to the post on the platform"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the post data was last updated"
+ }
+ }
+ },
+ "SocialPostsPagination": {
+ "type": "object",
+ "properties": {
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of posts available"
+ },
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "Number of posts per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "GetOrganizationsResponse": {
+ "SocialPostsResponse": {
"type": "object",
- "required": [
- "status",
- "organizations"
- ],
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
+ "success",
+ "error"
],
"description": "Status of the request"
},
- "organizations": {
+ "posts": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/Organization"
+ "$ref": "#/components/schemas/SocialPost"
},
- "description": "List of organizations the account belongs to"
+ "description": "List of social media posts"
+ },
+ "pagination": {
+ "$ref": "#/components/schemas/SocialPostsPagination"
}
}
},
- "OrganizationsErrorResponse": {
+ "SocialErrorResponse": {
"type": "object",
- "required": [
- "status",
- "message"
- ],
"properties": {
"status": {
"type": "string",
@@ -8295,1053 +10568,861 @@
},
"message": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "Error message"
}
}
},
- "CreateOrganizationRequest": {
+ "GeneratedImage": {
"type": "object",
- "required": [
- "name",
- "accountId"
- ],
+ "description": "A generated image file from the AI model",
"properties": {
- "name": {
+ "base64": {
"type": "string",
- "description": "The name of the organization to create",
- "example": "My New Label"
+ "description": "Image file as a base64 encoded string"
},
- "accountId": {
- "type": "string",
- "format": "uuid",
- "description": "The account ID of the creator",
- "example": "123e4567-e89b-12d3-a456-426614174000"
- }
- }
- },
- "CreatedOrganization": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the new organization account"
+ "uint8Array": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ },
+ "description": "Image file as a Uint8Array (represented as array of numbers in JSON)"
},
- "name": {
+ "mediaType": {
"type": "string",
- "description": "Name of the organization"
+ "description": "The IANA media type of the file (e.g., 'image/png', 'image/jpeg')"
}
}
},
- "CreateOrganizationResponse": {
+ "ImageResponseMeta": {
"type": "object",
- "required": [
- "status",
- "organization"
- ],
+ "description": "Response metadata from the AI provider",
"properties": {
- "status": {
+ "finishReason": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
- },
- "organization": {
- "$ref": "#/components/schemas/CreatedOrganization",
- "description": "The created organization"
+ "description": "Reason the generation finished (e.g., 'stop')"
}
}
},
- "CreateWorkspaceRequest": {
+ "ImageProviderMetadata": {
"type": "object",
+ "description": "Metadata from the AI provider about the generation",
"properties": {
- "name": {
- "type": "string",
- "description": "Name of the workspace (defaults to \"Untitled\")"
- },
- "account_id": {
+ "model": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the account to create the workspace for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, the workspace is created for the API key's own account."
+ "description": "The AI model used for generation (e.g., 'dall-e-3', 'gpt-image-1')"
},
- "organization_id": {
+ "size": {
"type": "string",
- "format": "uuid",
- "description": "Organization to link the workspace to"
+ "description": "The size of the generated image (e.g., '1024x1024')"
}
}
},
- "CreateWorkspaceResponse": {
+ "ImageUsage": {
"type": "object",
- "required": [
- "workspace"
- ],
+ "description": "Token usage information for the image generation",
"properties": {
- "workspace": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "format": "uuid"
- },
- "name": {
- "type": "string"
- },
- "account_id": {
- "type": "string",
- "format": "uuid"
- },
- "isWorkspace": {
- "type": "boolean"
- }
- }
+ "promptTokens": {
+ "type": "integer",
+ "description": "Number of tokens used in the prompt"
+ },
+ "completionTokens": {
+ "type": "integer",
+ "description": "Number of tokens used in the completion (typically 0 for image generation)"
+ },
+ "totalTokens": {
+ "type": "integer",
+ "description": "Total tokens used"
}
}
},
- "AddArtistToOrganizationRequest": {
+ "ArweaveTransaction": {
"type": "object",
- "required": [
- "artistId",
- "organizationId"
- ],
+ "description": "Arweave transaction object for the stored image",
"properties": {
- "artistId": {
+ "id": {
"type": "string",
- "format": "uuid",
- "description": "The account ID of the artist to add",
- "example": "artist-account-uuid"
+ "description": "Unique identifier for the Arweave transaction"
},
- "organizationId": {
+ "last_tx": {
"type": "string",
- "format": "uuid",
- "description": "The account ID of the organization",
- "example": "org-account-uuid"
- }
- }
- },
- "AddArtistToOrganizationResponse": {
- "type": "object",
- "required": [
- "status",
- "id"
- ],
- "properties": {
- "status": {
+ "description": "Last transaction reference"
+ },
+ "owner": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "description": "Owner address of the transaction"
},
- "id": {
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ },
+ "description": "Tags associated with the transaction"
+ },
+ "target": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the created artist-organization link"
- }
- }
- },
- "SpotifyImage": {
- "type": "object",
- "properties": {
- "url": {
+ "description": "Target address (empty for data transactions)"
+ },
+ "quantity": {
"type": "string",
- "description": "The source URL of the image"
+ "description": "Amount transferred (typically '0' for data transactions)"
},
- "height": {
- "type": "integer",
- "nullable": true,
- "description": "The image height in pixels"
+ "data": {
+ "type": "string",
+ "description": "Transaction data (may be empty in response)"
},
- "width": {
+ "reward": {
+ "type": "string",
+ "description": "Mining reward for the transaction"
+ },
+ "signature": {
+ "type": "string",
+ "description": "Transaction signature"
+ },
+ "format": {
"type": "integer",
- "nullable": true,
- "description": "The image width in pixels"
+ "description": "Transaction format version"
}
}
},
- "SpotifyExternalUrls": {
+ "InProcessMoment": {
"type": "object",
+ "description": "In Process moment metadata for provenance and ownership tracking",
"properties": {
- "spotify": {
+ "contractAddress": {
"type": "string",
- "description": "The Spotify URL for the object"
- }
- }
- },
- "SpotifyFollowers": {
- "type": "object",
- "properties": {
- "href": {
+ "description": "Smart contract address for the moment"
+ },
+ "tokenId": {
"type": "string",
- "nullable": true,
- "description": "This will always be set to null"
+ "description": "Token ID of the minted moment"
},
- "total": {
+ "hash": {
+ "type": "string",
+ "description": "Transaction hash of the moment mint"
+ },
+ "chainId": {
"type": "integer",
- "description": "The total number of followers"
+ "description": "Chain ID (e.g., 8453 for Base)"
}
}
},
- "SpotifyArtistObject": {
+ "ImageGenerationResponse": {
"type": "object",
+ "description": "Response from the image generation endpoint, extending Experimental_GenerateImageResult from the AI SDK",
"properties": {
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "followers": {
- "$ref": "#/components/schemas/SpotifyFollowers"
+ "images": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GeneratedImage"
+ },
+ "description": "Array of generated image objects"
},
- "genres": {
+ "warnings": {
"type": "array",
"items": {
"type": "string"
},
- "description": "A list of the genres the artist is associated with"
- },
- "href": {
- "type": "string",
- "description": "A link to the Web API endpoint providing full details"
- },
- "id": {
- "type": "string",
- "description": "The Spotify ID for the artist"
+ "description": "Array of warning messages, if any"
},
- "images": {
+ "responses": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SpotifyImage"
+ "$ref": "#/components/schemas/ImageResponseMeta"
},
- "description": "Images of the artist in various sizes"
+ "description": "Array of response metadata from the AI provider"
},
- "name": {
- "type": "string",
- "description": "The name of the artist"
+ "providerMetadata": {
+ "$ref": "#/components/schemas/ImageProviderMetadata"
},
- "popularity": {
- "type": "integer",
- "description": "The popularity of the artist (0-100)"
+ "usage": {
+ "$ref": "#/components/schemas/ImageUsage"
},
- "type": {
+ "imageUrl": {
"type": "string",
- "enum": [
- "artist"
- ],
- "description": "The object type, always 'artist'"
+ "description": "Permanent Arweave URL where the image is stored"
},
- "uri": {
+ "arweaveResult": {
+ "$ref": "#/components/schemas/ArweaveTransaction"
+ },
+ "moment": {
+ "$ref": "#/components/schemas/InProcessMoment"
+ }
+ }
+ },
+ "ImageGenerationErrorResponse": {
+ "type": "object",
+ "properties": {
+ "error": {
"type": "string",
- "description": "The Spotify URI for the artist"
+ "description": "Error message describing what went wrong"
}
}
},
- "SpotifySimplifiedArtist": {
+ "TranscribeAudioRequest": {
"type": "object",
+ "required": [
+ "audio_url",
+ "account_id",
+ "artist_account_id"
+ ],
"properties": {
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "href": {
+ "audio_url": {
"type": "string",
- "description": "A link to the Web API endpoint providing full details"
+ "description": "Public URL to the audio file (mp3, wav, m4a, webm)",
+ "example": "https://example.com/song.mp3"
},
- "id": {
+ "account_id": {
"type": "string",
- "description": "The Spotify ID for the artist"
+ "format": "uuid",
+ "description": "Owner account ID for file storage",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "name": {
+ "artist_account_id": {
"type": "string",
- "description": "The name of the artist"
+ "format": "uuid",
+ "description": "Artist account ID for file storage",
+ "example": "550e8400-e29b-41d4-a716-446655440001"
},
- "type": {
+ "title": {
"type": "string",
- "enum": [
- "artist"
- ],
- "description": "The object type, always 'artist'"
+ "description": "Optional title for the audio and transcription files",
+ "example": "My Song"
},
- "uri": {
- "type": "string",
- "description": "The Spotify URI for the artist"
+ "include_timestamps": {
+ "type": "boolean",
+ "description": "Whether to include timestamps in the markdown transcript",
+ "default": false
}
}
},
- "SpotifyArtistsPaginated": {
+ "TranscribeFileInfo": {
"type": "object",
"properties": {
- "href": {
+ "id": {
"type": "string",
- "description": "A link to the Web API endpoint returning the full result"
- },
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifyArtistObject"
- },
- "description": "List of artist objects"
- },
- "limit": {
- "type": "integer",
- "description": "The maximum number of items in the response"
+ "format": "uuid",
+ "description": "UUID of the file record in the database"
},
- "next": {
+ "fileName": {
"type": "string",
- "nullable": true,
- "description": "URL to the next page of items"
- },
- "offset": {
- "type": "integer",
- "description": "The offset of the items returned"
+ "description": "Name of the saved file"
},
- "previous": {
+ "storageKey": {
"type": "string",
- "nullable": true,
- "description": "URL to the previous page of items"
- },
- "total": {
- "type": "integer",
- "description": "The total number of items available"
+ "description": "Storage path in Supabase Storage"
}
}
},
- "SpotifySearchResponse": {
+ "TranscribeAudioResponse": {
"type": "object",
+ "required": [
+ "success",
+ "audioFile",
+ "transcriptFile",
+ "text"
+ ],
"properties": {
- "artists": {
- "$ref": "#/components/schemas/SpotifyArtistsPaginated",
- "description": "Search results for artists (if type includes artist)"
+ "success": {
+ "type": "boolean",
+ "description": "Whether the transcription was successful"
},
- "albums": {
- "type": "object",
- "description": "Search results for albums (if type includes album)"
+ "audioFile": {
+ "$ref": "#/components/schemas/TranscribeFileInfo",
+ "description": "Information about the saved audio file"
},
- "tracks": {
- "type": "object",
- "description": "Search results for tracks (if type includes track)"
+ "transcriptFile": {
+ "$ref": "#/components/schemas/TranscribeFileInfo",
+ "description": "Information about the saved transcript file"
},
- "playlists": {
- "type": "object",
- "description": "Search results for playlists (if type includes playlist)"
+ "text": {
+ "type": "string",
+ "description": "The full transcription text"
+ },
+ "language": {
+ "type": "string",
+ "description": "Detected language code (e.g., 'en', 'es', 'fr')"
}
}
},
- "SpotifyGetArtistResponse": {
+ "TranscribeAudioErrorResponse": {
"type": "object",
+ "required": [
+ "error"
+ ],
"properties": {
- "artist": {
- "$ref": "#/components/schemas/SpotifyArtistObject",
- "nullable": true,
- "description": "The Spotify artist object (null if error)"
- },
"error": {
- "type": "object",
- "nullable": true,
- "description": "Error object if request failed (null if successful)"
+ "type": "string",
+ "description": "Error message describing what went wrong"
}
}
},
- "SpotifySimplifiedAlbum": {
+ "SongArtist": {
"type": "object",
+ "description": "Artist associated with a song",
"properties": {
- "album_type": {
- "type": "string",
- "enum": [
- "album",
- "single",
- "compilation"
- ],
- "description": "The type of the album"
- },
- "total_tracks": {
- "type": "integer",
- "description": "The number of tracks in the album"
- },
- "available_markets": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Markets in which the album is available"
- },
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "href": {
- "type": "string",
- "description": "A link to the Web API endpoint providing full details"
- },
"id": {
"type": "string",
- "description": "The Spotify ID for the album"
- },
- "images": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifyImage"
- },
- "description": "The cover art for the album in various sizes"
+ "format": "uuid",
+ "description": "Unique identifier for the artist account"
},
"name": {
"type": "string",
- "description": "The name of the album"
+ "nullable": true,
+ "description": "Name of the artist (can be null)"
},
- "release_date": {
+ "timestamp": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Timestamp associated with the artist account (can be null)"
+ }
+ }
+ },
+ "Song": {
+ "type": "object",
+ "description": "A song with its metadata and associated artists",
+ "properties": {
+ "isrc": {
"type": "string",
- "description": "The date the album was first released"
+ "description": "International Standard Recording Code (primary key)"
},
- "release_date_precision": {
+ "name": {
"type": "string",
- "enum": [
- "year",
- "month",
- "day"
- ],
- "description": "The precision with which release_date value is known"
- },
- "restrictions": {
- "type": "object",
- "properties": {
- "reason": {
- "type": "string",
- "description": "The reason for the restriction"
- }
- },
- "description": "Included when a content restriction is applied"
+ "description": "Name of the song"
},
- "type": {
+ "album": {
"type": "string",
- "enum": [
- "album"
- ],
- "description": "The object type, always 'album'"
+ "description": "Name of the album the song belongs to"
},
- "uri": {
+ "notes": {
"type": "string",
- "description": "The Spotify URI for the album"
+ "description": "Notes for the song"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the song data was last updated"
},
"artists": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SpotifySimplifiedArtist"
+ "$ref": "#/components/schemas/SongArtist"
},
- "description": "The artists of the album"
- },
- "album_group": {
+ "description": "Array of artist objects associated with this song"
+ }
+ }
+ },
+ "SongsResponse": {
+ "type": "object",
+ "description": "Response containing songs data",
+ "properties": {
+ "status": {
"type": "string",
"enum": [
- "album",
- "single",
- "compilation",
- "appears_on"
+ "success",
+ "error"
],
- "description": "The field to distinguish albums by various groups"
+ "description": "Status of the request"
+ },
+ "songs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Song"
+ },
+ "description": "Array of song objects with artist information"
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is 'error')"
}
}
},
- "SpotifyArtistAlbumsResponse": {
+ "SongsErrorResponse": {
"type": "object",
"properties": {
- "href": {
+ "status": {
"type": "string",
- "description": "A link to the Web API endpoint returning the full result"
- },
- "limit": {
- "type": "integer",
- "description": "The maximum number of items in the response"
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
},
- "next": {
+ "error": {
"type": "string",
- "nullable": true,
- "description": "URL to the next page of items"
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "CreateSongInput": {
+ "type": "object",
+ "required": [
+ "isrc"
+ ],
+ "properties": {
+ "isrc": {
+ "type": "string",
+ "description": "International Standard Recording Code of the song to create or fetch"
},
- "offset": {
- "type": "integer",
- "description": "The offset of the items returned"
+ "name": {
+ "type": "string",
+ "description": "Optional. Song name, applied only if internal search cannot find valid info"
},
- "previous": {
+ "album": {
"type": "string",
- "nullable": true,
- "description": "URL to the previous page of items"
+ "description": "Optional. Album name, applied only if internal search cannot find valid info"
},
- "total": {
- "type": "integer",
- "description": "The total number of items available"
+ "notes": {
+ "type": "string",
+ "description": "Optional. Notes for the song, applied only if internal search cannot find valid info"
},
- "items": {
+ "artists": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SpotifySimplifiedAlbum"
+ "type": "string"
},
- "description": "Array of simplified album objects"
+ "description": "Optional array of artist names, applied only if internal search cannot find valid info"
}
}
},
- "SpotifyTrack": {
+ "CreateSongsRequest": {
"type": "object",
+ "required": [
+ "songs"
+ ],
"properties": {
- "album": {
- "$ref": "#/components/schemas/SpotifySimplifiedAlbum",
- "description": "The album the track appears on"
- },
- "artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifySimplifiedArtist"
- },
- "description": "Artists who performed the track"
- },
- "available_markets": {
+ "songs": {
"type": "array",
"items": {
- "type": "string"
- },
- "description": "Markets in which the track is available"
- },
- "disc_number": {
- "type": "integer",
- "description": "Disc number the track is on"
- },
- "duration_ms": {
- "type": "integer",
- "description": "Track length in milliseconds"
- },
- "explicit": {
- "type": "boolean",
- "description": "Whether the track has explicit lyrics"
- },
- "external_ids": {
- "type": "object",
- "properties": {
- "isrc": {
- "type": "string",
- "description": "International Standard Recording Code"
- },
- "ean": {
- "type": "string",
- "description": "International Article Number"
- },
- "upc": {
- "type": "string",
- "description": "Universal Product Code"
- }
+ "$ref": "#/components/schemas/CreateSongInput"
},
- "description": "Known external IDs for the track"
- },
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "href": {
- "type": "string",
- "description": "Link to the Web API endpoint with full details"
- },
+ "description": "Array of song inputs for bulk create/fetch"
+ }
+ }
+ },
+ "Catalog": {
+ "type": "object",
+ "description": "A catalog with its metadata",
+ "properties": {
"id": {
"type": "string",
- "description": "Spotify ID for the track"
- },
- "is_playable": {
- "type": "boolean",
- "description": "If true, the track is playable in the given market"
- },
- "linked_from": {
- "type": "object",
- "description": "Information about the originally requested track when track relinking is applied"
- },
- "restrictions": {
- "type": "object",
- "properties": {
- "reason": {
- "type": "string",
- "description": "The reason for the restriction"
- }
- },
- "description": "Content restriction information"
+ "format": "uuid",
+ "description": "Unique identifier for the catalog"
},
"name": {
"type": "string",
- "description": "Track name"
+ "description": "Name of the catalog"
},
- "popularity": {
- "type": "integer",
- "description": "Popularity score (0-100)"
+ "created_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the catalog was created"
},
- "preview_url": {
+ "updated_at": {
"type": "string",
- "nullable": true,
- "description": "URL to a 30 second preview, if available"
+ "format": "date-time",
+ "description": "ISO timestamp of when the catalog was last updated"
+ }
+ }
+ },
+ "CatalogsResponse": {
+ "type": "object",
+ "description": "Response containing catalogs data",
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the request"
},
- "track_number": {
- "type": "integer",
- "description": "Track number on the album"
+ "catalogs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Catalog"
+ },
+ "description": "Array of catalog objects"
},
- "type": {
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is 'error')"
+ }
+ }
+ },
+ "CatalogsErrorResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
"enum": [
- "track"
+ "error"
],
- "description": "The object type, always 'track'"
+ "description": "Status of the request"
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "CreateCatalogInput": {
+ "type": "object",
+ "required": [
+ "account_id"
+ ],
+ "properties": {
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "The account to associate the catalog with"
},
- "uri": {
+ "name": {
"type": "string",
- "description": "The Spotify URI for the track"
+ "description": "Catalog name to create if catalog_id is omitted"
},
- "is_local": {
- "type": "boolean",
- "description": "Whether the track is from a local file"
+ "catalog_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Existing catalog ID to link to the account"
}
}
},
- "SpotifyArtistTopTracksResponse": {
+ "CreateCatalogsRequest": {
"type": "object",
+ "required": [
+ "catalogs"
+ ],
"properties": {
- "tracks": {
+ "catalogs": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SpotifyTrack"
+ "$ref": "#/components/schemas/CreateCatalogInput"
},
- "description": "Array of track objects"
+ "description": "Array of catalog inputs for bulk create/link operations"
}
}
},
- "SpotifySimplifiedTrack": {
+ "DeleteCatalogInput": {
"type": "object",
+ "required": [
+ "catalog_id",
+ "account_id"
+ ],
"properties": {
- "artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifySimplifiedArtist"
- },
- "description": "The artists who performed the track"
+ "catalog_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Catalog ID to remove"
},
- "available_markets": {
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Account ID whose relationship will be removed"
+ }
+ }
+ },
+ "DeleteCatalogsRequest": {
+ "type": "object",
+ "required": [
+ "catalogs"
+ ],
+ "properties": {
+ "catalogs": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/DeleteCatalogInput"
},
- "description": "Markets in which the track is available"
- },
- "disc_number": {
- "type": "integer",
- "description": "Disc number the track is on"
- },
- "duration_ms": {
- "type": "integer",
- "description": "Track length in milliseconds"
- },
- "explicit": {
- "type": "boolean",
- "description": "Whether the track has explicit lyrics"
- },
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "href": {
+ "description": "Array of catalog-account pairs to remove"
+ }
+ }
+ },
+ "CatalogSong": {
+ "type": "object",
+ "description": "A song within a catalog with its metadata and associated artists",
+ "properties": {
+ "catalog_id": {
"type": "string",
- "description": "Link to the Web API endpoint"
+ "format": "uuid",
+ "description": "Catalog ID this song entry is associated with"
},
- "id": {
+ "isrc": {
"type": "string",
- "description": "Spotify ID for the track"
- },
- "is_playable": {
- "type": "boolean",
- "description": "If true, the track is playable"
- },
- "linked_from": {
- "type": "object",
- "description": "Track relinking info"
- },
- "restrictions": {
- "type": "object",
- "properties": {
- "reason": {
- "type": "string"
- }
- }
+ "description": "International Standard Recording Code (primary key)"
},
"name": {
"type": "string",
- "description": "Track name"
+ "description": "Name of the song"
},
- "preview_url": {
+ "album": {
"type": "string",
- "nullable": true,
- "description": "URL to a 30 second preview"
- },
- "track_number": {
- "type": "integer",
- "description": "Track number on the album"
+ "description": "Name of the album the song belongs to"
},
- "type": {
+ "lyrics": {
"type": "string",
- "enum": [
- "track"
- ]
+ "description": "Full lyrics of the song"
},
- "uri": {
+ "updated_at": {
"type": "string",
- "description": "Spotify URI for the track"
+ "format": "date-time",
+ "description": "ISO timestamp of when the song data was last updated"
},
- "is_local": {
- "type": "boolean",
- "description": "Whether from a local file"
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SongArtist"
+ },
+ "description": "Array of artist objects associated with this song"
}
}
},
- "SpotifyAlbumTracks": {
+ "CatalogSongsPagination": {
"type": "object",
+ "description": "Pagination metadata for catalog songs response",
"properties": {
- "href": {
- "type": "string",
- "description": "A link to the Web API endpoint"
- },
- "limit": {
+ "total_count": {
"type": "integer",
- "description": "The maximum number of items in the response"
- },
- "next": {
- "type": "string",
- "nullable": true,
- "description": "URL to the next page of items"
+ "description": "Total number of songs in the catalog"
},
- "offset": {
+ "page": {
"type": "integer",
- "description": "The offset of the items returned"
- },
- "previous": {
- "type": "string",
- "nullable": true,
- "description": "URL to the previous page"
+ "description": "Current page number"
},
- "total": {
+ "limit": {
"type": "integer",
- "description": "Total number of items available"
+ "description": "Number of songs per page"
},
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifySimplifiedTrack"
- },
- "description": "Array of simplified track objects"
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "SpotifyCopyright": {
+ "CatalogSongsResponse": {
"type": "object",
+ "description": "Response containing catalog songs data with pagination",
"properties": {
- "text": {
+ "status": {
"type": "string",
- "description": "The copyright text"
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the request"
},
- "type": {
+ "songs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CatalogSong"
+ },
+ "description": "Array of song objects with artist information"
+ },
+ "pagination": {
+ "$ref": "#/components/schemas/CatalogSongsPagination",
+ "description": "Pagination metadata for the response"
+ },
+ "error": {
"type": "string",
- "description": "The type of copyright"
+ "description": "Error message (only present if status is 'error')"
}
}
},
- "SpotifyAlbum": {
+ "CatalogSongsErrorResponse": {
"type": "object",
"properties": {
- "album_type": {
+ "status": {
"type": "string",
"enum": [
- "album",
- "single",
- "compilation"
+ "error"
],
- "description": "The type of the album"
- },
- "total_tracks": {
- "type": "integer",
- "description": "The number of tracks in the album"
- },
- "available_markets": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Markets in which the album is available"
- },
- "external_urls": {
- "$ref": "#/components/schemas/SpotifyExternalUrls"
- },
- "href": {
- "type": "string",
- "description": "A link to the Web API endpoint providing full details"
+ "description": "Status of the request"
},
- "id": {
+ "error": {
"type": "string",
- "description": "The Spotify ID for the album"
- },
- "images": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifyImage"
- },
- "description": "The cover art for the album in various sizes"
- },
- "name": {
+ "description": "Error message describing what went wrong"
+ }
+ }
+ },
+ "AddCatalogSongInput": {
+ "type": "object",
+ "required": [
+ "catalog_id",
+ "isrc"
+ ],
+ "properties": {
+ "catalog_id": {
"type": "string",
- "description": "The name of the album"
+ "format": "uuid",
+ "description": "Catalog ID to which the song will be added"
},
- "release_date": {
+ "isrc": {
"type": "string",
- "description": "The date the album was first released"
+ "description": "Song ISRC to associate to the catalog"
},
- "release_date_precision": {
+ "name": {
"type": "string",
- "enum": [
- "year",
- "month",
- "day"
- ],
- "description": "The precision with which release_date value is known"
- },
- "restrictions": {
- "type": "object",
- "properties": {
- "reason": {
- "type": "string"
- }
- },
- "description": "Included when a content restriction is applied"
+ "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
},
- "type": {
+ "album": {
"type": "string",
- "enum": [
- "album"
- ],
- "description": "The object type, always 'album'"
+ "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
},
- "uri": {
+ "notes": {
"type": "string",
- "description": "The Spotify URI for the album"
+ "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
},
"artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifySimplifiedArtist"
- },
- "description": "The artists of the album"
- },
- "tracks": {
- "$ref": "#/components/schemas/SpotifyAlbumTracks",
- "description": "The tracks of the album"
- },
- "copyrights": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SpotifyCopyright"
- },
- "description": "Copyright statements of the album"
- },
- "external_ids": {
- "type": "object",
- "properties": {
- "isrc": {
- "type": "string"
- },
- "ean": {
- "type": "string"
- },
- "upc": {
- "type": "string"
- }
- },
- "description": "Known external IDs for the album"
- },
- "genres": {
"type": "array",
"items": {
"type": "string"
},
- "description": "Deprecated. Always empty."
- },
- "label": {
- "type": "string",
- "description": "The label associated with the album"
- },
- "popularity": {
- "type": "integer",
- "description": "Popularity of the album (0-100)"
+ "description": "Optional array of artist names. Applied only if internal search lacks info"
}
}
},
- "SpotifyErrorResponse": {
+ "AddCatalogSongsRequest": {
"type": "object",
+ "required": [
+ "songs"
+ ],
"properties": {
- "error": {
- "type": "object",
- "properties": {
- "status": {
- "type": "integer",
- "description": "HTTP status code"
- },
- "message": {
- "type": "string",
- "description": "Error message"
- }
+ "songs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AddCatalogSongInput"
},
- "description": "Error details"
+ "description": "Array of songs for batch updates"
}
}
},
- "TwitterPhoto": {
+ "DeleteCatalogSongInput": {
"type": "object",
+ "required": [
+ "catalog_id",
+ "isrc"
+ ],
"properties": {
- "id": {
+ "catalog_id": {
"type": "string",
- "description": "Photo ID"
+ "format": "uuid",
+ "description": "Catalog ID from which the song will be removed"
},
- "url": {
+ "isrc": {
"type": "string",
- "description": "URL of the photo"
+ "description": "Song ISRC to remove from the catalog"
}
}
},
- "TwitterVideo": {
+ "DeleteCatalogSongsRequest": {
"type": "object",
+ "required": [
+ "songs"
+ ],
"properties": {
- "id": {
- "type": "string",
- "description": "Video ID"
- },
- "preview": {
- "type": "string",
- "description": "URL of the video preview image"
- },
- "url": {
- "type": "string",
- "description": "URL of the video"
+ "songs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeleteCatalogSongInput"
+ },
+ "description": "Array of songs for batch deletes"
}
}
},
- "Tweet": {
+ "ArtistFan": {
"type": "object",
"properties": {
"id": {
"type": "string",
- "description": "Tweet ID"
- },
- "text": {
- "type": "string",
- "description": "Tweet text content"
+ "description": "Unique identifier for the fan's social profile"
},
"username": {
"type": "string",
- "description": "Username of the tweet author"
- },
- "timestamp": {
- "type": "integer",
- "description": "Unix timestamp (ms) of when the tweet was posted"
+ "description": "Username or handle on the platform"
},
- "createdAt": {
+ "avatar": {
"type": "string",
- "description": "ISO timestamp of when the tweet was posted"
+ "description": "URL to the fan's avatar/profile image"
},
- "isReply": {
- "type": "boolean",
- "description": "Whether the tweet is a reply"
+ "profile_url": {
+ "type": "string",
+ "description": "Full URL to the fan's profile on the platform"
},
- "isRetweet": {
- "type": "boolean",
- "description": "Whether the tweet is a retweet"
+ "region": {
+ "type": "string",
+ "description": "Geographic region or location of the fan"
},
- "likes": {
- "type": "integer",
- "description": "Number of likes"
+ "bio": {
+ "type": "string",
+ "description": "Fan's biography or profile description"
},
- "retweetCount": {
+ "followerCount": {
"type": "integer",
- "description": "Number of retweets"
+ "description": "Number of followers the fan has"
},
- "replies": {
+ "followingCount": {
"type": "integer",
- "description": "Number of replies"
- },
- "photos": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TwitterPhoto"
- },
- "description": "Array of photo objects"
- },
- "videos": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TwitterVideo"
- },
- "description": "Array of video objects"
- },
- "urls": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Array of URLs included in the tweet"
- },
- "permanentUrl": {
- "type": "string",
- "description": "Permanent URL to the tweet"
- },
- "quotedStatusId": {
- "type": "string",
- "description": "ID of the quoted tweet (if applicable)"
+ "description": "Number of accounts the fan is following"
},
- "inReplyToStatusId": {
+ "updated_at": {
"type": "string",
- "description": "ID of the tweet this is replying to (if applicable)"
- },
- "hashtags": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Array of hashtags in the tweet"
+ "format": "date-time",
+ "description": "ISO timestamp of when the fan data was last updated"
}
}
},
- "TwitterSearchResponse": {
+ "ArtistFansPagination": {
"type": "object",
"properties": {
- "status": {
- "type": "string",
- "description": "Status of the request",
- "enum": [
- "success",
- "error"
- ]
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of records available"
},
- "tweets": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Tweet"
- },
- "description": "List of tweet objects"
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "Number of records per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "TwitterTrendsResponse": {
+ "ArtistFansResponse": {
"type": "object",
+ "required": [
+ "status",
+ "fans",
+ "pagination"
+ ],
"properties": {
"status": {
"type": "string",
- "description": "Status of the request",
"enum": [
- "success",
- "error"
- ]
+ "success"
+ ],
+ "description": "Status of the request"
},
- "trends": {
+ "fans": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/ArtistFan"
},
- "description": "List of current trending topics on Twitter"
+ "description": "List of social profiles from fans across all platforms"
+ },
+ "pagination": {
+ "$ref": "#/components/schemas/ArtistFansPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "TwitterErrorResponse": {
+ "ArtistFansErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
"status": {
"type": "string",
@@ -9350,55 +11431,89 @@
],
"description": "Status of the request"
},
- "message": {
+ "error": {
"type": "string",
- "description": "Error message"
+ "description": "Error message describing what went wrong"
}
}
},
- "SocialScrapeRequest": {
+ "SegmentFan": {
"type": "object",
- "required": [
- "social_id"
- ],
"properties": {
- "social_id": {
+ "id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the social profile to scrape. Obtain this from the Get Artist Socials API."
- }
- }
- },
- "SocialPost": {
- "type": "object",
- "properties": {
- "id": {
+ "description": "Unique identifier for the fan_segments record"
+ },
+ "username": {
+ "type": "string",
+ "description": "Username or handle on the platform"
+ },
+ "avatar": {
+ "type": "string",
+ "description": "URL to the fan's avatar/profile image"
+ },
+ "profile_url": {
+ "type": "string",
+ "description": "Full URL to the fan's profile on the platform"
+ },
+ "segment_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the social's social_posts record"
+ "description": "UUID of the fan's segments record"
},
- "post_id": {
+ "segment_name": {
+ "type": "string",
+ "description": "Name of the segment (e.g., 'Twitter Followers')"
+ },
+ "fan_social_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the social's posts record"
+ "description": "UUID of the fan's socials media profile account"
},
- "social_id": {
+ "region": {
+ "type": "string",
+ "description": "Geographic region or location of the fan"
+ },
+ "bio": {
+ "type": "string",
+ "description": "Fan's biography or profile description"
+ },
+ "follower_count": {
+ "type": "integer",
+ "description": "Number of followers the fan has"
+ },
+ "following_count": {
+ "type": "integer",
+ "description": "Number of accounts the fan is following"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO timestamp of when the fan data was last updated"
+ }
+ }
+ },
+ "ArtistPost": {
+ "type": "object",
+ "properties": {
+ "id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the social's socials record"
+ "description": "Unique identifier for the post"
},
"post_url": {
"type": "string",
- "description": "Direct URL to the post on the platform"
+ "description": "Direct URL to the post on the social platform"
},
"updated_at": {
"type": "string",
"format": "date-time",
- "description": "ISO timestamp of when the post data was last updated"
+ "description": "ISO timestamp of when the post was last updated"
}
}
},
- "SocialPostsPagination": {
+ "ArtistPostsPagination": {
"type": "object",
"properties": {
"total_count": {
@@ -9419,31 +11534,40 @@
}
}
},
- "SocialPostsResponse": {
+ "ArtistPostsResponse": {
"type": "object",
+ "required": [
+ "status",
+ "posts",
+ "pagination"
+ ],
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
- "error"
+ "success"
],
"description": "Status of the request"
},
"posts": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/SocialPost"
+ "$ref": "#/components/schemas/ArtistPost"
},
- "description": "List of social media posts"
+ "description": "List of posts from the artist across all social platforms"
},
"pagination": {
- "$ref": "#/components/schemas/SocialPostsPagination"
+ "$ref": "#/components/schemas/ArtistPostsPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "SocialErrorResponse": {
+ "ArtistPostsErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
"status": {
"type": "string",
@@ -9452,378 +11576,310 @@
],
"description": "Status of the request"
},
- "message": {
+ "error": {
"type": "string",
- "description": "Error message"
+ "description": "Error message describing what went wrong"
}
}
},
- "GeneratedImage": {
+ "PostComment": {
"type": "object",
- "description": "A generated image file from the AI model",
+ "required": [
+ "id",
+ "post_id",
+ "social_id",
+ "comment",
+ "commented_at",
+ "username",
+ "profile_url",
+ "post_url"
+ ],
"properties": {
- "base64": {
+ "id": {
"type": "string",
- "description": "Image file as a base64 encoded string"
- },
- "uint8Array": {
- "type": "array",
- "items": {
- "type": "integer"
- },
- "description": "Image file as a Uint8Array (represented as array of numbers in JSON)"
+ "format": "uuid",
+ "description": "UUID of the comment record"
},
- "mediaType": {
- "type": "string",
- "description": "The IANA media type of the file (e.g., 'image/png', 'image/jpeg')"
- }
- }
- },
- "ImageResponseMeta": {
- "type": "object",
- "description": "Response metadata from the AI provider",
- "properties": {
- "finishReason": {
- "type": "string",
- "description": "Reason the generation finished (e.g., 'stop')"
- }
- }
- },
- "ImageProviderMetadata": {
- "type": "object",
- "description": "Metadata from the AI provider about the generation",
- "properties": {
- "model": {
+ "post_id": {
"type": "string",
- "description": "The AI model used for generation (e.g., 'dall-e-3', 'gpt-image-1')"
+ "format": "uuid",
+ "description": "UUID of the post this comment belongs to"
},
- "size": {
+ "social_id": {
"type": "string",
- "description": "The size of the generated image (e.g., '1024x1024')"
- }
- }
- },
- "ImageUsage": {
- "type": "object",
- "description": "Token usage information for the image generation",
- "properties": {
- "promptTokens": {
- "type": "integer",
- "description": "Number of tokens used in the prompt"
- },
- "completionTokens": {
- "type": "integer",
- "description": "Number of tokens used in the completion (typically 0 for image generation)"
+ "format": "uuid",
+ "description": "UUID of the social profile that made the comment"
},
- "totalTokens": {
- "type": "integer",
- "description": "Total tokens used"
- }
- }
- },
- "ArweaveTransaction": {
- "type": "object",
- "description": "Arweave transaction object for the stored image",
- "properties": {
- "id": {
+ "comment": {
"type": "string",
- "description": "Unique identifier for the Arweave transaction"
+ "description": "Text content of the comment"
},
- "last_tx": {
+ "commented_at": {
"type": "string",
- "description": "Last transaction reference"
+ "format": "date-time",
+ "description": "ISO timestamp of when the comment was posted"
},
- "owner": {
+ "username": {
"type": "string",
- "description": "Owner address of the transaction"
- },
- "tags": {
- "type": "array",
- "items": {
- "type": "object"
- },
- "description": "Tags associated with the transaction"
+ "description": "Username of the commenter"
},
- "target": {
+ "avatar": {
"type": "string",
- "description": "Target address (empty for data transactions)"
+ "nullable": true,
+ "description": "URL to the commenter's avatar image"
},
- "quantity": {
+ "profile_url": {
"type": "string",
- "description": "Amount transferred (typically '0' for data transactions)"
+ "description": "URL to the commenter's profile"
},
- "data": {
+ "post_url": {
"type": "string",
- "description": "Transaction data (may be empty in response)"
+ "description": "URL to the post where the comment was made"
},
- "reward": {
+ "region": {
"type": "string",
- "description": "Mining reward for the transaction"
+ "nullable": true,
+ "description": "Geographic region of the commenter"
},
- "signature": {
+ "bio": {
"type": "string",
- "description": "Transaction signature"
+ "nullable": true,
+ "description": "Commenter's biography or description"
+ },
+ "follower_count": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Number of followers the commenter has"
},
- "format": {
+ "following_count": {
"type": "integer",
- "description": "Transaction format version"
+ "nullable": true,
+ "description": "Number of accounts the commenter follows"
}
}
},
- "InProcessMoment": {
+ "PostCommentsPagination": {
"type": "object",
- "description": "In Process moment metadata for provenance and ownership tracking",
"properties": {
- "contractAddress": {
- "type": "string",
- "description": "Smart contract address for the moment"
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of comments available"
},
- "tokenId": {
- "type": "string",
- "description": "Token ID of the minted moment"
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
},
- "hash": {
- "type": "string",
- "description": "Transaction hash of the moment mint"
+ "limit": {
+ "type": "integer",
+ "description": "Number of comments per page"
},
- "chainId": {
+ "total_pages": {
"type": "integer",
- "description": "Chain ID (e.g., 8453 for Base)"
+ "description": "Total number of pages available"
}
}
},
- "ImageGenerationResponse": {
+ "PostCommentsResponse": {
"type": "object",
- "description": "Response from the image generation endpoint, extending Experimental_GenerateImageResult from the AI SDK",
+ "required": [
+ "status",
+ "comments",
+ "pagination"
+ ],
"properties": {
- "images": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/GeneratedImage"
- },
- "description": "Array of generated image objects"
- },
- "warnings": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Array of warning messages, if any"
+ "status": {
+ "type": "string",
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "responses": {
+ "comments": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ImageResponseMeta"
+ "$ref": "#/components/schemas/PostComment"
},
- "description": "Array of response metadata from the AI provider"
- },
- "providerMetadata": {
- "$ref": "#/components/schemas/ImageProviderMetadata"
- },
- "usage": {
- "$ref": "#/components/schemas/ImageUsage"
- },
- "imageUrl": {
- "type": "string",
- "description": "Permanent Arweave URL where the image is stored"
- },
- "arweaveResult": {
- "$ref": "#/components/schemas/ArweaveTransaction"
+ "description": "List of comments for the specified post"
},
- "moment": {
- "$ref": "#/components/schemas/InProcessMoment"
+ "pagination": {
+ "$ref": "#/components/schemas/PostCommentsPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "ImageGenerationErrorResponse": {
+ "PostCommentsErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
"error": {
"type": "string",
"description": "Error message describing what went wrong"
}
}
},
- "TranscribeAudioRequest": {
+ "Comment": {
"type": "object",
- "required": [
- "audio_url",
- "account_id",
- "artist_account_id"
- ],
"properties": {
- "audio_url": {
+ "id": {
"type": "string",
- "description": "Public URL to the audio file (mp3, wav, m4a, webm)",
- "example": "https://example.com/song.mp3"
+ "format": "uuid",
+ "description": "UUID of the comment"
},
- "account_id": {
+ "post_id": {
"type": "string",
"format": "uuid",
- "description": "Owner account ID for file storage",
- "example": "550e8400-e29b-41d4-a716-446655440000"
+ "description": "UUID of the associated post"
},
- "artist_account_id": {
+ "social_id": {
"type": "string",
"format": "uuid",
- "description": "Artist account ID for file storage",
- "example": "550e8400-e29b-41d4-a716-446655440001"
+ "description": "UUID of the social profile who made the comment"
},
- "title": {
+ "comment": {
"type": "string",
- "description": "Optional title for the audio and transcription files",
- "example": "My Song"
+ "description": "Comment text content"
},
- "include_timestamps": {
- "type": "boolean",
- "description": "Whether to include timestamps in the markdown transcript",
- "default": false
+ "commented_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "Timestamp with timezone of when the comment was made"
}
}
},
- "TranscribeFileInfo": {
+ "CommentsPagination": {
"type": "object",
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the file record in the database"
+ "total_count": {
+ "type": "integer",
+ "description": "Total number of comments available"
},
- "fileName": {
- "type": "string",
- "description": "Name of the saved file"
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
},
- "storageKey": {
- "type": "string",
- "description": "Storage path in Supabase Storage"
+ "limit": {
+ "type": "integer",
+ "description": "Number of comments per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "TranscribeAudioResponse": {
+ "CommentsResponse": {
"type": "object",
"required": [
- "success",
- "audioFile",
- "transcriptFile",
- "text"
+ "status",
+ "comments",
+ "pagination"
],
"properties": {
- "success": {
- "type": "boolean",
- "description": "Whether the transcription was successful"
- },
- "audioFile": {
- "$ref": "#/components/schemas/TranscribeFileInfo",
- "description": "Information about the saved audio file"
- },
- "transcriptFile": {
- "$ref": "#/components/schemas/TranscribeFileInfo",
- "description": "Information about the saved transcript file"
- },
- "text": {
+ "status": {
"type": "string",
- "description": "The full transcription text"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "language": {
- "type": "string",
- "description": "Detected language code (e.g., 'en', 'es', 'fr')"
+ "comments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Comment"
+ },
+ "description": "List of comments for the specified artist or post"
+ },
+ "pagination": {
+ "$ref": "#/components/schemas/CommentsPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "TranscribeAudioErrorResponse": {
+ "CommentsErrorResponse": {
"type": "object",
"required": [
+ "status",
"error"
],
"properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "error"
+ ],
+ "description": "Status of the request"
+ },
"error": {
"type": "string",
"description": "Error message describing what went wrong"
}
}
},
- "SongArtist": {
+ "SegmentFansPagination": {
"type": "object",
- "description": "Artist associated with a song",
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "Unique identifier for the artist account"
- },
- "name": {
- "type": "string",
- "nullable": true,
- "description": "Name of the artist (can be null)"
- },
- "timestamp": {
+ "total_count": {
"type": "integer",
- "nullable": true,
- "description": "Timestamp associated with the artist account (can be null)"
- }
- }
- },
- "Song": {
- "type": "object",
- "description": "A song with its metadata and associated artists",
- "properties": {
- "isrc": {
- "type": "string",
- "description": "International Standard Recording Code (primary key)"
- },
- "name": {
- "type": "string",
- "description": "Name of the song"
- },
- "album": {
- "type": "string",
- "description": "Name of the album the song belongs to"
- },
- "notes": {
- "type": "string",
- "description": "Notes for the song"
+ "description": "Total number of records available"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the song data was last updated"
+ "page": {
+ "type": "integer",
+ "description": "Current page number"
},
- "artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SongArtist"
- },
- "description": "Array of artist objects associated with this song"
+ "limit": {
+ "type": "integer",
+ "description": "Number of records per page"
+ },
+ "total_pages": {
+ "type": "integer",
+ "description": "Total number of pages available"
}
}
},
- "SongsResponse": {
+ "SegmentFansResponse": {
"type": "object",
- "description": "Response containing songs data",
+ "required": [
+ "status",
+ "fans",
+ "pagination"
+ ],
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
- "error"
+ "success"
],
"description": "Status of the request"
},
- "songs": {
+ "fans": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/Song"
+ "$ref": "#/components/schemas/SegmentFan"
},
- "description": "Array of song objects with artist information"
+ "description": "List of social profiles from fans in the segment"
},
- "error": {
- "type": "string",
- "description": "Error message (only present if status is 'error')"
+ "pagination": {
+ "$ref": "#/components/schemas/SegmentFansPagination",
+ "description": "Pagination metadata for the response"
}
}
},
- "SongsErrorResponse": {
+ "SegmentFansErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
"status": {
"type": "string",
@@ -9838,104 +11894,193 @@
}
}
},
- "CreateSongInput": {
+ "StripeSubscription": {
"type": "object",
- "required": [
- "isrc"
- ],
+ "description": "A Stripe subscription object. For detailed information about all available properties, see the Stripe Subscription API documentation: https://docs.stripe.com/api/subscriptions/retrieve",
"properties": {
- "isrc": {
+ "id": {
"type": "string",
- "description": "International Standard Recording Code of the song to create or fetch"
+ "description": "Unique identifier for the subscription"
},
- "name": {
+ "object": {
"type": "string",
- "description": "Optional. Song name, applied only if internal search cannot find valid info"
+ "enum": [
+ "subscription"
+ ],
+ "description": "String representing the object's type"
},
- "album": {
+ "customer": {
"type": "string",
- "description": "Optional. Album name, applied only if internal search cannot find valid info"
+ "description": "ID of the customer who owns this subscription"
},
- "notes": {
+ "status": {
"type": "string",
- "description": "Optional. Notes for the song, applied only if internal search cannot find valid info"
+ "enum": [
+ "active",
+ "canceled",
+ "incomplete",
+ "incomplete_expired",
+ "past_due",
+ "trialing",
+ "unpaid"
+ ],
+ "description": "The status of the subscription"
},
- "artists": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Optional array of artist names, applied only if internal search cannot find valid info"
+ "currency": {
+ "type": "string",
+ "description": "Three-letter ISO currency code"
+ },
+ "current_period_start": {
+ "type": "integer",
+ "description": "Start of the current period (Unix timestamp)"
+ },
+ "current_period_end": {
+ "type": "integer",
+ "description": "End of the current period (Unix timestamp)"
+ },
+ "cancel_at_period_end": {
+ "type": "boolean",
+ "description": "If true, the subscription will be canceled at the end of the current period"
+ },
+ "created": {
+ "type": "integer",
+ "description": "Time at which the subscription was created (Unix timestamp)"
+ },
+ "items": {
+ "type": "object",
+ "description": "List of subscription items, each with an attached price",
+ "properties": {
+ "object": {
+ "type": "string",
+ "enum": [
+ "list"
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "object": {
+ "type": "string",
+ "enum": [
+ "subscription_item"
+ ]
+ },
+ "price": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "currency": {
+ "type": "string"
+ },
+ "unit_amount": {
+ "type": "integer",
+ "description": "Price amount in cents"
+ },
+ "recurring": {
+ "type": "object",
+ "properties": {
+ "interval": {
+ "type": "string",
+ "enum": [
+ "day",
+ "week",
+ "month",
+ "year"
+ ]
+ },
+ "interval_count": {
+ "type": "integer"
+ }
+ }
+ }
+ }
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "has_more": {
+ "type": "boolean"
+ },
+ "total_count": {
+ "type": "integer"
+ }
+ }
+ },
+ "latest_invoice": {
+ "type": "string",
+ "description": "ID of the most recent invoice for this subscription"
+ },
+ "livemode": {
+ "type": "boolean",
+ "description": "Indicates if in live mode (true) or test mode (false)"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Set of key-value pairs attached to the subscription"
}
}
},
- "CreateSongsRequest": {
+ "SubscriptionResponse": {
"type": "object",
"required": [
- "songs"
+ "status",
+ "subscription"
],
+ "description": "Response for standard accounts with Stripe subscriptions",
"properties": {
- "songs": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CreateSongInput"
- },
- "description": "Array of song inputs for bulk create/fetch"
- }
- }
- },
- "Catalog": {
- "type": "object",
- "description": "A catalog with its metadata",
- "properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "Unique identifier for the catalog"
- },
- "name": {
- "type": "string",
- "description": "Name of the catalog"
- },
- "created_at": {
+ "status": {
"type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the catalog was created"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the request"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the catalog was last updated"
+ "subscription": {
+ "$ref": "#/components/schemas/StripeSubscription",
+ "description": "The full Stripe subscription object"
}
}
},
- "CatalogsResponse": {
+ "EnterpriseSubscriptionResponse": {
"type": "object",
- "description": "Response containing catalogs data",
+ "required": [
+ "status",
+ "isEnterprise"
+ ],
+ "description": "Response for accounts with enterprise plans",
"properties": {
"status": {
"type": "string",
"enum": [
- "success",
- "error"
+ "success"
],
"description": "Status of the request"
},
- "catalogs": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Catalog"
- },
- "description": "Array of catalog objects"
- },
- "error": {
- "type": "string",
- "description": "Error message (only present if status is 'error')"
+ "isEnterprise": {
+ "type": "boolean",
+ "enum": [
+ true
+ ],
+ "description": "Indicates that the account has an enterprise plan"
}
}
},
- "CatalogsErrorResponse": {
+ "SubscriptionErrorResponse": {
"type": "object",
+ "required": [
+ "status",
+ "error"
+ ],
"properties": {
"status": {
"type": "string",
@@ -9950,141 +12095,97 @@
}
}
},
- "CreateCatalogInput": {
+ "CreateSandboxRequest": {
"type": "object",
- "required": [
- "account_id"
- ],
+ "description": "Request body for creating a new sandbox. All fields are optional - if no command or prompt is provided, sandbox is created without triggering a command execution task. Use prompt as a shortcut to run OpenCode with a given prompt instead of specifying command/args manually.",
"properties": {
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "The account to associate the catalog with"
- },
- "name": {
+ "command": {
"type": "string",
- "description": "Catalog name to create if catalog_id is omitted"
+ "minLength": 1,
+ "description": "The command to execute in the sandbox environment. If omitted, the sandbox is created without running any command.",
+ "example": "ls"
},
- "catalog_id": {
- "type": "string",
- "format": "uuid",
- "description": "Existing catalog ID to link to the account"
- }
- }
- },
- "CreateCatalogsRequest": {
- "type": "object",
- "required": [
- "catalogs"
- ],
- "properties": {
- "catalogs": {
+ "args": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/CreateCatalogInput"
+ "type": "string"
},
- "description": "Array of catalog inputs for bulk create/link operations"
- }
- }
- },
- "DeleteCatalogInput": {
- "type": "object",
- "required": [
- "catalog_id",
- "account_id"
- ],
- "properties": {
- "catalog_id": {
+ "description": "Optional arguments to pass to the command.",
+ "example": [
+ "-la",
+ "/home"
+ ]
+ },
+ "cwd": {
"type": "string",
- "format": "uuid",
- "description": "Catalog ID to remove"
+ "description": "Optional working directory for command execution.",
+ "example": "/home/user"
+ },
+ "prompt": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A prompt to pass to OpenCode in the sandbox. When provided, the sandbox will execute `opencode run \"\"`. Cannot be used together with command.",
+ "example": "create a hello world index.html"
},
"account_id": {
"type": "string",
"format": "uuid",
- "description": "Account ID whose relationship will be removed"
+ "description": "UUID of the account to create the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, creates the sandbox for the API key's own account."
}
}
},
- "DeleteCatalogsRequest": {
+ "Sandbox": {
"type": "object",
"required": [
- "catalogs"
+ "sandboxId",
+ "sandboxStatus",
+ "timeout",
+ "createdAt"
],
+ "description": "A sandbox environment instance",
"properties": {
- "catalogs": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/DeleteCatalogInput"
- },
- "description": "Array of catalog-account pairs to remove"
- }
- }
- },
- "CatalogSong": {
- "type": "object",
- "description": "A song within a catalog with its metadata and associated artists",
- "properties": {
- "catalog_id": {
- "type": "string",
- "format": "uuid",
- "description": "Catalog ID this song entry is associated with"
- },
- "isrc": {
- "type": "string",
- "description": "International Standard Recording Code (primary key)"
- },
- "name": {
+ "sandboxId": {
"type": "string",
- "description": "Name of the song"
+ "description": "Unique identifier for the sandbox",
+ "example": "sbx_abc123def456"
},
- "album": {
+ "sandboxStatus": {
"type": "string",
- "description": "Name of the album the song belongs to"
+ "enum": [
+ "pending",
+ "running",
+ "stopping",
+ "stopped",
+ "failed"
+ ],
+ "description": "Current lifecycle state of the sandbox",
+ "example": "running"
},
- "lyrics": {
- "type": "string",
- "description": "Full lyrics of the song"
+ "timeout": {
+ "type": "integer",
+ "description": "Milliseconds remaining before the sandbox stops automatically",
+ "example": 300000
},
- "updated_at": {
+ "createdAt": {
"type": "string",
"format": "date-time",
- "description": "ISO timestamp of when the song data was last updated"
- },
- "artists": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SongArtist"
- },
- "description": "Array of artist objects associated with this song"
- }
- }
- },
- "CatalogSongsPagination": {
- "type": "object",
- "description": "Pagination metadata for catalog songs response",
- "properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of songs in the catalog"
- },
- "page": {
- "type": "integer",
- "description": "Current page number"
- },
- "limit": {
- "type": "integer",
- "description": "Number of songs per page"
+ "description": "ISO 8601 timestamp when the sandbox was created",
+ "example": "2024-01-15T10:30:00.000Z"
},
- "total_pages": {
- "type": "integer",
- "description": "Total number of pages available"
+ "runId": {
+ "type": "string",
+ "description": "Unique identifier for the command execution run. Only present if a command was provided when creating the sandbox. Use this with [GET /api/tasks/runs](/api-reference/tasks/runs) to check the status and retrieve results.",
+ "example": "run_xyz789abc123"
}
}
},
- "CatalogSongsResponse": {
+ "SandboxesResponse": {
"type": "object",
- "description": "Response containing catalog songs data with pagination",
+ "required": [
+ "status",
+ "sandboxes"
+ ],
+ "description": "Response containing sandbox information",
"properties": {
"status": {
"type": "string",
@@ -10094,193 +12195,162 @@
],
"description": "Status of the request"
},
- "songs": {
+ "sandboxes": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/CatalogSong"
+ "$ref": "#/components/schemas/Sandbox"
},
- "description": "Array of song objects with artist information"
- },
- "pagination": {
- "$ref": "#/components/schemas/CatalogSongsPagination",
- "description": "Pagination metadata for the response"
- },
- "error": {
- "type": "string",
- "description": "Error message (only present if status is 'error')"
- }
- }
- },
- "CatalogSongsErrorResponse": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
- },
- "error": {
- "type": "string",
- "description": "Error message describing what went wrong"
- }
- }
- },
- "AddCatalogSongInput": {
- "type": "object",
- "required": [
- "catalog_id",
- "isrc"
- ],
- "properties": {
- "catalog_id": {
- "type": "string",
- "format": "uuid",
- "description": "Catalog ID to which the song will be added"
- },
- "isrc": {
- "type": "string",
- "description": "Song ISRC to associate to the catalog"
- },
- "name": {
- "type": "string",
- "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
+ "description": "Array of sandbox objects"
},
- "album": {
+ "snapshot_id": {
"type": "string",
- "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
+ "description": "The account's saved snapshot ID used for creating new sandboxes. Null if no snapshot has been saved.",
+ "example": "snap_abc123def456",
+ "nullable": true
},
- "notes": {
+ "github_repo": {
"type": "string",
- "description": "Optional. Applied only if internal search cannot find valid info for ISRC"
+ "description": "The GitHub repository URL associated with the account's sandbox environment. Used as the filesystem source when restoring sandboxes.",
+ "example": "https://github.com/username/repo",
+ "nullable": true
},
- "artists": {
+ "filetree": {
"type": "array",
+ "nullable": true,
+ "description": "The recursive file tree of the account's GitHub repository. Null if no github_repo is set or if the fetch fails.",
"items": {
- "type": "string"
- },
- "description": "Optional array of artist names. Applied only if internal search lacks info"
+ "$ref": "#/components/schemas/FileTreeEntry"
+ }
+ },
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
}
}
},
- "AddCatalogSongsRequest": {
+ "SandboxErrorResponse": {
"type": "object",
"required": [
- "songs"
+ "error"
],
- "properties": {
- "songs": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/AddCatalogSongInput"
- },
- "description": "Array of songs for batch updates"
+ "properties": {
+ "error": {
+ "type": "string",
+ "description": "Error message describing what went wrong",
+ "example": "Failed to create sandbox"
}
}
},
- "DeleteCatalogSongInput": {
+ "SandboxFileResponse": {
"type": "object",
"required": [
- "catalog_id",
- "isrc"
+ "status",
+ "content"
],
"properties": {
- "catalog_id": {
+ "status": {
"type": "string",
- "format": "uuid",
- "description": "Catalog ID from which the song will be removed"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the operation"
},
- "isrc": {
+ "content": {
"type": "string",
- "description": "Song ISRC to remove from the catalog"
+ "description": "The raw text content of the file"
}
}
},
- "DeleteCatalogSongsRequest": {
+ "UploadSandboxFilesRequest": {
"type": "object",
"required": [
- "songs"
+ "files"
],
"properties": {
- "songs": {
+ "path": {
+ "type": "string",
+ "description": "The target directory path within the repository to upload files to. Defaults to the repository root if omitted.",
+ "example": "assets/images"
+ },
+ "files": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/DeleteCatalogSongInput"
+ "type": "object",
+ "required": [
+ "url",
+ "name"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "The URL of the file to upload",
+ "example": "https://example.com/files/album-cover.png"
+ },
+ "name": {
+ "type": "string",
+ "description": "The filename to use when committing to the repository",
+ "example": "album-cover.png"
+ }
+ }
},
- "description": "Array of songs for batch deletes"
+ "description": "Array of files to upload, each with a URL and target filename"
+ },
+ "message": {
+ "type": "string",
+ "description": "Optional commit message. Defaults to 'Upload files via API'.",
+ "example": "Add new album artwork"
}
}
},
- "ArtistFan": {
+ "UploadSandboxFilesResponse": {
"type": "object",
+ "required": [
+ "status",
+ "uploaded"
+ ],
"properties": {
- "id": {
- "type": "string",
- "description": "Unique identifier for the fan's social profile"
- },
- "username": {
- "type": "string",
- "description": "Username or handle on the platform"
- },
- "avatar": {
- "type": "string",
- "description": "URL to the fan's avatar/profile image"
- },
- "profile_url": {
- "type": "string",
- "description": "Full URL to the fan's profile on the platform"
- },
- "region": {
- "type": "string",
- "description": "Geographic region or location of the fan"
- },
- "bio": {
+ "status": {
"type": "string",
- "description": "Fan's biography or profile description"
- },
- "followerCount": {
- "type": "integer",
- "description": "Number of followers the fan has"
- },
- "followingCount": {
- "type": "integer",
- "description": "Number of accounts the fan is following"
+ "enum": [
+ "success"
+ ],
+ "description": "Status of the operation"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the fan data was last updated"
+ "uploaded": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The full path of the uploaded file in the repository"
+ },
+ "sha": {
+ "type": "string",
+ "description": "The git SHA of the created/updated file"
+ }
+ }
+ },
+ "description": "Array of uploaded file details"
}
}
},
- "ArtistFansPagination": {
+ "SetupSandboxRequest": {
"type": "object",
"properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of records available"
- },
- "page": {
- "type": "integer",
- "description": "Current page number"
- },
- "limit": {
- "type": "integer",
- "description": "Number of records per page"
- },
- "total_pages": {
- "type": "integer",
- "description": "Total number of pages available"
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the account to set up the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, sets up the sandbox for the API key's own account."
}
}
},
- "ArtistFansResponse": {
+ "SetupSandboxResponse": {
"type": "object",
"required": [
"status",
- "fans",
- "pagination"
+ "runId"
],
"properties": {
"status": {
@@ -10288,289 +12358,452 @@
"enum": [
"success"
],
- "description": "Status of the request"
- },
- "fans": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ArtistFan"
- },
- "description": "List of social profiles from fans across all platforms"
+ "description": "Status of the setup operation"
},
- "pagination": {
- "$ref": "#/components/schemas/ArtistFansPagination",
- "description": "Pagination metadata for the response"
+ "runId": {
+ "type": "string",
+ "description": "The Trigger.dev run ID for the setup-sandbox background task. Use this with [GET /api/tasks/runs](/api-reference/tasks/runs) to check the status and retrieve results.",
+ "example": "run_abc123def456"
}
}
},
- "ArtistFansErrorResponse": {
+ "DeleteSandboxRequest": {
+ "type": "object",
+ "properties": {
+ "account_id": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the account to delete the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, deletes the sandbox for the API key's own account."
+ }
+ }
+ },
+ "DeleteSandboxResponse": {
"type": "object",
"required": [
- "status",
- "error"
+ "status"
],
"properties": {
"status": {
"type": "string",
"enum": [
+ "success",
"error"
],
- "description": "Status of the request"
+ "description": "Status of the delete operation"
+ },
+ "deleted_snapshot": {
+ "nullable": true,
+ "description": "The snapshot record that was deleted. Null if no snapshot existed for the account.",
+ "$ref": "#/components/schemas/UpdateSnapshotResponse"
},
"error": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "Error message (only present if status is error)"
}
}
},
- "SegmentFan": {
+ "UpdateSnapshotRequest": {
"type": "object",
+ "required": [],
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "Unique identifier for the fan_segments record"
- },
- "username": {
- "type": "string",
- "description": "Username or handle on the platform"
- },
- "avatar": {
+ "snapshotId": {
"type": "string",
- "description": "URL to the fan's avatar/profile image"
+ "description": "The snapshot ID to set for the account. This snapshot will be used as the base environment when creating new sandboxes.",
+ "example": "snap_abc123def456"
},
- "profile_url": {
+ "github_repo": {
"type": "string",
- "description": "Full URL to the fan's profile on the platform"
+ "format": "uri",
+ "description": "The GitHub repository URL to associate with the account's sandbox environment. Must be a valid URL.",
+ "example": "https://github.com/org/repo"
},
- "segment_id": {
+ "account_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the fan's segments record"
- },
- "segment_name": {
- "type": "string",
- "description": "Name of the segment (e.g., 'Twitter Followers')"
- },
- "fan_social_id": {
+ "description": "UUID of the account to update the snapshot for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, updates the snapshot for the API key's own account."
+ }
+ }
+ },
+ "UpdateSnapshotResponse": {
+ "type": "object",
+ "required": [
+ "account_id",
+ "snapshot_id",
+ "expires_at",
+ "github_repo",
+ "created_at"
+ ],
+ "properties": {
+ "account_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the fan's socials media profile account"
+ "description": "The account ID this snapshot belongs to",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "region": {
+ "snapshot_id": {
"type": "string",
- "description": "Geographic region or location of the fan"
+ "description": "The snapshot ID that was set for the account",
+ "example": "snap_abc123def456"
},
- "bio": {
+ "expires_at": {
"type": "string",
- "description": "Fan's biography or profile description"
- },
- "follower_count": {
- "type": "integer",
- "description": "Number of followers the fan has"
- },
- "following_count": {
- "type": "integer",
- "description": "Number of accounts the fan is following"
+ "format": "date-time",
+ "description": "When the snapshot expires",
+ "example": "2027-01-01T00:00:00.000Z"
},
- "updated_at": {
+ "github_repo": {
+ "type": "string",
+ "nullable": true,
+ "description": "The GitHub repository URL associated with the sandbox",
+ "example": "https://github.com/org/repo"
+ },
+ "created_at": {
"type": "string",
"format": "date-time",
- "description": "ISO timestamp of when the fan data was last updated"
+ "nullable": true,
+ "description": "When the snapshot record was created",
+ "example": "2025-01-01T00:00:00.000Z"
}
}
},
- "ArtistPost": {
+ "Pulse": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
- "description": "Unique identifier for the post"
+ "description": "Unique identifier for the pulse"
},
- "post_url": {
+ "account_id": {
"type": "string",
- "description": "Direct URL to the post on the social platform"
+ "format": "uuid",
+ "description": "Unique identifier for the associated account"
},
- "updated_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO timestamp of when the post was last updated"
+ "active": {
+ "type": "boolean",
+ "description": "Whether the pulse is active (defaults to true)"
}
}
},
- "ArtistPostsPagination": {
+ "PulseResponse": {
"type": "object",
+ "required": [
+ "status",
+ "pulse"
+ ],
"properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of posts available"
- },
- "page": {
- "type": "integer",
- "description": "Current page number"
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ],
+ "description": "Status of the request"
},
- "limit": {
- "type": "integer",
- "description": "Number of posts per page"
+ "pulse": {
+ "$ref": "#/components/schemas/Pulse",
+ "description": "The pulse object"
},
- "total_pages": {
- "type": "integer",
- "description": "Total number of pages available"
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
}
}
},
- "ArtistPostsResponse": {
+ "PulsesResponse": {
"type": "object",
"required": [
"status",
- "posts",
- "pagination"
+ "pulses"
],
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
+ "success",
+ "error"
],
"description": "Status of the request"
},
- "posts": {
+ "pulses": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/ArtistPost"
+ "$ref": "#/components/schemas/Pulse"
},
- "description": "List of posts from the artist across all social platforms"
+ "description": "Array of pulse objects. Contains pulses for the authenticated account. If the account has access to organizations, all organization accounts are included."
},
- "pagination": {
- "$ref": "#/components/schemas/ArtistPostsPagination",
- "description": "Pagination metadata for the response"
+ "error": {
+ "type": "string",
+ "description": "Error message (only present if status is error)"
}
}
},
- "ArtistPostsErrorResponse": {
+ "UpdatePulseRequest": {
"type": "object",
"required": [
- "status",
- "error"
+ "active"
],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
+ "active": {
+ "type": "boolean",
+ "description": "Whether to enable or disable the pulse",
+ "example": true
},
- "error": {
+ "account_id": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "format": "uuid",
+ "description": "UUID of the account to update the pulse for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, updates the pulse for the API key's own account."
}
}
},
- "PostComment": {
+ "TaskRunResponse": {
"type": "object",
+ "description": "Raw Trigger.dev SDK run object. The API passes through the SDK response without field mapping. See https://trigger.dev/docs/management/runs/retrieve for the full reference. When listing runs, `output`, `error`, `payload`, and `attempts` are not included.",
"required": [
"id",
- "post_id",
- "social_id",
- "comment",
- "commented_at",
- "username",
- "profile_url",
- "post_url"
+ "status",
+ "taskIdentifier",
+ "createdAt",
+ "updatedAt"
],
"properties": {
"id": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the comment record"
+ "description": "The unique run identifier, prefixed with `run_`"
},
- "post_id": {
+ "status": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the post this comment belongs to"
+ "enum": [
+ "PENDING_VERSION",
+ "DELAYED",
+ "QUEUED",
+ "EXECUTING",
+ "REATTEMPTING",
+ "FROZEN",
+ "COMPLETED",
+ "CANCELED",
+ "FAILED",
+ "CRASHED",
+ "INTERRUPTED",
+ "SYSTEM_FAILURE"
+ ],
+ "description": "Current run status"
},
- "social_id": {
+ "taskIdentifier": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the social profile that made the comment"
+ "description": "The task type identifier (e.g. 'setup-sandbox', 'run-sandbox-command')"
},
- "comment": {
+ "idempotencyKey": {
"type": "string",
- "description": "Text content of the comment"
+ "nullable": true,
+ "description": "Idempotency key used to deduplicate trigger requests"
},
- "commented_at": {
+ "version": {
+ "type": "string",
+ "description": "The worker version that executed the run"
+ },
+ "isTest": {
+ "type": "boolean",
+ "description": "Whether this is a test run"
+ },
+ "createdAt": {
"type": "string",
"format": "date-time",
- "description": "ISO timestamp of when the comment was posted"
+ "description": "When the run was created (ISO 8601)"
},
- "username": {
+ "updatedAt": {
"type": "string",
- "description": "Username of the commenter"
+ "format": "date-time",
+ "description": "When the run was last updated (ISO 8601)"
},
- "avatar": {
+ "startedAt": {
"type": "string",
+ "format": "date-time",
"nullable": true,
- "description": "URL to the commenter's avatar image"
+ "description": "When execution started (null if not yet started)"
},
- "profile_url": {
+ "finishedAt": {
"type": "string",
- "description": "URL to the commenter's profile"
+ "format": "date-time",
+ "nullable": true,
+ "description": "When the run finished (null if still running)"
},
- "post_url": {
+ "delayedUntil": {
"type": "string",
- "description": "URL to the post where the comment was made"
+ "format": "date-time",
+ "nullable": true,
+ "description": "If delayed, when the run becomes eligible to execute"
},
- "region": {
+ "ttl": {
+ "description": "Time-to-live. If the run is not started within this duration, it expires.",
+ "nullable": true
+ },
+ "expiredAt": {
"type": "string",
+ "format": "date-time",
"nullable": true,
- "description": "Geographic region of the commenter"
+ "description": "When the run expired (null if not expired)"
},
- "bio": {
- "type": "string",
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Tags associated with this run (max 10)"
+ },
+ "metadata": {
+ "type": "object",
"nullable": true,
- "description": "Commenter's biography or description"
+ "description": "JSON metadata attached to the run"
},
- "follower_count": {
+ "costInCents": {
+ "type": "number",
+ "description": "Compute cost of the run in cents"
+ },
+ "baseCostInCents": {
+ "type": "number",
+ "description": "Base invocation cost in cents"
+ },
+ "durationMs": {
+ "type": "number",
+ "description": "Compute duration in milliseconds"
+ },
+ "env": {
+ "type": "object",
+ "description": "Environment the run executed in",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "user": {
+ "type": "string",
+ "nullable": true
+ }
+ }
+ },
+ "depth": {
"type": "integer",
+ "description": "Nesting depth for child runs"
+ },
+ "batchId": {
+ "type": "string",
"nullable": true,
- "description": "Number of followers the commenter has"
+ "description": "Batch ID if triggered as part of a batch"
+ },
+ "triggerFunction": {
+ "type": "string",
+ "enum": [
+ "trigger",
+ "triggerAndWait",
+ "batchTrigger",
+ "batchTriggerAndWait"
+ ],
+ "description": "The function used to trigger this run"
+ },
+ "payload": {
+ "description": "Input payload for the task. Only present when retrieving by runId.",
+ "nullable": true
+ },
+ "output": {
+ "description": "Task output data. Only present when retrieving by runId.",
+ "nullable": true
},
- "following_count": {
- "type": "integer",
+ "error": {
+ "type": "object",
"nullable": true,
- "description": "Number of accounts the commenter follows"
- }
- }
- },
- "PostCommentsPagination": {
- "type": "object",
- "properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of comments available"
+ "description": "Error details if the run failed. Only present when retrieving by runId.",
+ "properties": {
+ "message": {
+ "type": "string",
+ "description": "Human-readable error message"
+ },
+ "name": {
+ "type": "string",
+ "description": "Error name or type"
+ },
+ "stackTrace": {
+ "type": "string",
+ "description": "Stack trace"
+ }
+ }
},
- "page": {
- "type": "integer",
- "description": "Current page number"
+ "attempts": {
+ "type": "array",
+ "description": "Attempt history. Only present when retrieving by runId.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Attempt ID, prefixed with `attempt_`"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "PENDING",
+ "EXECUTING",
+ "PAUSED",
+ "COMPLETED",
+ "FAILED",
+ "CANCELED"
+ ]
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "startedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "completedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "error": {
+ "type": "object",
+ "nullable": true,
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "stackTrace": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
},
- "limit": {
- "type": "integer",
- "description": "Number of comments per page"
+ "schedule": {
+ "type": "object",
+ "nullable": true,
+ "description": "Schedule information if triggered by a schedule. Only present when retrieving by runId."
},
- "total_pages": {
- "type": "integer",
- "description": "Total number of pages available"
+ "relatedRuns": {
+ "type": "object",
+ "nullable": true,
+ "description": "Related run references (root, parent, children). Only present when retrieving by runId."
}
}
},
- "PostCommentsResponse": {
+ "TaskRunListResponse": {
"type": "object",
"required": [
"status",
- "comments",
- "pagination"
+ "runs"
],
"properties": {
"status": {
@@ -10578,622 +12811,703 @@
"enum": [
"success"
],
- "description": "Status of the request"
+ "description": "Indicates the request was successful"
},
- "comments": {
+ "runs": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/PostComment"
+ "$ref": "#/components/schemas/TaskRunResponse"
},
- "description": "List of comments for the specified post"
- },
- "pagination": {
- "$ref": "#/components/schemas/PostCommentsPagination",
- "description": "Pagination metadata for the response"
+ "description": "List of recent task runs for the authenticated account. Each item is a raw Trigger.dev SDK run object (same shape as TaskRunResponse, but without `output` and `error` fields)."
}
}
},
- "PostCommentsErrorResponse": {
+ "FileTreeEntry": {
"type": "object",
"required": [
- "status",
- "error"
+ "path",
+ "type",
+ "sha"
],
+ "description": "A single entry in a GitHub repository file tree",
"properties": {
- "status": {
+ "path": {
+ "type": "string",
+ "description": "The file or directory path relative to the repository root",
+ "example": "src/index.ts"
+ },
+ "type": {
"type": "string",
"enum": [
- "error"
+ "blob",
+ "tree"
],
- "description": "Status of the request"
+ "description": "The type of entry: blob for files, tree for directories"
},
- "error": {
+ "sha": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "The SHA hash of the entry",
+ "example": "abc123def456"
+ },
+ "size": {
+ "type": "integer",
+ "description": "The size of the file in bytes. Only present for blob entries.",
+ "example": 1024
}
}
},
- "Comment": {
+ "ContentCreateRequest": {
"type": "object",
+ "description": "Parameters for triggering the content creation pipeline.",
"properties": {
- "id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the comment"
- },
- "post_id": {
+ "artist_account_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the associated post"
+ "description": "UUID of the artist account to create content for. Use [GET /api/artists](/api-reference/artists/list) to find artist account IDs.",
+ "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
},
- "social_id": {
+ "template": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the social profile who made the comment"
+ "description": "The template to use for content generation. Defines the visual style, scene, and prompt configuration. If omitted, defaults to `artist-caption-bedroom`. See [GET /api/content/templates](/api-reference/content/templates) for available options.",
+ "example": "artist-caption-stage",
+ "default": "artist-caption-bedroom"
},
- "comment": {
- "type": "string",
- "description": "Comment text content"
+ "lipsync": {
+ "type": "boolean",
+ "description": "Whether to generate video with lip-synced audio. When `true`, uses an audio-to-video model that bakes audio into the video for lip movement. When `false`, generates video from the image alone and overlays audio in post. If omitted, the template's default workflow is used.",
+ "example": false
},
- "commented_at": {
+ "caption_length": {
"type": "string",
- "format": "date-time",
- "description": "Timestamp with timezone of when the comment was made"
- }
- }
- },
- "CommentsPagination": {
- "type": "object",
- "properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of comments available"
- },
- "page": {
- "type": "integer",
- "description": "Current page number"
+ "enum": [
+ "short",
+ "medium",
+ "long"
+ ],
+ "description": "Controls the length of the generated caption text. `short` produces 1-2 lines (punchy, minimal). `medium` produces 1-2 sentences. `long` produces a paragraph (stream of consciousness style). Defaults to `short`.",
+ "default": "short",
+ "example": "short"
},
- "limit": {
- "type": "integer",
- "description": "Number of comments per page"
+ "upscale": {
+ "type": "boolean",
+ "description": "Whether to upscale the generated image and video for higher resolution and detail. Adds approximately 2 minutes to the pipeline. Defaults to `false`.",
+ "default": false,
+ "example": false
},
- "total_pages": {
+ "batch": {
"type": "integer",
- "description": "Total number of pages available"
- }
- }
- },
- "CommentsResponse": {
- "type": "object",
- "required": [
- "status",
- "comments",
- "pagination"
- ],
- "properties": {
- "status": {
- "type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "minimum": 1,
+ "maximum": 30,
+ "description": "Number of videos to generate in parallel. Each video independently selects a random reference image, song clip, and mood variation. The response always returns `runIds` as an array. Defaults to `1`.",
+ "default": 1,
+ "example": 1
},
- "comments": {
+ "songs": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/Comment"
+ "type": "string"
},
- "description": "List of comments for the specified artist or post"
+ "description": "Optional list of song slugs or public URLs to use for the audio track. Song slugs match filenames without extension from the artist's `songs/` directory (e.g. `\"hiccups\"` for `hiccups.mp3`). Public URLs (e.g. `\"https://example.com/my-song.mp3\"`) are downloaded, transcribed, and clipped directly \u2014 bypassing the Git repo. When omitted, all songs in the artist's repo are eligible.",
+ "example": [
+ "hiccups",
+ "https://example.com/unreleased-track.mp3"
+ ]
},
- "pagination": {
- "$ref": "#/components/schemas/CommentsPagination",
- "description": "Pagination metadata for the response"
+ "images": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "uri"
+ },
+ "description": "Optional list of public image URLs to use as face guides instead of the artist's default `face-guide.png` from their GitHub repo. The first image is used as the primary face guide. Useful when the caller wants to override the default face reference.",
+ "example": [
+ "https://example.com/face.png"
+ ]
}
- }
+ },
+ "required": [
+ "artist_account_id"
+ ]
},
- "CommentsErrorResponse": {
+ "ContentCreateResponse": {
"type": "object",
"required": [
+ "runIds",
"status",
- "error"
+ "artist_account_id",
+ "template"
],
+ "description": "Confirmation that the content creation pipeline has been triggered. Always returns `runIds` as an array \u2014 even for a single run, it contains one element.",
"properties": {
+ "runIds": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Array of run IDs. Poll each via [GET /api/tasks/runs](/api-reference/tasks/runs). For single runs this contains one element.",
+ "example": [
+ "run_abc123def456"
+ ]
+ },
"status": {
"type": "string",
"enum": [
- "error"
+ "triggered"
],
- "description": "Status of the request"
+ "description": "Indicates the pipeline has been triggered"
},
- "error": {
+ "artist_account_id": {
"type": "string",
- "description": "Error message describing what went wrong"
- }
- }
- },
- "SegmentFansPagination": {
- "type": "object",
- "properties": {
- "total_count": {
- "type": "integer",
- "description": "Total number of records available"
+ "format": "uuid",
+ "description": "UUID of the artist account the pipeline is running for",
+ "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
},
- "page": {
- "type": "integer",
- "description": "Current page number"
+ "template": {
+ "type": "string",
+ "description": "The template being used",
+ "example": "artist-caption-bedroom"
},
- "limit": {
- "type": "integer",
- "description": "Number of records per page"
+ "lipsync": {
+ "type": "boolean",
+ "description": "Whether lip-sync mode is enabled",
+ "example": false
},
- "total_pages": {
+ "failed": {
"type": "integer",
- "description": "Total number of pages available"
+ "description": "Number of triggers that failed. Only present when some triggers failed.",
+ "example": 0
}
}
},
- "SegmentFansResponse": {
+ "ContentCreateErrorResponse": {
"type": "object",
"required": [
- "status",
- "fans",
- "pagination"
+ "error"
],
+ "description": "Returned when the artist is missing required files or the template is not found. Includes actionable instructions for resolving each issue.",
"properties": {
- "status": {
+ "error": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "description": "Human-readable error summary",
+ "example": "Artist 'new-artist' is not ready for content creation"
},
- "fans": {
+ "ready": {
+ "type": "boolean",
+ "description": "Always `false` when this error is returned",
+ "example": false
+ },
+ "missing": {
"type": "array",
+ "description": "List of missing files with severity and fix instructions. Only present when the artist fails validation.",
"items": {
- "$ref": "#/components/schemas/SegmentFan"
- },
- "description": "List of social profiles from fans in the segment"
+ "$ref": "#/components/schemas/ContentMissingFile"
+ }
},
- "pagination": {
- "$ref": "#/components/schemas/SegmentFansPagination",
- "description": "Pagination metadata for the response"
+ "available_templates": {
+ "type": "array",
+ "description": "List of valid template names. Only present when the requested template was not found.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "artist-caption-bedroom",
+ "artist-caption-outside",
+ "artist-caption-stage"
+ ]
}
}
},
- "SegmentFansErrorResponse": {
+ "ContentErrorResponse": {
"type": "object",
"required": [
- "status",
"error"
],
"properties": {
- "status": {
- "type": "string",
- "enum": [
- "error"
- ],
- "description": "Status of the request"
- },
"error": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "Error message describing what went wrong",
+ "example": "Unauthorized"
}
}
},
- "StripeSubscription": {
+ "ContentTemplatesResponse": {
"type": "object",
- "description": "A Stripe subscription object. For detailed information about all available properties, see the Stripe Subscription API documentation: https://docs.stripe.com/api/subscriptions/retrieve",
+ "required": [
+ "templates"
+ ],
+ "description": "List of available content creation templates.",
"properties": {
- "id": {
- "type": "string",
- "description": "Unique identifier for the subscription"
- },
- "object": {
- "type": "string",
- "enum": [
- "subscription"
- ],
- "description": "String representing the object's type"
- },
- "customer": {
- "type": "string",
- "description": "ID of the customer who owns this subscription"
- },
- "status": {
- "type": "string",
- "enum": [
- "active",
- "canceled",
- "incomplete",
- "incomplete_expired",
- "past_due",
- "trialing",
- "unpaid"
- ],
- "description": "The status of the subscription"
- },
- "currency": {
- "type": "string",
- "description": "Three-letter ISO currency code"
- },
- "current_period_start": {
- "type": "integer",
- "description": "Start of the current period (Unix timestamp)"
- },
- "current_period_end": {
- "type": "integer",
- "description": "End of the current period (Unix timestamp)"
- },
- "cancel_at_period_end": {
- "type": "boolean",
- "description": "If true, the subscription will be canceled at the end of the current period"
- },
- "created": {
- "type": "integer",
- "description": "Time at which the subscription was created (Unix timestamp)"
- },
- "items": {
- "type": "object",
- "description": "List of subscription items, each with an attached price",
- "properties": {
- "object": {
- "type": "string",
- "enum": [
- "list"
- ]
- },
- "data": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "object": {
- "type": "string",
- "enum": [
- "subscription_item"
- ]
- },
- "price": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "currency": {
- "type": "string"
- },
- "unit_amount": {
- "type": "integer",
- "description": "Price amount in cents"
- },
- "recurring": {
- "type": "object",
- "properties": {
- "interval": {
- "type": "string",
- "enum": [
- "day",
- "week",
- "month",
- "year"
- ]
- },
- "interval_count": {
- "type": "integer"
- }
- }
- }
- }
- },
- "quantity": {
- "type": "integer"
- }
- }
- }
- },
- "has_more": {
- "type": "boolean"
- },
- "total_count": {
- "type": "integer"
- }
+ "templates": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContentTemplate"
}
+ }
+ }
+ },
+ "ContentTemplate": {
+ "type": "object",
+ "required": [
+ "name",
+ "description",
+ "defaultLipsync"
+ ],
+ "description": "A content creation template that defines the visual style and composition for generated videos.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template identifier. Pass this as the `template` field in [POST /api/content/create](/api-reference/content/create).",
+ "example": "artist-caption-bedroom"
},
- "latest_invoice": {
+ "description": {
"type": "string",
- "description": "ID of the most recent invoice for this subscription"
+ "description": "Human-readable description of the template's visual style",
+ "example": "Moody purple bedroom setting with caption overlay"
},
- "livemode": {
+ "defaultLipsync": {
"type": "boolean",
- "description": "Indicates if in live mode (true) or test mode (false)"
- },
- "metadata": {
- "type": "object",
- "description": "Set of key-value pairs attached to the subscription"
+ "description": "Whether this template defaults to lip-sync mode when the `lipsync` flag is not explicitly set",
+ "example": false
}
}
},
- "SubscriptionResponse": {
+ "ContentValidateResponse": {
"type": "object",
"required": [
- "status",
- "subscription"
+ "ready",
+ "artist_account_id"
],
- "description": "Response for standard accounts with Stripe subscriptions",
+ "description": "Validation report for an artist's content creation readiness.",
"properties": {
- "status": {
+ "ready": {
+ "type": "boolean",
+ "description": "`true` if the artist has all required files and the pipeline can run. `false` if required files are missing.",
+ "example": true
+ },
+ "artist_account_id": {
"type": "string",
- "enum": [
- "success"
- ],
- "description": "Status of the request"
+ "format": "uuid",
+ "description": "UUID of the artist account that was validated",
+ "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
},
- "subscription": {
- "$ref": "#/components/schemas/StripeSubscription",
- "description": "The full Stripe subscription object"
+ "songs": {
+ "type": "integer",
+ "description": "Number of songs found in the artist's `songs/` directory",
+ "example": 17
+ },
+ "templates": {
+ "type": "array",
+ "description": "Available templates that can be used with this artist",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "artist-caption-bedroom",
+ "artist-caption-outside",
+ "artist-caption-stage"
+ ]
+ },
+ "checks": {
+ "type": "object",
+ "description": "Per-file validation results. Only present when `ready` is `true`.",
+ "properties": {
+ "face_guide": {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ "artist_context": {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ "audience_context": {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ "era_config": {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ "pipeline_config": {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ "songs": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ContentValidationCheck"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "count": {
+ "type": "integer",
+ "description": "Number of songs found",
+ "example": 17
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ "missing": {
+ "type": "array",
+ "description": "List of missing files with severity and fix instructions. Only present when `ready` is `false`.",
+ "items": {
+ "$ref": "#/components/schemas/ContentMissingFile"
+ }
}
}
},
- "EnterpriseSubscriptionResponse": {
+ "ContentValidationCheck": {
"type": "object",
"required": [
- "status",
- "isEnterprise"
+ "status"
],
- "description": "Response for accounts with enterprise plans",
+ "description": "Status of a single validation check.",
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
- ],
- "description": "Status of the request"
- },
- "isEnterprise": {
- "type": "boolean",
- "enum": [
- true
+ "ok",
+ "missing",
+ "warning"
],
- "description": "Indicates that the account has an enterprise plan"
+ "description": "Whether the file was found",
+ "example": "ok"
}
}
},
- "SubscriptionErrorResponse": {
+ "ContentMissingFile": {
"type": "object",
"required": [
- "status",
- "error"
+ "file",
+ "severity",
+ "description",
+ "fix"
],
+ "description": "A missing file that prevents or degrades content creation.",
"properties": {
- "status": {
+ "file": {
+ "type": "string",
+ "description": "Relative path of the missing file within the artist directory",
+ "example": "context/images/face-guide.png"
+ },
+ "severity": {
"type": "string",
"enum": [
- "error"
+ "required",
+ "recommended"
],
- "description": "Status of the request"
+ "description": "`required` means the pipeline will fail without this file. `recommended` means the pipeline will run but output quality is degraded.",
+ "example": "required"
},
- "error": {
+ "description": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "What this file is used for in the pipeline",
+ "example": "Face guide image used for AI image generation"
+ },
+ "fix": {
+ "type": "string",
+ "description": "Actionable instructions for creating or adding the missing file",
+ "example": "Generate a face guide using fal-ai/nano-banana-pro/edit with 2-3 reference photos of the artist"
}
}
},
- "CreateSandboxRequest": {
+ "ContentEstimateResponse": {
"type": "object",
- "description": "Request body for creating a new sandbox. All fields are optional - if no command or prompt is provided, sandbox is created without triggering a command execution task. Use prompt as a shortcut to run OpenCode with a given prompt instead of specifying command/args manually.",
+ "required": [
+ "workflows"
+ ],
+ "description": "Cost estimates based on current pricing. When `compare` is `false`, the `workflows` array contains a single entry. When `true`, it contains all available profiles.",
"properties": {
- "command": {
- "type": "string",
- "minLength": 1,
- "description": "The command to execute in the sandbox environment. If omitted, the sandbox is created without running any command.",
- "example": "ls"
- },
- "args": {
+ "workflows": {
"type": "array",
+ "description": "One or more workflow cost breakdowns",
"items": {
- "type": "string"
- },
- "description": "Optional arguments to pass to the command.",
- "example": [
- "-la",
- "/home"
- ]
+ "$ref": "#/components/schemas/ContentWorkflowEstimate"
+ }
},
- "cwd": {
- "type": "string",
- "description": "Optional working directory for command execution.",
- "example": "/home/user"
+ "comparison": {
+ "description": "Side-by-side summary. Only present when `compare` is `true` and multiple workflows are returned.",
+ "$ref": "#/components/schemas/ContentEstimateComparison"
},
- "prompt": {
+ "batch": {
+ "type": "object",
+ "description": "Batch cost projection. Only present when `batch` > 1.",
+ "properties": {
+ "count": {
+ "type": "integer",
+ "description": "Number of videos in the batch",
+ "example": 30
+ },
+ "cheapestTotal": {
+ "type": "number",
+ "format": "float",
+ "description": "Total cost for the batch using the cheapest workflow",
+ "example": 5.4
+ },
+ "mostExpensiveTotal": {
+ "type": "number",
+ "format": "float",
+ "description": "Total cost for the batch using the most expensive workflow",
+ "example": 28.5
+ }
+ }
+ }
+ }
+ },
+ "ContentWorkflowEstimate": {
+ "type": "object",
+ "required": [
+ "name",
+ "perVideo",
+ "steps"
+ ],
+ "description": "Cost breakdown for a single workflow profile.",
+ "properties": {
+ "name": {
"type": "string",
- "minLength": 1,
- "description": "A prompt to pass to OpenCode in the sandbox. When provided, the sandbox will execute `opencode run \"\"`. Cannot be used together with command.",
- "example": "create a hello world index.html"
+ "description": "Workflow profile name",
+ "example": "Current (image-to-video)"
},
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the account to create the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, creates the sandbox for the API key's own account."
+ "perVideo": {
+ "type": "number",
+ "format": "float",
+ "description": "Total estimated cost per video in USD",
+ "example": 0.82
+ },
+ "steps": {
+ "type": "array",
+ "description": "Per-step cost breakdown showing where the money goes",
+ "items": {
+ "$ref": "#/components/schemas/ContentStepEstimate"
+ }
+ },
+ "costBreakdown": {
+ "type": "object",
+ "description": "Summary of the biggest cost driver",
+ "properties": {
+ "mostExpensiveStep": {
+ "type": "string",
+ "description": "Name of the step that costs the most",
+ "example": "Generate Video"
+ },
+ "mostExpensivePercent": {
+ "type": "integer",
+ "description": "Percentage of total cost from the most expensive step",
+ "example": 68
+ }
+ }
}
}
},
- "Sandbox": {
+ "ContentStepEstimate": {
"type": "object",
"required": [
- "sandboxId",
- "sandboxStatus",
- "timeout",
- "createdAt"
+ "name",
+ "model",
+ "cost",
+ "note"
],
- "description": "A sandbox environment instance",
+ "description": "Cost details for a single pipeline step.",
"properties": {
- "sandboxId": {
+ "name": {
"type": "string",
- "description": "Unique identifier for the sandbox",
- "example": "sbx_abc123def456"
+ "description": "Pipeline step name",
+ "example": "Generate Image"
},
- "sandboxStatus": {
+ "model": {
"type": "string",
- "enum": [
- "pending",
- "running",
- "stopping",
- "stopped",
- "failed"
- ],
- "description": "Current lifecycle state of the sandbox",
- "example": "running"
+ "description": "The AI model or service used for this step",
+ "example": "fal-ai/nano-banana-pro/edit"
},
- "timeout": {
- "type": "integer",
- "description": "Milliseconds remaining before the sandbox stops automatically",
- "example": 300000
+ "cost": {
+ "type": "number",
+ "format": "float",
+ "description": "Estimated cost for this step in USD",
+ "example": 0.04
},
- "createdAt": {
+ "unit": {
"type": "string",
- "format": "date-time",
- "description": "ISO 8601 timestamp when the sandbox was created",
- "example": "2024-01-15T10:30:00.000Z"
+ "description": "Billing unit type (e.g., `images`, `seconds`, `megapixels`). Not present for free steps.",
+ "example": "images"
},
- "runId": {
+ "unitPrice": {
+ "type": "number",
+ "format": "float",
+ "description": "Price per billing unit in USD. Not present for free steps.",
+ "example": 0.04
+ },
+ "note": {
"type": "string",
- "description": "Unique identifier for the command execution run. Only present if a command was provided when creating the sandbox. Use this with [GET /api/tasks/runs](/api-reference/tasks/runs) to check the status and retrieve results.",
- "example": "run_xyz789abc123"
+ "description": "Human-readable calculation detail",
+ "example": "1 call"
}
}
},
- "SandboxesResponse": {
+ "ContentEstimateComparison": {
"type": "object",
"required": [
- "status",
- "sandboxes"
+ "cheapest",
+ "cheapestPerVideo",
+ "mostExpensive",
+ "mostExpensivePerVideo",
+ "savingsPercent"
],
- "description": "Response containing sandbox information",
+ "description": "Summary comparing the cheapest and most expensive workflow options.",
"properties": {
- "status": {
+ "cheapest": {
"type": "string",
- "enum": [
- "success",
- "error"
- ],
- "description": "Status of the request"
- },
- "sandboxes": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Sandbox"
- },
- "description": "Array of sandbox objects"
+ "description": "Name of the cheapest workflow profile",
+ "example": "Budget (no upscale, LTX video)"
},
- "snapshot_id": {
- "type": "string",
- "description": "The account's saved snapshot ID used for creating new sandboxes. Null if no snapshot has been saved.",
- "example": "snap_abc123def456",
- "nullable": true
+ "cheapestPerVideo": {
+ "type": "number",
+ "format": "float",
+ "description": "Cost per video for the cheapest workflow",
+ "example": 0.18
},
- "github_repo": {
+ "mostExpensive": {
"type": "string",
- "description": "The GitHub repository URL associated with the account's sandbox environment. Used as the filesystem source when restoring sandboxes.",
- "example": "https://github.com/username/repo",
- "nullable": true
+ "description": "Name of the most expensive workflow profile",
+ "example": "Current (audio-to-video)"
},
- "filetree": {
- "type": "array",
- "nullable": true,
- "description": "The recursive file tree of the account's GitHub repository. Null if no github_repo is set or if the fetch fails.",
- "items": {
- "$ref": "#/components/schemas/FileTreeEntry"
- }
+ "mostExpensivePerVideo": {
+ "type": "number",
+ "format": "float",
+ "description": "Cost per video for the most expensive workflow",
+ "example": 0.95
},
- "error": {
- "type": "string",
- "description": "Error message (only present if status is error)"
+ "savingsPercent": {
+ "type": "integer",
+ "description": "Percentage savings between the cheapest and most expensive workflows",
+ "example": 81
}
}
},
- "SandboxErrorResponse": {
+ "SongAnalyzeRequest": {
"type": "object",
- "required": [
- "error"
- ],
+ "description": "Provide exactly one of `preset` or `prompt`. Use `preset` for structured analysis workflows, or `prompt` for free-form questions.",
"properties": {
- "error": {
+ "preset": {
"type": "string",
- "description": "Error message describing what went wrong",
- "example": "Failed to create sandbox"
+ "enum": [
+ "catalog_metadata",
+ "mood_tags",
+ "lyric_transcription",
+ "mix_feedback",
+ "song_description",
+ "music_theory",
+ "similar_artists",
+ "sample_detection",
+ "sync_brief_match",
+ "audience_profile",
+ "content_advisory",
+ "playlist_pitch",
+ "artist_development_notes",
+ "full_report"
+ ],
+ "description": "Name of a curated analysis preset. Use instead of prompt for structured, optimized output. The 'full_report' preset runs all 13 presets in parallel and returns a comprehensive report. See [List Analyze Presets](/api-reference/songs/analyze-presets) for the full list of available presets.",
+ "example": "catalog_metadata"
+ },
+ "prompt": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 24000,
+ "description": "Text prompt or question about the music",
+ "example": "Describe the genre, tempo, and mood of this track."
+ },
+ "audio_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Public URL to an audio file (MP3, WAV, or FLAC \u2014 up to 20 minutes)",
+ "example": "https://example.com/song.mp3"
+ },
+ "max_new_tokens": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2048,
+ "default": 512,
+ "description": "Maximum number of tokens to generate",
+ "example": 512
+ },
+ "temperature": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 2,
+ "default": 1,
+ "description": "Controls output creativity \u2014 higher values produce more varied responses",
+ "example": 0.7
+ },
+ "top_p": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 1,
+ "default": 1,
+ "description": "Nucleus sampling probability cutoff",
+ "example": 0.9
+ },
+ "do_sample": {
+ "type": "boolean",
+ "default": false,
+ "description": "Enable sampling (set true when using temperature or top_p)",
+ "example": false
}
}
},
- "SandboxFileResponse": {
+ "SongAnalyzeResponse": {
"type": "object",
- "required": [
- "status",
- "content"
- ],
"properties": {
"status": {
"type": "string",
"enum": [
"success"
],
- "description": "Status of the operation"
+ "description": "Request status"
},
- "content": {
+ "preset": {
"type": "string",
- "description": "The raw text content of the file"
+ "description": "Preset used for analysis, when applicable",
+ "example": "catalog_metadata"
+ },
+ "response": {
+ "description": "Model output for single-preset or custom-prompt analysis. May be plain text or structured JSON depending on the preset."
+ },
+ "report": {
+ "type": "object",
+ "description": "Full report payload returned only when using the `full_report` preset"
+ },
+ "elapsed_seconds": {
+ "type": "number",
+ "format": "float",
+ "description": "Inference time in seconds"
}
}
},
- "UploadSandboxFilesRequest": {
+ "SongAnalyzeErrorResponse": {
"type": "object",
- "required": [
- "files"
- ],
"properties": {
- "path": {
+ "status": {
"type": "string",
- "description": "The target directory path within the repository to upload files to. Defaults to the repository root if omitted.",
- "example": "assets/images"
- },
- "files": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "url",
- "name"
- ],
- "properties": {
- "url": {
- "type": "string",
- "format": "uri",
- "description": "The URL of the file to upload",
- "example": "https://example.com/files/album-cover.png"
- },
- "name": {
- "type": "string",
- "description": "The filename to use when committing to the repository",
- "example": "album-cover.png"
- }
- }
- },
- "description": "Array of files to upload, each with a URL and target filename"
+ "enum": [
+ "error"
+ ],
+ "description": "Error status"
},
- "message": {
+ "missing_fields": {
+ "type": "array",
+ "description": "Path to the first invalid or missing field when validation fails",
+ "items": {
+ "type": "string"
+ }
+ },
+ "error": {
"type": "string",
- "description": "Optional commit message. Defaults to 'Upload files via API'.",
- "example": "Add new album artwork"
+ "description": "Error message describing what went wrong"
}
}
},
- "UploadSandboxFilesResponse": {
+ "CheckAdminResponse": {
"type": "object",
"required": [
"status",
- "uploaded"
+ "isAdmin"
],
"properties": {
"status": {
@@ -11201,73 +13515,156 @@
"enum": [
"success"
],
- "description": "Status of the operation"
+ "description": "Status of the request"
},
- "uploaded": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "path": {
- "type": "string",
- "description": "The full path of the uploaded file in the repository"
- },
- "sha": {
- "type": "string",
- "description": "The git SHA of the created/updated file"
- }
- }
- },
- "description": "Array of uploaded file details"
+ "isAdmin": {
+ "type": "boolean",
+ "description": "Whether the authenticated account is a Recoup admin"
}
}
},
- "SetupSandboxRequest": {
+ "AccountSandboxRow": {
"type": "object",
+ "required": [
+ "account_id",
+ "total_sandboxes",
+ "last_created_at"
+ ],
"properties": {
"account_id": {
"type": "string",
"format": "uuid",
- "description": "UUID of the account to set up the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, sets up the sandbox for the API key's own account."
+ "description": "The unique identifier of the account",
+ "example": "04e3aba9-c130-4fb8-8b92-34e95d43e66b"
+ },
+ "total_sandboxes": {
+ "type": "integer",
+ "description": "Total number of sandboxes created for this account",
+ "example": 5
+ },
+ "last_created_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO 8601 timestamp of the most recently created sandbox for this account",
+ "example": "2026-03-10T12:00:00Z"
+ },
+ "account_email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the account. Null if the account has no email set.",
+ "example": "alice@example.com"
}
- }
+ },
+ "description": ""
},
- "SetupSandboxResponse": {
+ "AdminSandboxesResponse": {
"type": "object",
"required": [
"status",
- "runId"
+ "accounts"
],
+ "description": "Response containing per-account sandbox statistics for admin use",
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
+ "success",
+ "error"
],
- "description": "Status of the setup operation"
+ "description": "Status of the request"
},
- "runId": {
- "type": "string",
- "description": "The Trigger.dev run ID for the setup-sandbox background task. Use this with [GET /api/tasks/runs](/api-reference/tasks/runs) to check the status and retrieve results.",
- "example": "run_abc123def456"
+ "accounts": {
+ "type": "array",
+ "description": "List of accounts with their sandbox statistics, ordered by most recently active first",
+ "items": {
+ "$ref": "#/components/schemas/AccountSandboxRow"
+ }
}
}
},
- "DeleteSandboxRequest": {
+ "OrgRepoRow": {
"type": "object",
+ "required": [
+ "repo_name",
+ "repo_url",
+ "total_commits",
+ "latest_commit_messages",
+ "earliest_committed_at",
+ "latest_committed_at",
+ "account_repos"
+ ],
+ "description": "Commit statistics for a single GitHub org repository",
"properties": {
- "account_id": {
+ "repo_name": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the account to delete the sandbox for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, deletes the sandbox for the API key's own account."
+ "description": "Repository name",
+ "example": "chat"
+ },
+ "repo_url": {
+ "type": "string",
+ "description": "Full GitHub HTML URL of the repository",
+ "example": "https://github.com/recoupable/chat"
+ },
+ "total_commits": {
+ "type": "integer",
+ "description": "Total number of commits in the repository",
+ "example": 5696
+ },
+ "latest_commit_messages": {
+ "type": "array",
+ "description": "Messages from the 5 most recent commits",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Merge test into main",
+ "fix: duration stuck at 0ms for in-progress tasks"
+ ]
+ },
+ "earliest_committed_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO 8601 timestamp of the earliest (first) commit",
+ "example": "2024-09-27T17:16:01Z"
+ },
+ "latest_committed_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO 8601 timestamp of the most recent commit",
+ "example": "2026-03-10T19:57:37Z"
+ },
+ "account_repos": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "account_id": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "nullable": true
+ },
+ "repo_url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "account_id",
+ "repo_url"
+ ]
+ },
+ "description": "List of accounts using this org repo as a submodule, with account_id, email, and repo_url"
}
}
},
- "DeleteSandboxResponse": {
+ "AdminEmailsResponse": {
"type": "object",
"required": [
- "status"
+ "status",
+ "emails"
],
+ "description": "Response containing Resend emails sent for an account",
"properties": {
"status": {
"type": "string",
@@ -11275,108 +13672,139 @@
"success",
"error"
],
- "description": "Status of the delete operation"
- },
- "deleted_snapshot": {
- "nullable": true,
- "description": "The snapshot record that was deleted. Null if no snapshot existed for the account.",
- "$ref": "#/components/schemas/UpdateSnapshotResponse"
+ "description": "Status of the request"
},
- "error": {
- "type": "string",
- "description": "Error message (only present if status is error)"
+ "emails": {
+ "type": "array",
+ "description": "List of emails sent for the account, ordered by created_at descending",
+ "items": {
+ "$ref": "#/components/schemas/PulseEmailRow"
+ }
}
}
},
- "UpdateSnapshotRequest": {
+ "PulseEmailRow": {
"type": "object",
- "required": [],
+ "required": [
+ "id",
+ "from",
+ "to",
+ "subject",
+ "created_at",
+ "last_event"
+ ],
+ "description": "A single email record from Resend (full GetEmailResponseSuccess). See [Resend API docs](https://resend.com/docs/api-reference/emails/retrieve-email) for the source of truth.",
"properties": {
- "snapshotId": {
+ "id": {
"type": "string",
- "description": "The snapshot ID to set for the account. This snapshot will be used as the base environment when creating new sandboxes.",
- "example": "snap_abc123def456"
+ "description": "The Resend email ID"
},
- "github_repo": {
+ "from": {
"type": "string",
- "format": "uri",
- "description": "The GitHub repository URL to associate with the account's sandbox environment. Must be a valid URL.",
- "example": "https://github.com/org/repo"
+ "description": "Sender email address"
},
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the account to update the snapshot for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, updates the snapshot for the API key's own account."
- }
- }
- },
- "UpdateSnapshotResponse": {
- "type": "object",
- "required": [
- "account_id",
- "snapshot_id",
- "expires_at",
- "github_repo",
- "created_at"
- ],
- "properties": {
- "account_id": {
- "type": "string",
- "format": "uuid",
- "description": "The account ID this snapshot belongs to",
- "example": "550e8400-e29b-41d4-a716-446655440000"
+ "to": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Recipient email addresses"
+ },
+ "cc": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "description": "CC recipient email addresses"
+ },
+ "bcc": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "description": "BCC recipient email addresses"
+ },
+ "reply_to": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "description": "Reply-to email addresses"
},
- "snapshot_id": {
+ "subject": {
"type": "string",
- "description": "The snapshot ID that was set for the account",
- "example": "snap_abc123def456"
+ "description": "Email subject line"
},
- "expires_at": {
+ "html": {
"type": "string",
- "format": "date-time",
- "description": "When the snapshot expires",
- "example": "2027-01-01T00:00:00.000Z"
+ "nullable": true,
+ "description": "HTML content of the email"
},
- "github_repo": {
+ "text": {
"type": "string",
"nullable": true,
- "description": "The GitHub repository URL associated with the sandbox",
- "example": "https://github.com/org/repo"
+ "description": "Plain text content of the email"
},
"created_at": {
"type": "string",
"format": "date-time",
- "nullable": true,
- "description": "When the snapshot record was created",
- "example": "2025-01-01T00:00:00.000Z"
- }
- }
- },
- "Pulse": {
- "type": "object",
- "properties": {
- "id": {
+ "description": "Timestamp when the email was created"
+ },
+ "scheduled_at": {
"type": "string",
- "format": "uuid",
- "description": "Unique identifier for the pulse"
+ "format": "date-time",
+ "nullable": true,
+ "description": "Scheduled send time, if any"
},
- "account_id": {
+ "last_event": {
"type": "string",
- "format": "uuid",
- "description": "Unique identifier for the associated account"
+ "enum": [
+ "bounced",
+ "canceled",
+ "clicked",
+ "complained",
+ "delivered",
+ "delivery_delayed",
+ "failed",
+ "opened",
+ "queued",
+ "scheduled",
+ "sent"
+ ],
+ "description": "Most recent delivery event for this email"
},
- "active": {
- "type": "boolean",
- "description": "Whether the pulse is active (defaults to true)"
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "value"
+ ]
+ },
+ "nullable": true,
+ "description": "Custom tags attached to the email"
}
}
},
- "PulseResponse": {
+ "AdminSandboxOrgsResponse": {
"type": "object",
"required": [
"status",
- "pulse"
+ "repos"
],
+ "description": "Response containing commit statistics for all org repositories",
"properties": {
"status": {
"type": "string",
@@ -11386,1823 +13814,1655 @@
],
"description": "Status of the request"
},
- "pulse": {
- "$ref": "#/components/schemas/Pulse",
- "description": "The pulse object"
- },
- "error": {
- "type": "string",
- "description": "Error message (only present if status is error)"
+ "repos": {
+ "type": "array",
+ "description": "List of org repos with their commit statistics, ordered by total_commits descending",
+ "items": {
+ "$ref": "#/components/schemas/OrgRepoRow"
+ }
}
}
},
- "PulsesResponse": {
+ "ContentCreateImageRequest": {
"type": "object",
- "required": [
- "status",
- "pulses"
- ],
"properties": {
- "status": {
+ "prompt": {
"type": "string",
- "enum": [
- "success",
- "error"
- ],
- "description": "Status of the request"
+ "description": "Optional prompt to guide image generation"
},
- "pulses": {
+ "reference_image_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL of a reference image for conditioning the generation"
+ },
+ "images": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/Pulse"
+ "type": "string",
+ "format": "uri"
},
- "description": "Array of pulse objects. Contains pulses for the authenticated account. If the account has access to organizations, all organization accounts are included."
+ "description": "Optional reference image URLs to guide generation"
},
- "error": {
+ "model": {
"type": "string",
- "description": "Error message (only present if status is error)"
+ "description": "fal.ai model ID. Defaults to fal-ai/nano-banana-pro/edit"
}
}
},
- "UpdatePulseRequest": {
+ "ContentCreateImageResponse": {
"type": "object",
"required": [
- "active"
+ "imageUrl"
],
"properties": {
- "active": {
- "type": "boolean",
- "description": "Whether to enable or disable the pulse",
- "example": true
- },
- "account_id": {
+ "imageUrl": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the account to update the pulse for. Only applicable when the authenticated account has access to multiple accounts via organization membership. If not provided, updates the pulse for the API key's own account."
+ "format": "uri",
+ "description": "URL of the generated image"
}
}
},
- "TaskRunResponse": {
+ "ContentCreateVideoRequest": {
"type": "object",
- "description": "Raw Trigger.dev SDK run object. The API passes through the SDK response without field mapping. See https://trigger.dev/docs/management/runs/retrieve for the full reference. When listing runs, `output`, `error`, `payload`, and `attempts` are not included.",
- "required": [
- "id",
- "status",
- "taskIdentifier",
- "createdAt",
- "updatedAt"
- ],
"properties": {
- "id": {
- "type": "string",
- "description": "The unique run identifier, prefixed with `run_`"
- },
- "status": {
+ "mode": {
"type": "string",
"enum": [
- "PENDING_VERSION",
- "DELAYED",
- "QUEUED",
- "EXECUTING",
- "REATTEMPTING",
- "FROZEN",
- "COMPLETED",
- "CANCELED",
- "FAILED",
- "CRASHED",
- "INTERRUPTED",
- "SYSTEM_FAILURE"
+ "prompt",
+ "animate",
+ "reference",
+ "extend",
+ "first-last",
+ "lipsync"
],
- "description": "Current run status"
- },
- "taskIdentifier": {
- "type": "string",
- "description": "The task type identifier (e.g. 'setup-sandbox', 'run-sandbox-command')"
- },
- "idempotencyKey": {
- "type": "string",
- "nullable": true,
- "description": "Idempotency key used to deduplicate trigger requests"
- },
- "version": {
- "type": "string",
- "description": "The worker version that executed the run"
- },
- "isTest": {
- "type": "boolean",
- "description": "Whether this is a test run"
- },
- "createdAt": {
- "type": "string",
- "format": "date-time",
- "description": "When the run was created (ISO 8601)"
- },
- "updatedAt": {
- "type": "string",
- "format": "date-time",
- "description": "When the run was last updated (ISO 8601)"
- },
- "startedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "When execution started (null if not yet started)"
- },
- "finishedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "When the run finished (null if still running)"
+ "description": "What kind of video to generate. If omitted, inferred from the inputs you provide."
},
- "delayedUntil": {
+ "prompt": {
"type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "If delayed, when the run becomes eligible to execute"
- },
- "ttl": {
- "description": "Time-to-live. If the run is not started within this duration, it expires.",
- "nullable": true
+ "description": "Text describing the video content, motion, or how to continue/extend"
},
- "expiredAt": {
+ "image_url": {
"type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "When the run expired (null if not expired)"
- },
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Tags associated with this run (max 10)"
- },
- "metadata": {
- "type": "object",
- "nullable": true,
- "description": "JSON metadata attached to the run"
- },
- "costInCents": {
- "type": "number",
- "description": "Compute cost of the run in cents"
- },
- "baseCostInCents": {
- "type": "number",
- "description": "Base invocation cost in cents"
- },
- "durationMs": {
- "type": "number",
- "description": "Compute duration in milliseconds"
+ "format": "uri",
+ "description": "Image URL. Used as the first frame (animate), style reference (reference), start frame (first-last), or face source (lipsync)"
},
- "env": {
- "type": "object",
- "description": "Environment the run executed in",
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "user": {
- "type": "string",
- "nullable": true
- }
- }
+ "end_image_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "End frame image URL. Only used with `first-last` mode"
},
- "depth": {
- "type": "integer",
- "description": "Nesting depth for child runs"
+ "video_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Video URL to extend. Only used with `extend` mode (max 8 seconds input)"
},
- "batchId": {
+ "audio_url": {
"type": "string",
- "nullable": true,
- "description": "Batch ID if triggered as part of a batch"
+ "format": "uri",
+ "description": "Audio URL for lipsync mode. The generated face will move in sync with this audio"
},
- "triggerFunction": {
+ "aspect_ratio": {
"type": "string",
"enum": [
- "trigger",
- "triggerAndWait",
- "batchTrigger",
- "batchTriggerAndWait"
+ "auto",
+ "16:9",
+ "9:16"
],
- "description": "The function used to trigger this run"
- },
- "payload": {
- "description": "Input payload for the task. Only present when retrieving by runId.",
- "nullable": true
+ "default": "auto",
+ "description": "Aspect ratio of the output video"
},
- "output": {
- "description": "Task output data. Only present when retrieving by runId.",
- "nullable": true
+ "duration": {
+ "type": "string",
+ "enum": [
+ "4s",
+ "6s",
+ "7s",
+ "8s"
+ ],
+ "default": "8s",
+ "description": "Duration of the generated video"
},
- "error": {
- "type": "object",
- "nullable": true,
- "description": "Error details if the run failed. Only present when retrieving by runId.",
- "properties": {
- "message": {
- "type": "string",
- "description": "Human-readable error message"
- },
- "name": {
- "type": "string",
- "description": "Error name or type"
- },
- "stackTrace": {
- "type": "string",
- "description": "Stack trace"
- }
- }
+ "resolution": {
+ "type": "string",
+ "enum": [
+ "720p",
+ "1080p",
+ "4k"
+ ],
+ "default": "720p",
+ "description": "Output resolution"
},
- "attempts": {
- "type": "array",
- "description": "Attempt history. Only present when retrieving by runId.",
- "items": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "description": "Attempt ID, prefixed with `attempt_`"
- },
- "status": {
- "type": "string",
- "enum": [
- "PENDING",
- "EXECUTING",
- "PAUSED",
- "COMPLETED",
- "FAILED",
- "CANCELED"
- ]
- },
- "createdAt": {
- "type": "string",
- "format": "date-time"
- },
- "updatedAt": {
- "type": "string",
- "format": "date-time"
- },
- "startedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "completedAt": {
- "type": "string",
- "format": "date-time",
- "nullable": true
- },
- "error": {
- "type": "object",
- "nullable": true,
- "properties": {
- "message": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "stackTrace": {
- "type": "string"
- }
- }
- }
- }
- }
+ "negative_prompt": {
+ "type": "string",
+ "description": "Describe what you do NOT want in the video"
},
- "schedule": {
- "type": "object",
- "nullable": true,
- "description": "Schedule information if triggered by a schedule. Only present when retrieving by runId."
+ "generate_audio": {
+ "type": "boolean",
+ "default": false,
+ "description": "Generate audio for the video"
},
- "relatedRuns": {
- "type": "object",
- "nullable": true,
- "description": "Related run references (root, parent, children). Only present when retrieving by runId."
+ "model": {
+ "type": "string",
+ "description": "Override the model. Auto-selected based on mode if omitted"
}
}
},
- "TaskRunListResponse": {
+ "ContentCreateVideoResponse": {
"type": "object",
"required": [
- "status",
- "runs"
+ "videoUrl"
],
"properties": {
- "status": {
+ "videoUrl": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL of the generated video"
+ }
+ }
+ },
+ "ContentCreateTextRequest": {
+ "type": "object",
+ "required": [
+ "topic"
+ ],
+ "properties": {
+ "topic": {
+ "type": "string",
+ "description": "The subject or theme for caption generation"
+ },
+ "length": {
"type": "string",
"enum": [
- "success"
+ "short",
+ "medium",
+ "long"
],
- "description": "Indicates the request was successful"
+ "default": "short",
+ "description": "Desired text length"
+ }
+ }
+ },
+ "ContentCreateTextResponse": {
+ "type": "object",
+ "required": [
+ "content",
+ "color",
+ "borderColor",
+ "maxFontSize"
+ ],
+ "properties": {
+ "content": {
+ "type": "string",
+ "description": "Generated on-screen text content"
},
- "runs": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TaskRunResponse"
- },
- "description": "List of recent task runs for the authenticated account. Each item is a raw Trigger.dev SDK run object (same shape as TaskRunResponse, but without `output` and `error` fields)."
+ "font": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Font name for the text, or null for default"
+ },
+ "color": {
+ "type": "string",
+ "description": "Text color as a CSS color value",
+ "example": "#FFFFFF"
+ },
+ "borderColor": {
+ "type": "string",
+ "description": "Text border/stroke color as a CSS color value",
+ "example": "#000000"
+ },
+ "maxFontSize": {
+ "type": "number",
+ "description": "Maximum font size in pixels",
+ "example": 48
+ }
+ }
+ },
+ "ContentCreateAudioSegment": {
+ "type": "object",
+ "required": [
+ "start",
+ "end",
+ "text"
+ ],
+ "properties": {
+ "start": {
+ "type": "number",
+ "description": "Segment start time in seconds"
+ },
+ "end": {
+ "type": "number",
+ "description": "Segment end time in seconds"
+ },
+ "text": {
+ "type": "string",
+ "description": "Transcribed text for this segment"
}
}
},
- "FileTreeEntry": {
+ "ContentCreateAudioRequest": {
"type": "object",
"required": [
- "path",
- "type",
- "sha"
+ "audio_urls"
],
- "description": "A single entry in a GitHub repository file tree",
"properties": {
- "path": {
- "type": "string",
- "description": "The file or directory path relative to the repository root",
- "example": "src/index.ts"
- },
- "type": {
- "type": "string",
- "enum": [
- "blob",
- "tree"
- ],
- "description": "The type of entry: blob for files, tree for directories"
+ "audio_urls": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "format": "uri"
+ },
+ "minItems": 1,
+ "description": "Audio file URLs to transcribe"
},
- "sha": {
+ "model": {
"type": "string",
- "description": "The SHA hash of the entry",
- "example": "abc123def456"
- },
- "size": {
- "type": "integer",
- "description": "The size of the file in bytes. Only present for blob entries.",
- "example": 1024
+ "description": "fal.ai model ID. Defaults to fal-ai/whisper"
}
}
},
- "ContentCreateRequest": {
+ "ContentCreateAudioResponse": {
"type": "object",
- "description": "Parameters for triggering the content creation pipeline.",
+ "required": [
+ "songUrl",
+ "fullLyrics",
+ "segments",
+ "segmentCount"
+ ],
"properties": {
- "artist_account_id": {
- "type": "string",
- "format": "uuid",
- "description": "UUID of the artist account to create content for. Use [GET /api/artists](/api-reference/artists/list) to find artist account IDs.",
- "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
- },
- "template": {
+ "songUrl": {
"type": "string",
- "description": "The template to use for content generation. Defines the visual style, scene, and prompt configuration. If omitted, defaults to `artist-caption-bedroom`. See [GET /api/content/templates](/api-reference/content/templates) for available options.",
- "example": "artist-caption-stage",
- "default": "artist-caption-bedroom"
- },
- "lipsync": {
- "type": "boolean",
- "description": "Whether to generate video with lip-synced audio. When `true`, uses an audio-to-video model that bakes audio into the video for lip movement. When `false`, generates video from the image alone and overlays audio in post. If omitted, the template's default workflow is used.",
- "example": false
+ "description": "URL of the transcribed song"
},
- "caption_length": {
+ "fullLyrics": {
"type": "string",
- "enum": [
- "short",
- "medium",
- "long"
- ],
- "description": "Controls the length of the generated caption text. `short` produces 1-2 lines (punchy, minimal). `medium` produces 1-2 sentences. `long` produces a paragraph (stream of consciousness style). Defaults to `short`.",
- "default": "short",
- "example": "short"
- },
- "upscale": {
- "type": "boolean",
- "description": "Whether to upscale the generated image and video for higher resolution and detail. Adds approximately 2 minutes to the pipeline. Defaults to `false`.",
- "default": false,
- "example": false
- },
- "batch": {
- "type": "integer",
- "minimum": 1,
- "maximum": 30,
- "description": "Number of videos to generate in parallel. Each video independently selects a random reference image, song clip, and mood variation. The response always returns `runIds` as an array. Defaults to `1`.",
- "default": 1,
- "example": 1
+ "description": "Complete transcribed lyrics as a single string"
},
- "songs": {
+ "segments": {
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/ContentCreateAudioSegment"
},
- "description": "Optional list of song slugs or public URLs to use for the audio track. Song slugs match filenames without extension from the artist's `songs/` directory (e.g. `\"hiccups\"` for `hiccups.mp3`). Public URLs (e.g. `\"https://example.com/my-song.mp3\"`) are downloaded, transcribed, and clipped directly — bypassing the Git repo. When omitted, all songs in the artist's repo are eligible.",
- "example": [
- "hiccups",
- "https://example.com/unreleased-track.mp3"
- ]
+ "description": "Timestamped lyric segments"
},
- "images": {
- "type": "array",
- "items": {
- "type": "string",
- "format": "uri"
- },
- "description": "Optional list of public image URLs to use as face guides instead of the artist's default `face-guide.png` from their GitHub repo. The first image is used as the primary face guide. Useful when the caller wants to override the default face reference.",
- "example": [
- "https://example.com/face.png"
- ]
+ "segmentCount": {
+ "type": "number",
+ "description": "Total number of segments returned"
}
- },
- "required": [
- "artist_account_id"
- ]
+ }
},
- "ContentCreateResponse": {
+ "ContentCreateEditRequest": {
"type": "object",
- "required": [
- "runIds",
- "status",
- "artist_account_id",
- "template"
- ],
- "description": "Confirmation that the content creation pipeline has been triggered. Always returns `runIds` as an array — even for a single run, it contains one element.",
"properties": {
- "runIds": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "description": "Array of run IDs. Poll each via [GET /api/tasks/runs](/api-reference/tasks/runs). For single runs this contains one element.",
- "example": [
- "run_abc123def456"
- ]
- },
- "status": {
+ "video_url": {
"type": "string",
- "enum": [
- "triggered"
- ],
- "description": "Indicates the pipeline has been triggered"
+ "format": "uri",
+ "description": "Input video URL"
},
- "artist_account_id": {
+ "audio_url": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the artist account the pipeline is running for",
- "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
+ "format": "uri",
+ "description": "Input audio URL"
},
"template": {
"type": "string",
- "description": "The template being used",
- "example": "artist-caption-bedroom"
+ "description": "Template name for deterministic edit config. If provided, operations are read from the template."
},
- "lipsync": {
- "type": "boolean",
- "description": "Whether lip-sync mode is enabled",
- "example": false
+ "operations": {
+ "type": "array",
+ "description": "Array of edit operations to apply in order. Required if template is not provided.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "trim",
+ "crop",
+ "resize",
+ "overlay_text",
+ "mux_audio"
+ ],
+ "description": "Operation type"
+ },
+ "start": {
+ "type": "number",
+ "description": "Start time in seconds (trim)"
+ },
+ "duration": {
+ "type": "number",
+ "description": "Duration in seconds (trim)"
+ },
+ "aspect": {
+ "type": "string",
+ "description": "Aspect ratio e.g. 9:16 (crop)"
+ },
+ "width": {
+ "type": "integer",
+ "description": "Width in pixels (crop/resize)"
+ },
+ "height": {
+ "type": "integer",
+ "description": "Height in pixels (crop/resize)"
+ },
+ "content": {
+ "type": "string",
+ "description": "Text content (overlay_text)"
+ },
+ "font": {
+ "type": "string",
+ "description": "Font name (overlay_text)"
+ },
+ "color": {
+ "type": "string",
+ "description": "Text color (overlay_text)"
+ },
+ "stroke_color": {
+ "type": "string",
+ "description": "Text stroke color (overlay_text)"
+ },
+ "max_font_size": {
+ "type": "number",
+ "description": "Maximum font size (overlay_text)"
+ },
+ "position": {
+ "type": "string",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "description": "Text position (overlay_text)"
+ },
+ "audio_url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Audio URL to mux (mux_audio)"
+ },
+ "replace": {
+ "type": "boolean",
+ "description": "Replace existing audio (mux_audio)"
+ }
+ }
+ }
},
- "failed": {
- "type": "integer",
- "description": "Number of triggers that failed. Only present when some triggers failed.",
- "example": 0
+ "output_format": {
+ "type": "string",
+ "enum": [
+ "mp4",
+ "webm",
+ "mov"
+ ],
+ "default": "mp4",
+ "description": "Output format"
}
}
},
- "ContentCreateErrorResponse": {
+ "ContentCreateEditResponse": {
"type": "object",
"required": [
- "error"
+ "runId",
+ "status"
],
- "description": "Returned when the artist is missing required files or the template is not found. Includes actionable instructions for resolving each issue.",
"properties": {
- "error": {
+ "runId": {
"type": "string",
- "description": "Human-readable error summary",
- "example": "Artist 'new-artist' is not ready for content creation"
- },
- "ready": {
- "type": "boolean",
- "description": "Always `false` when this error is returned",
- "example": false
- },
- "missing": {
- "type": "array",
- "description": "List of missing files with severity and fix instructions. Only present when the artist fails validation.",
- "items": {
- "$ref": "#/components/schemas/ContentMissingFile"
- }
+ "description": "Background task run ID. Poll via [GET /api/tasks/runs](/api-reference/tasks/runs) to check progress."
},
- "available_templates": {
- "type": "array",
- "description": "List of valid template names. Only present when the requested template was not found.",
- "items": {
- "type": "string"
- },
- "example": [
- "artist-caption-bedroom",
- "artist-caption-outside",
- "artist-caption-stage"
- ]
+ "status": {
+ "type": "string",
+ "enum": [
+ "triggered"
+ ],
+ "description": "Status of the edit task"
}
}
},
- "ContentErrorResponse": {
+ "ContentCreateUpscaleRequest": {
"type": "object",
"required": [
- "error"
+ "url",
+ "type"
],
"properties": {
- "error": {
+ "url": {
"type": "string",
- "description": "Error message describing what went wrong",
- "example": "Unauthorized"
+ "format": "uri",
+ "description": "URL of the image or video to upscale"
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "image",
+ "video"
+ ],
+ "description": "Whether the input is an image or video"
}
}
},
- "ContentTemplatesResponse": {
+ "ContentCreateUpscaleResponse": {
"type": "object",
"required": [
- "templates"
+ "url"
],
- "description": "List of available content creation templates.",
"properties": {
- "templates": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ContentTemplate"
- }
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "URL of the upscaled image or video"
}
}
},
- "ContentTemplate": {
+ "ContentCreateAnalyzeRequest": {
"type": "object",
"required": [
- "name",
- "description",
- "defaultLipsync"
+ "video_url",
+ "prompt"
],
- "description": "A content creation template that defines the visual style and composition for generated videos.",
"properties": {
- "name": {
+ "video_url": {
"type": "string",
- "description": "Template identifier. Pass this as the `template` field in [POST /api/content/create](/api-reference/content/create).",
- "example": "artist-caption-bedroom"
+ "format": "uri",
+ "description": "Publicly accessible URL of the video to analyze. Supported formats: MP4, MOV, AVI, and other FFmpeg-compatible formats. Maximum duration: 1 hour."
},
- "description": {
+ "prompt": {
"type": "string",
- "description": "Human-readable description of the template's visual style",
- "example": "Moody purple bedroom setting with caption overlay"
+ "maxLength": 2000,
+ "description": "A text prompt that guides the analysis. Can be instructive, descriptive, or phrased as a question. Examples: \"Describe the key moments in this video\", \"Generate 5 SEO keywords for this video\"."
},
- "defaultLipsync": {
- "type": "boolean",
- "description": "Whether this template defaults to lip-sync mode when the `lipsync` flag is not explicitly set",
- "example": false
+ "temperature": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 1,
+ "default": 0.2,
+ "description": "Controls the randomness of the text output. Lower values produce more focused results. Defaults to `0.2`."
+ },
+ "max_tokens": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 4096,
+ "description": "Maximum number of tokens to generate. If omitted, uses the model default."
}
}
},
- "ContentValidateResponse": {
+ "ContentCreateAnalyzeResponse": {
"type": "object",
"required": [
- "ready",
- "artist_account_id"
+ "text"
],
- "description": "Validation report for an artist's content creation readiness.",
"properties": {
- "ready": {
- "type": "boolean",
- "description": "`true` if the artist has all required files and the pipeline can run. `false` if required files are missing.",
- "example": true
- },
- "artist_account_id": {
+ "text": {
"type": "string",
- "format": "uuid",
- "description": "UUID of the artist account that was validated",
- "example": "1873859c-dd37-4e9a-9bac-80d3558527a9"
- },
- "songs": {
- "type": "integer",
- "description": "Number of songs found in the artist's `songs/` directory",
- "example": 17
+ "description": "The generated analysis text based on the video and prompt."
},
- "templates": {
- "type": "array",
- "description": "Available templates that can be used with this artist",
- "items": {
- "type": "string"
- },
- "example": [
- "artist-caption-bedroom",
- "artist-caption-outside",
- "artist-caption-stage"
- ]
+ "finish_reason": {
+ "type": "string",
+ "enum": [
+ "stop",
+ "length"
+ ],
+ "nullable": true,
+ "description": "`stop` if the generation completed normally. `length` if truncated at the token limit."
},
- "checks": {
+ "usage": {
"type": "object",
- "description": "Per-file validation results. Only present when `ready` is `true`.",
+ "nullable": true,
"properties": {
- "face_guide": {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- "artist_context": {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- "audience_context": {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- "era_config": {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- "pipeline_config": {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- "songs": {
- "allOf": [
- {
- "$ref": "#/components/schemas/ContentValidationCheck"
- },
- {
- "type": "object",
- "properties": {
- "count": {
- "type": "integer",
- "description": "Number of songs found",
- "example": 17
- }
- }
- }
- ]
+ "output_tokens": {
+ "type": "integer",
+ "description": "Number of tokens in the generated text."
}
}
- },
- "missing": {
- "type": "array",
- "description": "List of missing files with severity and fix instructions. Only present when `ready` is `false`.",
- "items": {
- "$ref": "#/components/schemas/ContentMissingFile"
- }
}
}
},
- "ContentValidationCheck": {
+ "ResearchAlbum": {
"type": "object",
- "required": [
- "status"
- ],
- "description": "Status of a single validation check.",
"properties": {
- "status": {
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "release_date": {
"type": "string",
- "enum": [
- "ok",
- "missing",
- "warning"
- ],
- "description": "Whether the file was found",
- "example": "ok"
+ "nullable": true
}
- }
+ },
+ "additionalProperties": true
},
- "ContentMissingFile": {
+ "ResearchAlbumsResponse": {
"type": "object",
- "required": [
- "file",
- "severity",
- "description",
- "fix"
- ],
- "description": "A missing file that prevents or degrades content creation.",
"properties": {
- "file": {
- "type": "string",
- "description": "Relative path of the missing file within the artist directory",
- "example": "context/images/face-guide.png"
- },
- "severity": {
+ "status": {
"type": "string",
"enum": [
- "required",
- "recommended"
- ],
- "description": "`required` means the pipeline will fail without this file. `recommended` means the pipeline will run but output quality is degraded.",
- "example": "required"
- },
- "description": {
- "type": "string",
- "description": "What this file is used for in the pipeline",
- "example": "Face guide image used for AI image generation"
+ "success",
+ "error"
+ ]
},
- "fix": {
- "type": "string",
- "description": "Actionable instructions for creating or adding the missing file",
- "example": "Generate a face guide using fal-ai/nano-banana-pro/edit with 2-3 reference photos of the artist"
+ "albums": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchAlbum"
+ }
}
}
},
- "ContentEstimateResponse": {
+ "ResearchAudienceResponse": {
"type": "object",
- "required": [
- "workflows"
- ],
- "description": "Cost estimates based on current pricing. When `compare` is `false`, the `workflows` array contains a single entry. When `true`, it contains all available profiles.",
+ "description": "Audience demographics breakdown \u2014 age ranges, gender split, and country distribution for the specified platform.",
"properties": {
- "workflows": {
+ "status": {
+ "type": "string"
+ },
+ "age": {
"type": "array",
- "description": "One or more workflow cost breakdowns",
+ "description": "Age range breakdown",
"items": {
- "$ref": "#/components/schemas/ContentWorkflowEstimate"
+ "type": "object",
+ "additionalProperties": true
}
},
- "comparison": {
- "description": "Side-by-side summary. Only present when `compare` is `true` and multiple workflows are returned.",
- "$ref": "#/components/schemas/ContentEstimateComparison"
- },
- "batch": {
+ "gender": {
"type": "object",
- "description": "Batch cost projection. Only present when `batch` > 1.",
- "properties": {
- "count": {
- "type": "integer",
- "description": "Number of videos in the batch",
- "example": 30
- },
- "cheapestTotal": {
- "type": "number",
- "format": "float",
- "description": "Total cost for the batch using the cheapest workflow",
- "example": 5.4
- },
- "mostExpensiveTotal": {
- "type": "number",
- "format": "float",
- "description": "Total cost for the batch using the most expensive workflow",
- "example": 28.5
- }
+ "description": "Gender split percentages",
+ "additionalProperties": true
+ },
+ "countries": {
+ "type": "array",
+ "description": "Top countries by audience share",
+ "items": {
+ "type": "object",
+ "additionalProperties": true
}
}
- }
+ },
+ "additionalProperties": true
},
- "ContentWorkflowEstimate": {
+ "ResearchCareerResponse": {
"type": "object",
- "required": [
- "name",
- "perVideo",
- "steps"
- ],
- "description": "Cost breakdown for a single workflow profile.",
+ "description": "Career timeline \u2014 milestones, trajectory, and career stage history.",
"properties": {
- "name": {
- "type": "string",
- "description": "Workflow profile name",
- "example": "Current (image-to-video)"
+ "status": {
+ "type": "string"
},
- "perVideo": {
- "type": "number",
- "format": "float",
- "description": "Total estimated cost per video in USD",
- "example": 0.82
+ "career_stage": {
+ "type": "string",
+ "description": "Current career stage (e.g., 'Mid-Level', 'Superstar')"
},
- "steps": {
+ "data": {
"type": "array",
- "description": "Per-step cost breakdown showing where the money goes",
+ "description": "Career timeline data points",
"items": {
- "$ref": "#/components/schemas/ContentStepEstimate"
+ "type": "object",
+ "additionalProperties": true
}
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchChartsResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "costBreakdown": {
+ "data": {
"type": "object",
- "description": "Summary of the biggest cost driver",
- "properties": {
- "mostExpensiveStep": {
- "type": "string",
- "description": "Name of the step that costs the most",
- "example": "Generate Video"
- },
- "mostExpensivePercent": {
- "type": "integer",
- "description": "Percentage of total cost from the most expensive step",
- "example": 68
- }
- }
+ "description": "Chart data \u2014 structure varies by platform.",
+ "additionalProperties": true
}
}
},
- "ContentStepEstimate": {
+ "ResearchCitiesEntry": {
"type": "object",
- "required": [
- "name",
- "model",
- "cost",
- "note"
- ],
- "description": "Cost details for a single pipeline step.",
"properties": {
"name": {
"type": "string",
- "description": "Pipeline step name",
- "example": "Generate Image"
+ "description": "City name."
},
- "model": {
+ "country": {
"type": "string",
- "description": "The AI model or service used for this step",
- "example": "fal-ai/nano-banana-pro/edit"
- },
- "cost": {
- "type": "number",
- "format": "float",
- "description": "Estimated cost for this step in USD",
- "example": 0.04
+ "description": "ISO country code."
},
- "unit": {
+ "listeners": {
+ "type": "integer",
+ "description": "Listener count in this city."
+ }
+ }
+ },
+ "ResearchCitiesResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
- "description": "Billing unit type (e.g., `images`, `seconds`, `megapixels`). Not present for free steps.",
- "example": "images"
- },
- "unitPrice": {
- "type": "number",
- "format": "float",
- "description": "Price per billing unit in USD. Not present for free steps.",
- "example": 0.04
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "note": {
- "type": "string",
- "description": "Human-readable calculation detail",
- "example": "1 call"
+ "cities": {
+ "type": "array",
+ "description": "Cities ranked by listener concentration.",
+ "items": {
+ "$ref": "#/components/schemas/ResearchCitiesEntry"
+ }
}
}
},
- "ContentEstimateComparison": {
+ "ResearchCuratorResponse": {
"type": "object",
- "required": [
- "cheapest",
- "cheapestPerVideo",
- "mostExpensive",
- "mostExpensivePerVideo",
- "savingsPercent"
- ],
- "description": "Summary comparing the cheapest and most expensive workflow options.",
"properties": {
- "cheapest": {
+ "status": {
"type": "string",
- "description": "Name of the cheapest workflow profile",
- "example": "Budget (no upscale, LTX video)"
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "cheapestPerVideo": {
- "type": "number",
- "format": "float",
- "description": "Cost per video for the cheapest workflow",
- "example": 0.18
+ "name": {
+ "type": "string"
},
- "mostExpensive": {
+ "id": {
+ "type": "integer"
+ },
+ "image_url": {
"type": "string",
- "description": "Name of the most expensive workflow profile",
- "example": "Current (audio-to-video)"
+ "format": "uri",
+ "nullable": true
},
- "mostExpensivePerVideo": {
- "type": "number",
- "format": "float",
- "description": "Cost per video for the most expensive workflow",
- "example": 0.95
+ "num_playlists": {
+ "type": "integer",
+ "nullable": true
},
- "savingsPercent": {
+ "followers": {
"type": "integer",
- "description": "Percentage savings between the cheapest and most expensive workflows",
- "example": 81
+ "nullable": true
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchDeepRequest": {
+ "type": "object",
+ "required": [
+ "query"
+ ],
+ "description": "Request body for deep research. Performs comprehensive multi-source analysis.",
+ "properties": {
+ "query": {
+ "type": "string",
+ "description": "The research question \u2014 be specific and detailed for best results."
}
}
},
- "SongAnalyzeRequest": {
+ "ResearchDeepResponse": {
"type": "object",
- "description": "Provide exactly one of `preset` or `prompt`. Use `preset` for structured analysis workflows, or `prompt` for free-form questions.",
+ "description": "Comprehensive research report with citations.",
"properties": {
- "preset": {
+ "status": {
"type": "string",
"enum": [
- "catalog_metadata",
- "mood_tags",
- "lyric_transcription",
- "mix_feedback",
- "song_description",
- "music_theory",
- "similar_artists",
- "sample_detection",
- "sync_brief_match",
- "audience_profile",
- "content_advisory",
- "playlist_pitch",
- "artist_development_notes",
- "full_report"
- ],
- "description": "Name of a curated analysis preset. Use instead of prompt for structured, optimized output. The 'full_report' preset runs all 13 presets in parallel and returns a comprehensive report. See [List Analyze Presets](/api-reference/songs/analyze-presets) for the full list of available presets.",
- "example": "catalog_metadata"
+ "success",
+ "error"
+ ]
},
- "prompt": {
+ "content": {
"type": "string",
- "minLength": 1,
- "maxLength": 24000,
- "description": "Text prompt or question about the music",
- "example": "Describe the genre, tempo, and mood of this track."
+ "description": "The full research report as markdown."
},
- "audio_url": {
- "type": "string",
- "format": "uri",
- "description": "Public URL to an audio file (MP3, WAV, or FLAC — up to 20 minutes)",
- "example": "https://example.com/song.mp3"
+ "citations": {
+ "type": "array",
+ "description": "Source URLs cited in the report.",
+ "items": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "ResearchDiscoverArtist": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
},
- "max_new_tokens": {
+ "id": {
+ "type": "integer"
+ },
+ "sp_monthly_listeners": {
"type": "integer",
- "minimum": 1,
- "maximum": 2048,
- "default": 512,
- "description": "Maximum number of tokens to generate",
- "example": 512
+ "nullable": true
},
- "temperature": {
- "type": "number",
- "minimum": 0,
- "maximum": 2,
- "default": 1,
- "description": "Controls output creativity — higher values produce more varied responses",
- "example": 0.7
+ "sp_followers": {
+ "type": "integer",
+ "nullable": true
},
- "top_p": {
- "type": "number",
- "minimum": 0,
- "maximum": 1,
- "default": 1,
- "description": "Nucleus sampling probability cutoff",
- "example": 0.9
+ "tiktok_followers": {
+ "type": "integer",
+ "nullable": true
},
- "do_sample": {
- "type": "boolean",
- "default": false,
- "description": "Enable sampling (set true when using temperature or top_p)",
- "example": false
+ "ins_followers": {
+ "type": "integer",
+ "nullable": true
+ },
+ "country": {
+ "type": "string",
+ "nullable": true,
+ "description": "ISO country code."
}
- }
+ },
+ "additionalProperties": true
},
- "SongAnalyzeResponse": {
+ "ResearchDiscoverResponse": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
- ],
- "description": "Request status"
+ "success",
+ "error"
+ ]
},
- "preset": {
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchDiscoverArtist"
+ }
+ }
+ }
+ },
+ "ResearchEnrichRequest": {
+ "type": "object",
+ "required": [
+ "input",
+ "schema"
+ ],
+ "properties": {
+ "input": {
"type": "string",
- "description": "Preset used for analysis, when applicable",
- "example": "catalog_metadata"
- },
- "response": {
- "description": "Model output for single-preset or custom-prompt analysis. May be plain text or structured JSON depending on the preset."
+ "description": "What to research (e.g., \"Drake rapper from Dallas Texas\")."
},
- "report": {
+ "schema": {
"type": "object",
- "description": "Full report payload returned only when using the `full_report` preset"
+ "description": "JSON schema defining the fields to extract.",
+ "additionalProperties": true
},
- "elapsed_seconds": {
- "type": "number",
- "format": "float",
- "description": "Inference time in seconds"
+ "processor": {
+ "type": "string",
+ "enum": [
+ "base",
+ "core",
+ "ultra"
+ ],
+ "default": "base",
+ "description": "Research depth: base (fast), core (balanced), ultra (comprehensive)."
}
}
},
- "SongAnalyzeErrorResponse": {
+ "ResearchEnrichResponse": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
+ "success",
"error"
- ],
- "description": "Error status"
+ ]
},
- "missing_fields": {
+ "output": {
+ "type": "object",
+ "description": "Structured data matching the provided schema.",
+ "additionalProperties": true
+ },
+ "research_basis": {
+ "type": "object",
+ "properties": {
+ "citations": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "title": {
+ "type": "string"
+ },
+ "field": {
+ "type": "string",
+ "description": "Which output field this citation supports."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "ResearchExtractRequest": {
+ "type": "object",
+ "required": [
+ "urls"
+ ],
+ "properties": {
+ "urls": {
"type": "array",
- "description": "Path to the first invalid or missing field when validation fails",
"items": {
- "type": "string"
- }
+ "type": "string",
+ "format": "uri"
+ },
+ "maxItems": 10,
+ "description": "URLs to extract content from (max 10)."
},
- "error": {
+ "objective": {
"type": "string",
- "description": "Error message describing what went wrong"
+ "description": "What information to focus on (optional, max 3000 chars)."
+ },
+ "full_content": {
+ "type": "boolean",
+ "default": false,
+ "description": "Return full page content instead of focused excerpts."
}
}
},
- "CheckAdminResponse": {
+ "ResearchExtractResponse": {
"type": "object",
- "required": [
- "status",
- "isAdmin"
- ],
"properties": {
"status": {
"type": "string",
"enum": [
- "success"
- ],
- "description": "Status of the request"
+ "success",
+ "error"
+ ]
},
- "isAdmin": {
- "type": "boolean",
- "description": "Whether the authenticated account is a Recoup admin"
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchExtractResult"
+ }
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ },
+ "description": "URLs that failed to extract."
}
}
},
- "AccountSandboxRow": {
+ "ResearchExtractResult": {
"type": "object",
- "required": [
- "account_id",
- "total_sandboxes",
- "last_created_at"
- ],
"properties": {
- "account_id": {
+ "url": {
"type": "string",
- "format": "uuid",
- "description": "The unique identifier of the account",
- "example": "04e3aba9-c130-4fb8-8b92-34e95d43e66b"
+ "format": "uri"
},
- "total_sandboxes": {
- "type": "integer",
- "description": "Total number of sandboxes created for this account",
- "example": 5
+ "title": {
+ "type": "string",
+ "nullable": true
},
- "last_created_at": {
+ "publish_date": {
"type": "string",
- "format": "date-time",
- "description": "ISO 8601 timestamp of the most recently created sandbox for this account",
- "example": "2026-03-10T12:00:00Z"
+ "nullable": true,
+ "description": "Publish date in YYYY-MM-DD format."
},
- "account_email": {
+ "excerpts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "description": "Focused excerpts as markdown."
+ },
+ "full_content": {
"type": "string",
"nullable": true,
- "description": "The email address of the account. Null if the account has no email set.",
- "example": "alice@example.com"
+ "description": "Full page content as markdown."
+ }
+ }
+ },
+ "ResearchFestival": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string",
+ "nullable": true
+ },
+ "country": {
+ "type": "string",
+ "nullable": true
}
},
- "description": ""
+ "additionalProperties": true
},
- "AdminSandboxesResponse": {
+ "ResearchFestivalsResponse": {
"type": "object",
- "required": [
- "status",
- "accounts"
- ],
- "description": "Response containing per-account sandbox statistics for admin use",
"properties": {
"status": {
"type": "string",
"enum": [
"success",
"error"
- ],
- "description": "Status of the request"
+ ]
},
- "accounts": {
+ "festivals": {
"type": "array",
- "description": "List of accounts with their sandbox statistics, ordered by most recently active first",
"items": {
- "$ref": "#/components/schemas/AccountSandboxRow"
+ "$ref": "#/components/schemas/ResearchFestival"
}
}
}
},
- "OrgRepoRow": {
+ "ResearchGenre": {
"type": "object",
- "required": [
- "repo_name",
- "repo_url",
- "total_commits",
- "latest_commit_messages",
- "earliest_committed_at",
- "latest_committed_at",
- "account_repos"
- ],
- "description": "Commit statistics for a single GitHub org repository",
"properties": {
- "repo_name": {
- "type": "string",
- "description": "Repository name",
- "example": "chat"
+ "name": {
+ "type": "string"
},
- "repo_url": {
+ "id": {
+ "type": "integer"
+ }
+ }
+ },
+ "ResearchGenresResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
- "description": "Full GitHub HTML URL of the repository",
- "example": "https://github.com/recoupable/chat"
- },
- "total_commits": {
- "type": "integer",
- "description": "Total number of commits in the repository",
- "example": 5696
- },
- "latest_commit_messages": {
- "type": "array",
- "description": "Messages from the 5 most recent commits",
- "items": {
- "type": "string"
- },
- "example": [
- "Merge test into main",
- "fix: duration stuck at 0ms for in-progress tasks"
+ "enum": [
+ "success",
+ "error"
]
},
- "earliest_committed_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO 8601 timestamp of the earliest (first) commit",
- "example": "2024-09-27T17:16:01Z"
- },
- "latest_committed_at": {
- "type": "string",
- "format": "date-time",
- "description": "ISO 8601 timestamp of the most recent commit",
- "example": "2026-03-10T19:57:37Z"
- },
- "account_repos": {
+ "genres": {
"type": "array",
"items": {
- "type": "object",
- "properties": {
- "account_id": {
- "type": "string"
- },
- "email": {
- "type": "string",
- "nullable": true
- },
- "repo_url": {
- "type": "string"
- }
- },
- "required": [
- "account_id",
- "repo_url"
- ]
- },
- "description": "List of accounts using this org repo as a submodule, with account_id, email, and repo_url"
+ "$ref": "#/components/schemas/ResearchGenre"
+ }
}
}
},
- "AdminEmailsResponse": {
+ "ResearchInsight": {
+ "type": "object",
+ "properties": {
+ "text": {
+ "type": "string",
+ "description": "The insight text."
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchInsightsResponse": {
"type": "object",
- "required": [
- "status",
- "emails"
- ],
- "description": "Response containing Resend emails sent for an account",
"properties": {
"status": {
"type": "string",
"enum": [
"success",
"error"
- ],
- "description": "Status of the request"
+ ]
},
- "emails": {
+ "insights": {
"type": "array",
- "description": "List of emails sent for the account, ordered by created_at descending",
"items": {
- "$ref": "#/components/schemas/PulseEmailRow"
+ "$ref": "#/components/schemas/ResearchInsight"
}
}
}
},
- "PulseEmailRow": {
+ "ResearchInstagramPostsResponse": {
"type": "object",
- "required": [
- "id",
- "from",
- "to",
- "subject",
- "created_at",
- "last_event"
- ],
- "description": "A single email record from Resend (full GetEmailResponseSuccess). See [Resend API docs](https://resend.com/docs/api-reference/emails/retrieve-email) for the source of truth.",
+ "description": "Top Instagram posts and reels sorted by engagement.",
"properties": {
- "id": {
- "type": "string",
- "description": "The Resend email ID"
- },
- "from": {
- "type": "string",
- "description": "Sender email address"
+ "status": {
+ "type": "string"
},
- "to": {
+ "posts": {
"type": "array",
"items": {
- "type": "string"
- },
- "description": "Recipient email addresses"
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "likes": {
+ "type": "integer"
+ },
+ "comments": {
+ "type": "integer"
+ },
+ "timestamp": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
+ }
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchLookupResponse": {
+ "type": "object",
+ "description": "Artist profile resolved from a platform URL or ID.",
+ "properties": {
+ "status": {
+ "type": "string"
},
- "cc": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "nullable": true,
- "description": "CC recipient email addresses"
+ "id": {
+ "type": "integer",
+ "description": "Chartmetric artist ID"
},
- "bcc": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "nullable": true,
- "description": "BCC recipient email addresses"
+ "spotify_id": {
+ "type": "string"
},
- "reply_to": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "nullable": true,
- "description": "Reply-to email addresses"
+ "apple_music_id": {
+ "type": "string"
},
- "subject": {
- "type": "string",
- "description": "Email subject line"
+ "deezer_id": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchMetricsResponse": {
+ "type": "object",
+ "description": "Time-series metrics for a specific platform. Shape varies by source \u2014 typically an array of data points with timestamps and values (followers, listeners, views, etc.).",
+ "properties": {
+ "status": {
+ "type": "string"
},
- "html": {
+ "data": {
+ "type": "array",
+ "description": "Array of time-series data points. Fields vary by platform.",
+ "items": {
+ "type": "object",
+ "additionalProperties": true
+ }
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchMilestone": {
+ "type": "object",
+ "properties": {
+ "date": {
"type": "string",
- "nullable": true,
- "description": "HTML content of the email"
+ "description": "Date of the milestone event."
},
- "text": {
+ "summary": {
"type": "string",
- "nullable": true,
- "description": "Plain text content of the email"
+ "description": "Human-readable description of the event."
},
- "created_at": {
+ "platform": {
"type": "string",
- "format": "date-time",
- "description": "Timestamp when the email was created"
+ "description": "Platform where the event occurred (e.g. spotify, apple_music)."
},
- "scheduled_at": {
+ "track_name": {
"type": "string",
- "format": "date-time",
- "nullable": true,
- "description": "Scheduled send time, if any"
+ "description": "Name of the track involved, if any."
},
- "last_event": {
+ "stars": {
+ "type": "integer",
+ "description": "Importance rating (1-5 stars)."
+ }
+ }
+ },
+ "ResearchMilestonesResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
"enum": [
- "bounced",
- "canceled",
- "clicked",
- "complained",
- "delivered",
- "delivery_delayed",
- "failed",
- "opened",
- "queued",
- "scheduled",
- "sent"
- ],
- "description": "Most recent delivery event for this email"
+ "success",
+ "error"
+ ]
},
- "tags": {
+ "milestones": {
"type": "array",
"items": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "value"
- ]
- },
- "nullable": true,
- "description": "Custom tags attached to the email"
+ "$ref": "#/components/schemas/ResearchMilestone"
+ }
}
}
},
- "AdminSandboxOrgsResponse": {
+ "ResearchPeopleRequest": {
"type": "object",
"required": [
- "status",
- "repos"
+ "query"
],
- "description": "Response containing commit statistics for all org repositories",
+ "properties": {
+ "query": {
+ "type": "string",
+ "description": "Natural language search for people (e.g., \"A&R reps at Atlantic Records\")."
+ },
+ "num_results": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10,
+ "description": "Number of results to return."
+ }
+ }
+ },
+ "ResearchPeopleResponse": {
+ "type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"success",
"error"
- ],
- "description": "Status of the request"
+ ]
},
- "repos": {
+ "results": {
"type": "array",
- "description": "List of org repos with their commit statistics, ordered by total_commits descending",
"items": {
- "$ref": "#/components/schemas/OrgRepoRow"
+ "$ref": "#/components/schemas/ResearchPeopleResult"
}
}
}
},
- "ContentCreateImageRequest": {
+ "ResearchPeopleResult": {
"type": "object",
"properties": {
- "prompt": {
+ "title": {
"type": "string",
- "description": "Optional prompt to guide image generation"
+ "description": "Person name and role."
},
- "reference_image_url": {
+ "url": {
"type": "string",
"format": "uri",
- "description": "URL of a reference image for conditioning the generation"
+ "description": "Profile URL (often LinkedIn)."
},
- "images": {
+ "highlights": {
"type": "array",
"items": {
- "type": "string",
- "format": "uri"
+ "type": "string"
},
- "description": "Optional reference image URLs to guide generation"
+ "description": "Key excerpts from the profile."
},
- "model": {
+ "summary": {
"type": "string",
- "description": "fal.ai model ID. Defaults to fal-ai/nano-banana-pro/edit"
+ "nullable": true,
+ "description": "Brief summary of the person."
}
}
},
- "ContentCreateImageResponse": {
+ "ResearchPlaylistPlacement": {
"type": "object",
- "required": [
- "imageUrl"
- ],
"properties": {
- "imageUrl": {
+ "playlist_name": {
+ "type": "string"
+ },
+ "track_name": {
+ "type": "string"
+ },
+ "position": {
+ "type": "integer",
+ "nullable": true
+ },
+ "peak_position": {
+ "type": "integer",
+ "nullable": true
+ },
+ "followers": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Playlist follower count."
+ },
+ "added_at": {
"type": "string",
- "format": "uri",
- "description": "URL of the generated image"
+ "nullable": true,
+ "description": "When the track was added."
+ },
+ "removed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "When the track was removed (past placements only)."
+ },
+ "curator_name": {
+ "type": "string",
+ "nullable": true
}
- }
+ },
+ "additionalProperties": true
},
- "ContentCreateVideoRequest": {
+ "ResearchPlaylistResponse": {
"type": "object",
+ "description": "Playlist metadata \u2014 name, description, follower count, track count, and curator info.",
"properties": {
- "mode": {
+ "status": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "description": {
+ "type": "string"
+ },
+ "followers": {
+ "type": "integer"
+ },
+ "num_tracks": {
+ "type": "integer"
+ },
+ "curator_name": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchPlaylistsResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
"enum": [
- "prompt",
- "animate",
- "reference",
- "extend",
- "first-last",
- "lipsync"
- ],
- "description": "What kind of video to generate. If omitted, inferred from the inputs you provide."
+ "success",
+ "error"
+ ]
+ },
+ "placements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchPlaylistPlacement"
+ }
+ }
+ }
+ },
+ "ResearchProfileResponse": {
+ "type": "object",
+ "description": "Full artist profile \u2014 bio, genres, social links, label, images, and basic stats.",
+ "properties": {
+ "status": {
+ "type": "string"
},
- "prompt": {
- "type": "string",
- "description": "Text describing the video content, motion, or how to continue/extend"
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer",
+ "description": "Chartmetric artist ID"
},
"image_url": {
- "type": "string",
- "format": "uri",
- "description": "Image URL. Used as the first frame (animate), style reference (reference), start frame (first-last), or face source (lipsync)"
+ "type": "string"
},
- "end_image_url": {
- "type": "string",
- "format": "uri",
- "description": "End frame image URL. Only used with `first-last` mode"
+ "genres": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "video_url": {
- "type": "string",
- "format": "uri",
- "description": "Video URL to extend. Only used with `extend` mode (max 8 seconds input)"
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "audio_url": {
- "type": "string",
- "format": "uri",
- "description": "Audio URL for lipsync mode. The generated face will move in sync with this audio"
+ "description": {
+ "type": "string"
},
- "aspect_ratio": {
- "type": "string",
- "enum": [
- "auto",
- "16:9",
- "9:16"
- ],
- "default": "auto",
- "description": "Aspect ratio of the output video"
+ "hometown": {
+ "type": "string"
},
- "duration": {
- "type": "string",
- "enum": [
- "4s",
- "6s",
- "7s",
- "8s"
- ],
- "default": "8s",
- "description": "Duration of the generated video"
+ "record_label": {
+ "type": "string"
},
- "resolution": {
- "type": "string",
- "enum": [
- "720p",
- "1080p",
- "4k"
- ],
- "default": "720p",
- "description": "Output resolution"
+ "sp_followers": {
+ "type": "integer"
},
- "negative_prompt": {
+ "sp_monthly_listeners": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchRadioResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
"type": "string",
- "description": "Describe what you do NOT want in the video"
- },
- "generate_audio": {
- "type": "boolean",
- "default": false,
- "description": "Generate audio for the video"
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "model": {
- "type": "string",
- "description": "Override the model. Auto-selected based on mode if omitted"
+ "stations": {
+ "type": "array",
+ "description": "Radio stations tracked by Chartmetric.",
+ "items": {
+ "type": "object",
+ "additionalProperties": true
+ }
}
}
},
- "ContentCreateVideoResponse": {
+ "ResearchRankResponse": {
"type": "object",
- "required": [
- "videoUrl"
- ],
"properties": {
- "videoUrl": {
+ "status": {
"type": "string",
- "format": "uri",
- "description": "URL of the generated video"
+ "enum": [
+ "success",
+ "error"
+ ]
+ },
+ "rank": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Global Chartmetric artist rank."
}
}
},
- "ContentCreateTextRequest": {
+ "ResearchSearchResponse": {
"type": "object",
- "required": [
- "topic"
- ],
"properties": {
- "topic": {
- "type": "string",
- "description": "The subject or theme for caption generation"
- },
- "length": {
+ "status": {
"type": "string",
"enum": [
- "short",
- "medium",
- "long"
- ],
- "default": "short",
- "description": "Desired text length"
+ "success",
+ "error"
+ ]
+ },
+ "results": {
+ "type": "array",
+ "description": "Matching artists with IDs, names, and basic metadata.",
+ "items": {
+ "$ref": "#/components/schemas/ResearchSearchResult"
+ }
}
}
},
- "ContentCreateTextResponse": {
+ "ResearchSearchResult": {
"type": "object",
- "required": [
- "content",
- "color",
- "borderColor",
- "maxFontSize"
- ],
"properties": {
- "content": {
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer",
+ "description": "Internal ID for use with other research endpoints."
+ },
+ "spotify_id": {
"type": "string",
- "description": "Generated on-screen text content"
+ "nullable": true
+ }
+ },
+ "additionalProperties": true
+ },
+ "ResearchSimilarArtist": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
},
- "font": {
- "type": [
- "string",
- "null"
- ],
- "description": "Font name for the text, or null for default"
+ "id": {
+ "type": "integer"
},
- "color": {
+ "similarity": {
+ "type": "number",
+ "description": "Similarity score (0-1)."
+ },
+ "career_stage": {
"type": "string",
- "description": "Text color as a CSS color value",
- "example": "#FFFFFF"
+ "description": "undiscovered, developing, mid-level, mainstream, superstar, or legendary."
},
- "borderColor": {
+ "recent_momentum": {
"type": "string",
- "description": "Text border/stroke color as a CSS color value",
- "example": "#000000"
+ "description": "decline, gradual decline, steady, growth, or explosive growth."
},
- "maxFontSize": {
- "type": "number",
- "description": "Maximum font size in pixels",
- "example": 48
+ "sp_followers": {
+ "type": "integer",
+ "nullable": true
+ },
+ "sp_monthly_listeners": {
+ "type": "integer",
+ "nullable": true
}
- }
+ },
+ "additionalProperties": true
},
- "ContentCreateAudioSegment": {
+ "ResearchSimilarResponse": {
"type": "object",
- "required": [
- "start",
- "end",
- "text"
- ],
"properties": {
- "start": {
- "type": "number",
- "description": "Segment start time in seconds"
+ "status": {
+ "type": "string",
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "end": {
- "type": "number",
- "description": "Segment end time in seconds"
+ "artists": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchSimilarArtist"
+ }
},
- "text": {
- "type": "string",
- "description": "Transcribed text for this segment"
+ "total": {
+ "type": "integer"
}
}
},
- "ContentCreateAudioRequest": {
+ "ResearchTrackItem": {
"type": "object",
- "required": [
- "audio_urls"
- ],
"properties": {
- "audio_urls": {
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "album_names": {
"type": "array",
"items": {
- "type": "string",
- "format": "uri"
+ "type": "string"
},
- "minItems": 1,
- "description": "Audio file URLs to transcribe"
- },
- "model": {
- "type": "string",
- "description": "fal.ai model ID. Defaults to fal-ai/whisper"
+ "nullable": true
}
- }
+ },
+ "additionalProperties": true
},
- "ContentCreateAudioResponse": {
+ "ResearchTrackResponse": {
"type": "object",
- "required": [
- "songUrl",
- "fullLyrics",
- "segments",
- "segmentCount"
- ],
+ "description": "Track metadata \u2014 title, artist, album, release date, popularity, and platform IDs.",
"properties": {
- "songUrl": {
- "type": "string",
- "description": "URL of the transcribed song"
+ "status": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer",
+ "description": "Chartmetric track ID"
+ },
+ "isrc": {
+ "type": "string"
},
- "fullLyrics": {
- "type": "string",
- "description": "Complete transcribed lyrics as a single string"
+ "album_name": {
+ "type": "string"
},
- "segments": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ContentCreateAudioSegment"
- },
- "description": "Timestamped lyric segments"
+ "release_date": {
+ "type": "string"
},
- "segmentCount": {
- "type": "number",
- "description": "Total number of segments returned"
+ "artist_names": {
+ "type": "string"
}
- }
+ },
+ "additionalProperties": true
},
- "ContentCreateEditRequest": {
+ "ResearchTracksResponse": {
"type": "object",
"properties": {
- "video_url": {
- "type": "string",
- "format": "uri",
- "description": "Input video URL"
- },
- "audio_url": {
- "type": "string",
- "format": "uri",
- "description": "Input audio URL"
- },
- "template": {
+ "status": {
"type": "string",
- "description": "Template name for deterministic edit config. If provided, operations are read from the template."
+ "enum": [
+ "success",
+ "error"
+ ]
},
- "operations": {
+ "tracks": {
"type": "array",
- "description": "Array of edit operations to apply in order. Required if template is not provided.",
"items": {
- "type": "object",
- "required": [
- "type"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "trim",
- "crop",
- "resize",
- "overlay_text",
- "mux_audio"
- ],
- "description": "Operation type"
- },
- "start": {
- "type": "number",
- "description": "Start time in seconds (trim)"
- },
- "duration": {
- "type": "number",
- "description": "Duration in seconds (trim)"
- },
- "aspect": {
- "type": "string",
- "description": "Aspect ratio e.g. 9:16 (crop)"
- },
- "width": {
- "type": "integer",
- "description": "Width in pixels (crop/resize)"
- },
- "height": {
- "type": "integer",
- "description": "Height in pixels (crop/resize)"
- },
- "content": {
- "type": "string",
- "description": "Text content (overlay_text)"
- },
- "font": {
- "type": "string",
- "description": "Font name (overlay_text)"
- },
- "color": {
- "type": "string",
- "description": "Text color (overlay_text)"
- },
- "stroke_color": {
- "type": "string",
- "description": "Text stroke color (overlay_text)"
- },
- "max_font_size": {
- "type": "number",
- "description": "Maximum font size (overlay_text)"
- },
- "position": {
- "type": "string",
- "enum": [
- "top",
- "center",
- "bottom"
- ],
- "description": "Text position (overlay_text)"
- },
- "audio_url": {
- "type": "string",
- "format": "uri",
- "description": "Audio URL to mux (mux_audio)"
- },
- "replace": {
- "type": "boolean",
- "description": "Replace existing audio (mux_audio)"
- }
- }
+ "$ref": "#/components/schemas/ResearchTrackItem"
}
- },
- "output_format": {
- "type": "string",
- "enum": [
- "mp4",
- "webm",
- "mov"
- ],
- "default": "mp4",
- "description": "Output format"
}
}
},
- "ContentCreateEditResponse": {
+ "ResearchUrlEntry": {
"type": "object",
- "required": [
- "runId",
- "status"
- ],
"properties": {
- "runId": {
+ "domain": {
"type": "string",
- "description": "Background task run ID. Poll via [GET /api/tasks/runs](/api-reference/tasks/runs) to check progress."
+ "description": "Platform name (e.g., spotify, instagram)."
},
+ "url": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ },
+ "ResearchUrlsResponse": {
+ "type": "object",
+ "properties": {
"status": {
"type": "string",
"enum": [
- "triggered"
- ],
- "description": "Status of the edit task"
+ "success",
+ "error"
+ ]
+ },
+ "urls": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchUrlEntry"
+ }
}
}
},
- "ContentCreateUpscaleRequest": {
+ "ResearchVenue": {
"type": "object",
- "required": [
- "url",
- "type"
- ],
"properties": {
- "url": {
+ "venue_name": {
"type": "string",
- "format": "uri",
- "description": "URL of the image or video to upscale"
+ "description": "Name of the venue."
},
- "type": {
+ "venue_capacity": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Venue capacity (seats or standing)."
+ },
+ "city_name": {
"type": "string",
- "enum": [
- "image",
- "video"
- ],
- "description": "Whether the input is an image or video"
+ "description": "City where the venue is located."
+ },
+ "country": {
+ "type": "string",
+ "description": "Two-letter country code."
+ },
+ "events": {
+ "type": "array",
+ "description": "Events the artist performed at this venue.",
+ "items": {
+ "type": "object",
+ "additionalProperties": true
+ }
}
}
},
- "ContentCreateUpscaleResponse": {
+ "ResearchVenuesResponse": {
"type": "object",
- "required": [
- "url"
- ],
"properties": {
- "url": {
+ "status": {
"type": "string",
- "format": "uri",
- "description": "URL of the upscaled image or video"
+ "enum": [
+ "success",
+ "error"
+ ]
+ },
+ "venues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ResearchVenue"
+ }
}
}
},
- "ContentCreateAnalyzeRequest": {
+ "ResearchWebRequest": {
"type": "object",
"required": [
- "video_url",
- "prompt"
+ "query"
],
+ "description": "Request body for web research.",
"properties": {
- "video_url": {
- "type": "string",
- "format": "uri",
- "description": "Publicly accessible URL of the video to analyze. Supported formats: MP4, MOV, AVI, and other FFmpeg-compatible formats. Maximum duration: 1 hour."
- },
- "prompt": {
+ "query": {
"type": "string",
- "maxLength": 2000,
- "description": "A text prompt that guides the analysis. Can be instructive, descriptive, or phrased as a question. Examples: \"Describe the key moments in this video\", \"Generate 5 SEO keywords for this video\"."
- },
- "temperature": {
- "type": "number",
- "minimum": 0,
- "maximum": 1,
- "default": 0.2,
- "description": "Controls the randomness of the text output. Lower values produce more focused results. Defaults to `0.2`."
+ "description": "The search query \u2014 what you want to find on the web."
},
- "max_tokens": {
+ "max_results": {
"type": "integer",
"minimum": 1,
- "maximum": 4096,
- "description": "Maximum number of tokens to generate. If omitted, uses the model default."
+ "maximum": 20,
+ "default": 10,
+ "description": "Maximum number of results to return."
+ },
+ "country": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 2,
+ "description": "ISO country code for regional results (e.g., 'US', 'GB')."
}
}
},
- "ContentCreateAnalyzeResponse": {
+ "ResearchWebResponse": {
"type": "object",
- "required": [
- "text"
- ],
+ "description": "Web search results with titles, URLs, and content snippets.",
"properties": {
- "text": {
- "type": "string",
- "description": "The generated analysis text based on the video and prompt."
- },
- "finish_reason": {
+ "status": {
"type": "string",
"enum": [
- "stop",
- "length"
- ],
- "nullable": true,
- "description": "`stop` if the generation completed normally. `length` if truncated at the token limit."
+ "success",
+ "error"
+ ]
},
- "usage": {
- "type": "object",
- "nullable": true,
- "properties": {
- "output_tokens": {
- "type": "integer",
- "description": "Number of tokens in the generated text."
+ "results": {
+ "type": "array",
+ "description": "Ranked web search results.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "content": {
+ "type": "string"
+ }
}
}
+ },
+ "formatted": {
+ "type": "string",
+ "description": "Results formatted as markdown for easy reading."
}
}
}
@@ -13217,7 +15477,13 @@
"in": "header",
"name": "x-api-key",
"description": "Your Recoup API key. [Learn more](/quickstart#api-keys)."
+ },
+ "callbackSecret": {
+ "type": "apiKey",
+ "in": "header",
+ "name": "x-callback-secret",
+ "description": "Shared secret used by internal Trigger.dev callback requests."
}
}
}
-}
+}
\ No newline at end of file
diff --git a/api-reference/research/albums.mdx b/api-reference/research/albums.mdx
new file mode 100644
index 0000000..ad026fd
--- /dev/null
+++ b/api-reference/research/albums.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Albums'
+openapi: 'GET /api/research/albums'
+---
diff --git a/api-reference/research/audience.mdx b/api-reference/research/audience.mdx
new file mode 100644
index 0000000..9a4b73f
--- /dev/null
+++ b/api-reference/research/audience.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Audience Demographics'
+openapi: 'GET /api/research/audience'
+---
diff --git a/api-reference/research/career.mdx b/api-reference/research/career.mdx
new file mode 100644
index 0000000..2544ff3
--- /dev/null
+++ b/api-reference/research/career.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Career Timeline'
+openapi: 'GET /api/research/career'
+---
diff --git a/api-reference/research/charts.mdx b/api-reference/research/charts.mdx
new file mode 100644
index 0000000..25dead0
--- /dev/null
+++ b/api-reference/research/charts.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Charts'
+openapi: 'GET /api/research/charts'
+---
diff --git a/api-reference/research/cities.mdx b/api-reference/research/cities.mdx
new file mode 100644
index 0000000..d379fa4
--- /dev/null
+++ b/api-reference/research/cities.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Listener Cities'
+openapi: 'GET /api/research/cities'
+---
diff --git a/api-reference/research/curator.mdx b/api-reference/research/curator.mdx
new file mode 100644
index 0000000..7761c0c
--- /dev/null
+++ b/api-reference/research/curator.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Curator'
+openapi: 'GET /api/research/curator'
+---
diff --git a/api-reference/research/deep.mdx b/api-reference/research/deep.mdx
new file mode 100644
index 0000000..34bb0f3
--- /dev/null
+++ b/api-reference/research/deep.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Deep Research'
+openapi: 'POST /api/research/deep'
+---
diff --git a/api-reference/research/discover.mdx b/api-reference/research/discover.mdx
new file mode 100644
index 0000000..c5c643e
--- /dev/null
+++ b/api-reference/research/discover.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Discover Artists'
+openapi: 'GET /api/research/discover'
+---
diff --git a/api-reference/research/enrich.mdx b/api-reference/research/enrich.mdx
new file mode 100644
index 0000000..5d6a769
--- /dev/null
+++ b/api-reference/research/enrich.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Enrich'
+openapi: 'POST /api/research/enrich'
+---
diff --git a/api-reference/research/extract.mdx b/api-reference/research/extract.mdx
new file mode 100644
index 0000000..40733c3
--- /dev/null
+++ b/api-reference/research/extract.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Extract URL'
+openapi: 'POST /api/research/extract'
+---
diff --git a/api-reference/research/festivals.mdx b/api-reference/research/festivals.mdx
new file mode 100644
index 0000000..97b3c0b
--- /dev/null
+++ b/api-reference/research/festivals.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Festivals'
+openapi: 'GET /api/research/festivals'
+---
diff --git a/api-reference/research/genres.mdx b/api-reference/research/genres.mdx
new file mode 100644
index 0000000..12b7795
--- /dev/null
+++ b/api-reference/research/genres.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Genres'
+openapi: 'GET /api/research/genres'
+---
diff --git a/api-reference/research/insights.mdx b/api-reference/research/insights.mdx
new file mode 100644
index 0000000..88695cf
--- /dev/null
+++ b/api-reference/research/insights.mdx
@@ -0,0 +1,4 @@
+---
+title: 'AI Insights'
+openapi: 'GET /api/research/insights'
+---
diff --git a/api-reference/research/instagram-posts.mdx b/api-reference/research/instagram-posts.mdx
new file mode 100644
index 0000000..9d598de
--- /dev/null
+++ b/api-reference/research/instagram-posts.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Instagram Posts'
+openapi: 'GET /api/research/instagram-posts'
+---
diff --git a/api-reference/research/lookup.mdx b/api-reference/research/lookup.mdx
new file mode 100644
index 0000000..bda5bc2
--- /dev/null
+++ b/api-reference/research/lookup.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Lookup by URL'
+openapi: 'GET /api/research/lookup'
+---
diff --git a/api-reference/research/metrics.mdx b/api-reference/research/metrics.mdx
new file mode 100644
index 0000000..ff1b706
--- /dev/null
+++ b/api-reference/research/metrics.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Platform Metrics'
+openapi: 'GET /api/research/metrics'
+---
diff --git a/api-reference/research/milestones.mdx b/api-reference/research/milestones.mdx
new file mode 100644
index 0000000..c11f762
--- /dev/null
+++ b/api-reference/research/milestones.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Milestones'
+openapi: 'GET /api/research/milestones'
+---
diff --git a/api-reference/research/people.mdx b/api-reference/research/people.mdx
new file mode 100644
index 0000000..06b6d0a
--- /dev/null
+++ b/api-reference/research/people.mdx
@@ -0,0 +1,4 @@
+---
+title: 'People Search'
+openapi: 'POST /api/research/people'
+---
diff --git a/api-reference/research/playlist.mdx b/api-reference/research/playlist.mdx
new file mode 100644
index 0000000..0da706e
--- /dev/null
+++ b/api-reference/research/playlist.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Playlist'
+openapi: 'GET /api/research/playlist'
+---
diff --git a/api-reference/research/playlists.mdx b/api-reference/research/playlists.mdx
new file mode 100644
index 0000000..dce5080
--- /dev/null
+++ b/api-reference/research/playlists.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Playlist Placements'
+openapi: 'GET /api/research/playlists'
+---
diff --git a/api-reference/research/profile.mdx b/api-reference/research/profile.mdx
new file mode 100644
index 0000000..1331b9a
--- /dev/null
+++ b/api-reference/research/profile.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Artist Profile'
+openapi: 'GET /api/research/profile'
+---
diff --git a/api-reference/research/radio.mdx b/api-reference/research/radio.mdx
new file mode 100644
index 0000000..6115267
--- /dev/null
+++ b/api-reference/research/radio.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Radio Stations'
+openapi: 'GET /api/research/radio'
+---
diff --git a/api-reference/research/rank.mdx b/api-reference/research/rank.mdx
new file mode 100644
index 0000000..a9fb36b
--- /dev/null
+++ b/api-reference/research/rank.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Artist Rank'
+openapi: 'GET /api/research/rank'
+---
diff --git a/api-reference/research/search.mdx b/api-reference/research/search.mdx
new file mode 100644
index 0000000..ab64614
--- /dev/null
+++ b/api-reference/research/search.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Search'
+openapi: 'GET /api/research'
+---
diff --git a/api-reference/research/similar.mdx b/api-reference/research/similar.mdx
new file mode 100644
index 0000000..623c4b8
--- /dev/null
+++ b/api-reference/research/similar.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Similar Artists'
+openapi: 'GET /api/research/similar'
+---
diff --git a/api-reference/research/track.mdx b/api-reference/research/track.mdx
new file mode 100644
index 0000000..cf1b522
--- /dev/null
+++ b/api-reference/research/track.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Track'
+openapi: 'GET /api/research/track'
+---
diff --git a/api-reference/research/tracks.mdx b/api-reference/research/tracks.mdx
new file mode 100644
index 0000000..037ea66
--- /dev/null
+++ b/api-reference/research/tracks.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Tracks'
+openapi: 'GET /api/research/tracks'
+---
diff --git a/api-reference/research/urls.mdx b/api-reference/research/urls.mdx
new file mode 100644
index 0000000..54196e8
--- /dev/null
+++ b/api-reference/research/urls.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Social URLs'
+openapi: 'GET /api/research/urls'
+---
diff --git a/api-reference/research/venues.mdx b/api-reference/research/venues.mdx
new file mode 100644
index 0000000..06f0d22
--- /dev/null
+++ b/api-reference/research/venues.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Venues'
+openapi: 'GET /api/research/venues'
+---
diff --git a/api-reference/research/web.mdx b/api-reference/research/web.mdx
new file mode 100644
index 0000000..20373b6
--- /dev/null
+++ b/api-reference/research/web.mdx
@@ -0,0 +1,4 @@
+---
+title: 'Web Search'
+openapi: 'POST /api/research/web'
+---
diff --git a/cli.mdx b/cli.mdx
index 29394ea..f64a361 100644
--- a/cli.mdx
+++ b/cli.mdx
@@ -121,6 +121,333 @@ recoup tasks status --run --json
|------|----------|-------------|
| `--run ` | Yes | Trigger.dev run ID |
+## research
+
+Music industry research — streaming metrics, audience demographics, playlist placements, competitive analysis, and web intelligence. All data is accessed through your `RECOUP_API_KEY`.
+
+Artist-scoped commands (like `metrics`, `audience`, `similar`) accept an **artist name** or a **Recoup artist ID** (UUID). The API resolves the artist automatically. If the name is ambiguous (multiple matches), the API returns the top results for disambiguation.
+
+### Search for an artist
+
+```bash
+recoup research "Drake"
+recoup research "Phoebe Bridgers" --json
+```
+
+See [`GET /api/research`](/api-reference/research/search).
+
+### Lookup by platform URL
+
+Find an artist from a Spotify URL, Apple Music link, or any platform ID.
+
+```bash
+recoup research lookup "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"
+recoup research lookup "3TVXtAsR1Inumwj472S9r4"
+```
+
+See [`GET /api/research/lookup`](/api-reference/research/lookup).
+
+### Artist profile and career
+
+```bash
+recoup research profile "Drake"
+recoup research career "Drake"
+recoup research insights "Drake"
+```
+
+| Subcommand | Description | API endpoint |
+|------------|-------------|-------------|
+| `profile` | Full artist profile — bio, genres, social URLs, label | [`GET /api/research/profile`](/api-reference/research/profile) |
+| `career` | Career timeline and key milestones | [`GET /api/research/career`](/api-reference/research/career) |
+| `insights` | AI-generated observations and trends | [`GET /api/research/insights`](/api-reference/research/insights) |
+
+### Streaming and social metrics
+
+Get platform-specific metrics over time. Supports 14 platforms.
+
+```bash
+recoup research metrics "Drake" --source spotify
+recoup research metrics "Drake" --source instagram
+recoup research metrics "Drake" --source tiktok
+recoup research metrics "Drake" --source youtube_channel
+```
+
+Valid `--source` values: `spotify`, `instagram`, `tiktok`, `twitter`, `facebook`, `youtube_channel`, `youtube_artist`, `soundcloud`, `deezer`, `twitch`, `line`, `melon`, `wikipedia`, `bandsintown`.
+
+See [`GET /api/research/metrics`](/api-reference/research/metrics).
+
+### Audience and geography
+
+```bash
+recoup research audience "Drake"
+recoup research audience "Drake" --platform tiktok
+recoup research audience "Drake" --platform youtube
+recoup research cities "Drake"
+```
+
+| Subcommand | Description | API endpoint |
+|------------|-------------|-------------|
+| `audience` | Age, gender, country breakdown. `--platform`: `instagram` (default), `tiktok`, `youtube` | [`GET /api/research/audience`](/api-reference/research/audience) |
+| `cities` | Top cities by listener concentration | [`GET /api/research/cities`](/api-reference/research/cities) |
+
+### Social URLs
+
+Get all social and streaming links for an artist.
+
+```bash
+recoup research urls "Drake"
+```
+
+See [`GET /api/research/urls`](/api-reference/research/urls).
+
+### Instagram posts
+
+Get an artist's top Instagram posts and reels by engagement.
+
+```bash
+recoup research instagram-posts "Drake"
+```
+
+See [`GET /api/research/instagram-posts`](/api-reference/research/instagram-posts).
+
+### Competitive landscape
+
+```bash
+recoup research similar "Drake"
+recoup research similar "Drake" --audience high --genre high --limit 20
+```
+
+Configuration options: `--audience`, `--genre`, `--mood`, `--musicality` (values: `high`, `medium`, `low`).
+
+See [`GET /api/research/similar`](/api-reference/research/similar).
+
+### Playlists
+
+```bash
+recoup research playlists "Drake"
+recoup research playlists "Drake" --platform applemusic
+recoup research playlists "Drake" --editorial
+recoup research playlists "Drake" --status past --since 2025-01-01
+recoup research playlists "Drake" --sort followers --limit 50
+```
+
+| Flag | Description |
+|------|-------------|
+| `--platform ` | `spotify` (default), `applemusic`, `deezer`, `amazon`, `youtube` |
+| `--editorial` | Only editorial playlists |
+| `--status ` | `current` (default) or `past` |
+| `--since ` | Filter by date (YYYY-MM-DD) |
+| `--sort ` | Sort results (e.g., `followers`) |
+| `--limit ` | Max results |
+
+See [`GET /api/research/playlists`](/api-reference/research/playlists).
+
+### Discography
+
+```bash
+recoup research albums "Drake"
+recoup research tracks "Drake"
+```
+
+See [`GET /api/research/albums`](/api-reference/research/albums) and [`GET /api/research/tracks`](/api-reference/research/tracks).
+
+### Track details
+
+Get metadata for a specific track — look up by name or Spotify URL.
+
+```bash
+recoup research track "God's Plan"
+recoup research track "https://open.spotify.com/track/2grjqo0Frpf2..."
+```
+
+See [`GET /api/research/track`](/api-reference/research/track).
+
+### Playlist and curator details
+
+Get metadata for a specific playlist or its curator.
+
+```bash
+recoup research playlist spotify 37i9dQZF1DXcBWIGoYBM5M
+recoup research curator spotify 1
+```
+
+See [`GET /api/research/playlist`](/api-reference/research/playlist) and [`GET /api/research/curator`](/api-reference/research/curator).
+
+### Discover artists
+
+Find artists by criteria — country, genre, listener ranges, growth rate.
+
+```bash
+recoup research discover --country US --spotify-listeners 100000 500000
+recoup research discover --genre 86 --sort weekly_diff.sp_monthly_listeners
+```
+
+| Flag | Description |
+|------|-------------|
+| `--country ` | ISO country code (US, BR, GB, etc.) |
+| `--genre ` | Genre ID (use `recoup research genres` to list) |
+| `--spotify-listeners ` | Monthly listener range |
+| `--sort ` | Sort field (e.g., `weekly_diff.sp_monthly_listeners`) |
+| `--limit ` | Max results |
+
+See [`GET /api/research/discover`](/api-reference/research/discover).
+
+### Milestones
+
+Get an artist's activity feed — playlist adds, chart entries, and notable events.
+
+```bash
+recoup research milestones "Drake"
+recoup research milestones "Drake" --json
+```
+
+See [`GET /api/research/milestones`](/api-reference/research/milestones).
+
+### Venues
+
+Get venues an artist has performed at, including capacity and location.
+
+```bash
+recoup research venues "Drake"
+recoup research venues "Drake" --json
+```
+
+See [`GET /api/research/venues`](/api-reference/research/venues).
+
+### Rank
+
+Get an artist's global Chartmetric ranking.
+
+```bash
+recoup research rank "Drake"
+recoup research rank "Drake" --json
+```
+
+See [`GET /api/research/rank`](/api-reference/research/rank).
+
+### Charts
+
+Get global chart positions for a platform. NOT artist-scoped — returns the full chart.
+
+```bash
+recoup research charts --platform spotify
+recoup research charts --platform spotify --country US
+recoup research charts --platform applemusic --country GB --interval weekly --json
+```
+
+| Flag | Required | Description |
+|------|----------|-------------|
+| `--platform ` | Yes | Chart platform (spotify, applemusic, tiktok, youtube, itunes, shazam) |
+| `--country ` | No | ISO country code (US, GB, DE, etc.) |
+| `--interval ` | No | Time interval (e.g. daily, weekly) |
+| `--type ` | No | Chart type (varies by platform) |
+| `--latest` | No | Return only the most recent chart |
+
+See [`GET /api/research/charts`](/api-reference/research/charts).
+
+### Radio stations
+
+List radio stations tracked by Chartmetric.
+
+```bash
+recoup research radio
+recoup research radio --json
+```
+
+See [`GET /api/research/radio`](/api-reference/research/radio).
+
+### Reference data
+
+```bash
+recoup research genres
+recoup research festivals
+```
+
+See [`GET /api/research/genres`](/api-reference/research/genres) and [`GET /api/research/festivals`](/api-reference/research/festivals).
+
+### Web research
+
+Search the web for narrative context, press coverage, and cultural information that structured data doesn't cover.
+
+```bash
+recoup research web "Drake brand partnerships sync licensing"
+recoup research web "Phoebe Bridgers fan community psychographics"
+```
+
+See [`POST /api/research/web`](/api-reference/research/web).
+
+### Deep research report
+
+Comprehensive multi-source research that synthesizes information from across the web into a cited report.
+
+```bash
+recoup research report "Drake"
+recoup research report "Tell me everything about Phoebe Bridgers — bio, streaming metrics, fan base, competitive landscape, and revenue opportunities"
+```
+
+See [`POST /api/research/deep`](/api-reference/research/deep).
+
+### People search
+
+Search for people in the music industry — artists, managers, A&R reps, producers. Returns profiles with LinkedIn data.
+
+```bash
+recoup research people "A&R reps at Atlantic Records"
+recoup research people "music managers in Los Angeles R&B"
+```
+
+See [`POST /api/research/people`](/api-reference/research/people).
+
+### Extract URL
+
+Extract clean markdown content from any public URL. Handles JavaScript-heavy pages and PDFs.
+
+```bash
+recoup research extract "https://en.wikipedia.org/wiki/Drake_(musician)" --objective "biography and discography"
+recoup research extract "https://open.spotify.com/artist/..." --full-content
+```
+
+Accepts up to 10 URLs per call.
+
+See [`POST /api/research/extract`](/api-reference/research/extract).
+
+### Enrich
+
+Get structured data about any entity from web research. Provide a description and a JSON schema — get typed data back with citations.
+
+```bash
+recoup research enrich "Drake rapper" --schema '{"properties": {"real_name": {"type": "string"}, "label": {"type": "string"}, "hometown": {"type": "string"}}}'
+```
+
+Processors: `base` (fast, default), `core` (balanced), `ultra` (comprehensive).
+
+See [`POST /api/research/enrich`](/api-reference/research/enrich).
+
+### Using Recoup artist IDs
+
+Artist IDs are supported on artist-scoped commands (see the note above). Example:
+
+```bash
+recoup research metrics de05ba8c-7e29-4f1a-93a7-3635653599f6 --source spotify
+```
+
+### Workflow example: full artist research
+
+```bash
+# Pull structured data (all by name, run in parallel)
+recoup research metrics "Phoebe Bridgers" --source spotify --json
+recoup research audience "Phoebe Bridgers" --json
+recoup research cities "Phoebe Bridgers" --json
+recoup research similar "Phoebe Bridgers" --audience high --genre high --json
+recoup research playlists "Phoebe Bridgers" --editorial --json
+
+# Add web context
+recoup research web "Phoebe Bridgers biography career milestones" --json
+recoup research web "Phoebe Bridgers fan community brand partnerships" --json
+```
+
+---
+
## content
Content-creation pipeline commands. Generate AI-powered social videos for artists.
diff --git a/docs.json b/docs.json
index 9639f6b..11c47fb 100644
--- a/docs.json
+++ b/docs.json
@@ -147,6 +147,41 @@
"api-reference/workspaces/create"
]
},
+ {
+ "group": "Research",
+ "pages": [
+ "api-reference/research/search",
+ "api-reference/research/lookup",
+ "api-reference/research/profile",
+ "api-reference/research/metrics",
+ "api-reference/research/audience",
+ "api-reference/research/cities",
+ "api-reference/research/similar",
+ "api-reference/research/urls",
+ "api-reference/research/instagram-posts",
+ "api-reference/research/playlists",
+ "api-reference/research/albums",
+ "api-reference/research/tracks",
+ "api-reference/research/track",
+ "api-reference/research/career",
+ "api-reference/research/insights",
+ "api-reference/research/playlist",
+ "api-reference/research/curator",
+ "api-reference/research/discover",
+ "api-reference/research/genres",
+ "api-reference/research/festivals",
+ "api-reference/research/web",
+ "api-reference/research/deep",
+ "api-reference/research/people",
+ "api-reference/research/extract",
+ "api-reference/research/enrich",
+ "api-reference/research/milestones",
+ "api-reference/research/venues",
+ "api-reference/research/rank",
+ "api-reference/research/charts",
+ "api-reference/research/radio"
+ ]
+ },
{
"group": "Spotify",
"pages": [