{"openapi":"3.0.0","info":{"title":"Content API","version":"1.0.0","description":"API documentation for the Content API"},"servers":[{"url":"https://api.autocontentapi.com"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"ContentRequest":{"type":"object","required":["outputType"],"properties":{"resources":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","youtube","website","pdf","file"]},"content":{"type":"string","description":"For type \"file\", provide an https URL or a file id returned by POST /files. For other types, provide the text or URL expected by that type."}}},"description":"Resources for content generation (required if topic, feedSelections, or researches are not provided)"},"topic":{"type":"string","description":"Topic for content generation (alternative to resources, feedSelections, or researches)"},"feedSelections":{"type":"array","description":"Cached feed items to include in the request (alternative to resources, topic, or researches)","items":{"$ref":"#/components/schemas/FeedSelection"}},"researches":{"type":"array","items":{"type":"string"},"description":"Array of research IDs to include as text resources (max 10)"},"projects":{"type":"array","items":{"type":"string"},"description":"Array of project IDs to use as context for generation (max 10)"},"logoUrl":{"type":"string","format":"uri","description":"Optional HTTP or HTTPS PNG/JPG image URL for video, infographic, and slide_deck requests. Any source dimensions are accepted, but the image must be fully opaque and no larger than 5 MB; it is normalized to an opaque 200x50 PNG using the same rules as a project image. When supplied, it overrides the project logo for this request while project context and branding colors still apply. When omitted, the project logo and then the default logo are used."},"youtubeChannels":{"type":"array","items":{"type":"string"},"description":"YouTube channel IDs already connected to the account to use as sources"},"podcastEpisodeIds":{"type":"array","items":{"type":"string"},"description":"Completed audio request IDs to reuse as podcast episode sources (max 10)"},"text":{"type":"string","maxLength":5000,"description":"Instructions or query for content generation. For video, this is the NotebookLM steering prompt and is limited to 5,000 characters."},"outputType":{"type":"string","enum":["audio","text","faq","study_guide","timeline","briefing_doc","quiz","video","infographic","slide_deck","datatable"],"description":"Type of output content to generate"},"duration":{"type":"string","enum":["short","default","long"],"description":"Duration preference for audio and slide deck generation. Ignored for video requests."},"format":{"type":"string","enum":["explainer","short","cinematic","text","html","pdf"],"description":"For `video`, accepted values are `explainer`, `short`, and `cinematic` (defaults to `explainer`). `cinematic` video requests cost 100 credits. For `briefing_doc`, accepted values are `text`, `html`, and `pdf` (defaults to `pdf`). Ignored for other output types."},"style":{"type":"string","maxLength":5000,"description":"Style of the generated content. For audio/text, use one of: deep dive, brief, critique, debate. For video, NotebookLM preset names (auto-select, classic, whiteboard, kawaii, anime, watercolour, retro print, heritage, or paper-craft) are selected directly; any other value is used as custom style text and is limited to 5,000 characters. Video defaults to classic when omitted.\n"},"introMusicUrl":{"type":"string","description":"HTTPS URL to optional intro music (.mp3, .wav, or .m4a) mixed at lower volume at the start of the podcast"},"includeCitations":{"type":"boolean","description":"Whether to include citations (PRO only)"},"ignorePaywalledResources":{"type":"boolean","description":"When true, continue processing even if some URL resources fail to import (paywall/restrictions). The request fails only if none of the provided resources are successfully imported."},"infographicOrientation":{"type":"string","enum":["landscape","portrait","square"],"description":"Infographic orientation (defaults to landscape)"},"infographicDetail":{"type":"string","enum":["concise","standard","detailed"],"description":"Infographic detail level (defaults to standard)"},"slideDeckFormat":{"type":"string","enum":["detailed","presenter"],"description":"Slide deck format (defaults to detailed). Length is controlled via the standard duration field (short, default, long). Slide deck prompt uses the main text field."},"quizDifficulty":{"type":"string","enum":["easy","medium","hard"],"description":"Difficulty level for quiz outputs (defaults to medium). Quiz prompt uses the main text field."},"callbackData":{"type":"string","maxLength":500,"description":"Optional data to include in webhooks (maximum 500 characters)"},"relatedId":{"type":"string","description":"Existing request ID to relate this request to (must belong to the same token)"},"notebookId":{"type":"string","description":"Owned Private Notebook ID. When present, generation uses that notebook's saved sources and its license's exact dedicated account, follows Private Notebooks capacity instead of content credits, and rejects additional request sources or generic topic/project inputs."},"language":{"type":"string","description":"Target language for generated content, using an exact value from the supported languages list (for example, Deutsch). For video at the base format price, set language and omit voice1 and voice2. Voice IDs select narration voices but do not translate the generated script."},"scheduledOn":{"type":"string","format":"date-time","description":"Schedule the content generation for a specific time"},"podcastId":{"type":"string","description":"Podcast show ID to associate this content with"},"episodeTitle":{"type":"string","description":"Optional episode title when attaching to a podcast show"},"title":{"type":"string","description":"Custom title to use for generated video outputs. When provided, overrides the automatically generated title."},"titlePrompt":{"type":"string","description":"Prompt to guide the generated video title"},"descriptionPrompt":{"type":"string","description":"Prompt to guide the generated video description"},"thumbnailImagePrompt":{"type":"string","description":"Prompt to control the generated thumbnail image for video outputs"},"introImagePrompt":{"type":"string","description":"Prompt to control the intro image for video outputs"},"voice1":{"type":"integer","description":"Primary explicit narration voice ID from /content/GetVoices. Use the numeric ID, not the voice name. For video, supplying any catalogue or client-cloned voice ID adds 200 credits once per request to the format base price (50 credits for explainer/short or 100 for cinematic). Omit voice1 and voice2 for base pricing. Voice selection does not translate the generated script."},"voice2":{"type":"integer","description":"Optional secondary explicit narration voice ID from /content/GetVoices. Requires voice1. The 200-credit video voice surcharge is per request, not per supplied voice."},"publishTargets":{"type":"array","description":"Targets to publish generated videos to (e.g., YouTube)","items":{"$ref":"#/components/schemas/PublishTarget"}},"templateMode":{"type":"object","description":"Create a reusable template instead of processing immediately","properties":{"type":{"type":"string","enum":["feed"]},"name":{"type":"string","description":"Optional display name for the template"}}},"isScheduled":{"type":"boolean","description":"Create a recurring schedule instead of a single request"},"dailyCount":{"type":"integer","minimum":1,"maximum":24,"description":"Number of times per day to run when isScheduled is true"},"scheduleEndDate":{"type":"string","format":"date-time","description":"Optional end date for recurring schedules (requires isScheduled true)"}}},"RepurposeRequest":{"type":"object","required":["requestId","outputType"],"properties":{"requestId":{"type":"string","description":"Identifier of the completed request to repurpose"},"outputType":{"type":"string","enum":["audio","video","infographic","slide_deck","datatable","quiz"],"description":"Output type for the new request"},"language":{"type":"string","description":"Optional language override for the new request (defaults to the original request language)"},"text":{"type":"string","maxLength":5000,"description":"Optional text instructions that replace the original TEXT parameter. For video, this is the NotebookLM steering prompt and is limited to 5,000 characters."},"callbackData":{"type":"string","description":"Optional callback data to associate with the new request"},"duration":{"type":"string","enum":["short","default","long"],"description":"Duration preference for audio and slide deck repurpose requests. Ignored for video requests."},"infographicOrientation":{"type":"string","enum":["landscape","portrait","square"],"description":"Orientation when repurposing to an infographic"},"infographicDetail":{"type":"string","enum":["concise","standard","detailed"],"description":"Detail level when repurposing to an infographic"},"slideDeckFormat":{"type":"string","enum":["detailed","presenter"],"description":"Format when repurposing to a slide deck"},"quizDifficulty":{"type":"string","enum":["easy","medium","hard"],"description":"Difficulty level when repurposing to a quiz"},"title":{"type":"string","description":"Override video title when repurposing to video"},"titlePrompt":{"type":"string","description":"Prompt to guide the generated title when repurposing to video"},"descriptionPrompt":{"type":"string","description":"Prompt to guide the generated description when repurposing to video"},"format":{"type":"string","enum":["explainer","short","cinematic"],"description":"Video format (defaults to explainer). Only applies when outputType is video. `cinematic` costs 100 credits."},"style":{"type":"string","maxLength":5000,"description":"NotebookLM preset name or custom style text for video outputs, limited to 5,000 characters"},"thumbnailImagePrompt":{"type":"string","description":"Prompt to control the generated thumbnail image for video outputs"},"introImagePrompt":{"type":"string","description":"Prompt to control the generated intro image for video outputs"},"avatarId":{"type":"integer","description":"Optional avatar identifier for explainer video generation. If omitted, inherits from the source request when available."},"audioLanguage":{"type":"string","description":"Optional audio language override for explainer video generation metadata. If omitted, inherits from the source request when available."},"textLanguage":{"type":"string","description":"Optional text language override for explainer video generation metadata. If omitted, inherits from the source request when available."},"backgroundImageUrl":{"type":"string","description":"Optional background image URL for explainer video generation metadata. If omitted, inherits from the source request when available."},"voiceId":{"type":"integer","description":"Optional voice id from /content/GetVoices for explainer video metadata. Use the numeric id value, not the voice name. If omitted, inherits from the source request when available."}}},"PublishTarget":{"type":"object","properties":{"channel":{"type":"string","description":"Target channel for publishing (e.g., youtube)"},"youtubeAccountId":{"type":"string","nullable":true,"description":"Connected YouTube account ID to publish to"},"youtubePlaylistId":{"type":"string","nullable":true,"description":"Optional playlist ID to publish into"}}},"FeedSelection":{"type":"object","required":["feedId","feedItemIds"],"properties":{"feedId":{"type":"integer","description":"Identifier of the feed containing the cached items"},"feedItemIds":{"type":"array","items":{"type":"string"},"description":"Identifiers of cached posts or videos to include from that feed"}}},"RecurringSchedule":{"type":"object","properties":{"id":{"type":"string"},"prompt":{"type":"string"},"outputType":{"type":"string"},"format":{"type":"string","nullable":true,"description":"Video format for recurring video schedules (`explainer`, `short`, or `cinematic`). `cinematic` costs 100 credits."},"language":{"type":"string"},"duration":{"type":"string","description":"Duration preference for audio and slide deck schedules. Video schedules do not use duration."},"style":{"type":"string"},"dailyCount":{"type":"integer"},"scheduleEndDate":{"type":"string","format":"date-time","nullable":true},"lastRunAt":{"type":"string","format":"date-time","nullable":true},"nextRunAt":{"type":"string","format":"date-time","nullable":true},"createdOn":{"type":"string","format":"date-time","nullable":true},"podcastId":{"type":"string","nullable":true},"episodeTitle":{"type":"string","nullable":true},"status":{"type":"string","enum":["active","paused","completed"]}}},"RecurringScheduleDetail":{"type":"object","allOf":[{"$ref":"#/components/schemas/RecurringSchedule"},{"type":"object","properties":{"resources":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string"},"content":{"type":"string"}}}}}}]},"WebsiteDiscoveryLink":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}}},"Citation":{"type":"object","properties":{"text":{"type":"string","description":"Citation text"},"source":{"type":"string","description":"Source of the citation"},"page":{"type":"integer","description":"Page number for PDF sources"},"timeMs":{"type":"integer","description":"Timestamp in milliseconds for audio/video sources"}}},"Usage":{"type":"object","properties":{"allowed":{"type":"integer","description":"Total credits allowed"},"used":{"type":"integer","description":"Total credits used"},"allowedDailyPodcasts":{"type":"integer","description":"Daily podcast limit"},"usedDailyPodcasts":{"type":"integer","description":"Podcasts created today"}}},"QueueStats":{"type":"object","properties":{"success":{"type":"boolean"},"queued":{"type":"integer","description":"Requests waiting to be picked up for processing"},"processing":{"type":"integer","description":"Requests currently in progress"},"active":{"type":"integer","description":"queued + processing"}}},"QueueRequestSummary":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"integer"},"request_type_id":{"type":"integer"},"output_type":{"type":"string","nullable":true},"requested_on":{"type":"string","format":"date-time","nullable":true},"processing_on":{"type":"string","format":"date-time","nullable":true},"scheduled_on":{"type":"string","format":"date-time","nullable":true}}},"QueueRequestsResponse":{"type":"object","properties":{"success":{"type":"boolean"},"state":{"type":"string","enum":["queued","processing","active"]},"ids":{"type":"array","items":{"type":"string"}},"items":{"type":"array","items":{"$ref":"#/components/schemas/QueueRequestSummary"}},"count":{"type":"integer","description":"Number of items in this page"},"total_count":{"type":"integer"},"page":{"type":"integer"},"page_size":{"type":"integer"},"total_pages":{"type":"integer"}}},"Podcast":{"type":"object","properties":{"id":{"type":"string","description":"Podcast ID"},"requestTypeId":{"type":"integer","description":"Type of podcast request"},"audioTitle":{"type":"string","description":"Title of the podcast"},"audioUrl":{"type":"string","description":"URL to the audio file"},"responseText":{"type":"string","description":"Podcast transcript/text"},"requestedOn":{"type":"string","format":"date-time","description":"When the podcast was requested"},"succeededOn":{"type":"string","format":"date-time","description":"When the podcast was completed"},"errorOn":{"type":"string","format":"date-time","description":"When the podcast failed (if applicable)"},"processingOn":{"type":"string","format":"date-time","description":"When the podcast started processing (if applicable)"},"errorMessage":{"type":"string","description":"Error message if the podcast failed"},"status":{"type":"integer","description":"Current status of the podcast"},"shareUrl":{"type":"string","description":"Public sharing URL for the podcast"}}},"Transcript":{"type":"object","properties":{"id":{"type":"string","description":"Transcript ID"},"audioTitle":{"type":"string","description":"Title of the original audio"},"audioUrl":{"type":"string","description":"URL to the original audio file"},"responseText":{"type":"string","description":"The transcript text content"},"requestedOn":{"type":"string","format":"date-time","description":"When the transcript was requested"},"succeededOn":{"type":"string","format":"date-time","description":"When the transcript was completed"},"errorOn":{"type":"string","format":"date-time","description":"When the transcript failed (if applicable)"},"processingOn":{"type":"string","format":"date-time","description":"When the transcript started processing (if applicable)"},"errorMessage":{"type":"string","description":"Error message if the transcript failed"},"status":{"type":"integer","description":"Current status of the transcript"},"language":{"type":"string","description":"Language of the transcript"},"callbackData":{"type":"string","description":"Optional callback data provided during request"},"scheduledOn":{"type":"string","format":"date-time","description":"When the transcript was scheduled"}}},"DataTable":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the data table (matches request id)"},"url":{"type":"string","format":"uri","nullable":true,"description":"URL of the generated data table file (null while processing)"},"status":{"type":"integer","description":"Current progress percentage (100 when completed)"},"createdOn":{"type":"string","format":"date-time","description":"UTC timestamp when the data table was created (or requested if still in progress)"}}},"Document":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the document (matches request id)"},"type":{"type":"string","description":"Document type"},"format":{"type":"string","enum":["text","html","pdf"],"description":"Stored result format"},"title":{"type":"string","nullable":true,"description":"Optional document title"},"status":{"type":"integer","description":"Current progress percentage (100 when completed)"},"createdOn":{"type":"string","format":"date-time","description":"UTC timestamp when the document row was created"},"content":{"type":"string","nullable":true,"description":"Text or HTML content when format is `text` or `html`"},"url":{"type":"string","nullable":true,"description":"Direct PDF URL when format is `pdf`"}}},"Infographic":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the infographic (matches request id)"},"imageUrl":{"type":"string","format":"uri","nullable":true,"description":"URL of the generated infographic image (null while processing)"},"title":{"type":"string","nullable":true,"description":"Optional title for the infographic"},"status":{"type":"integer","description":"Current progress percentage (100 when completed)"},"createdOn":{"type":"string","format":"date-time","description":"UTC timestamp when the infographic was created (or requested if still in progress)"}}},"Quiz":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the quiz (matches request id)"},"quizJson":{"type":"string","nullable":true,"description":"Quiz JSON content (null while processing)"},"status":{"type":"integer","description":"Current progress percentage (100 when completed)"},"createdOn":{"type":"string","format":"date-time","description":"UTC timestamp when the quiz was created (or requested if still in progress)"}}},"SlideDeck":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the slide deck (matches request id)"},"url":{"type":"string","format":"uri","nullable":true,"description":"URL of the generated slide deck (null while processing)"},"title":{"type":"string","nullable":true,"description":"Optional title for the slide deck"},"status":{"type":"integer","description":"Current progress percentage (100 when completed)"},"createdOn":{"type":"string","format":"date-time","description":"UTC timestamp when the slide deck was created (or requested if still in progress)"}}},"Avatar":{"type":"object","properties":{"id":{"type":"string","description":"Avatar identifier"},"name":{"type":"string","description":"Avatar display name"},"gender":{"type":"string","enum":["M","F"],"description":"Avatar gender (M = Male, F = Female)"}}},"Short":{"type":"object","properties":{"id":{"type":"string","description":"Short video identifier"},"status":{"type":"integer","description":"Status code (0 = pending, 10-90 = processing, 100 = completed, -1 = failed)"},"requestedOn":{"type":"string","format":"date-time","description":"Request creation date"},"processingOn":{"type":"string","format":"date-time","description":"Processing start date"},"succeededOn":{"type":"string","format":"date-time","description":"Completion date"},"requestTypeId":{"type":"integer","description":"Request type ID (4 = Short)"},"callbackData":{"type":"string","description":"Custom callback data"},"audioUrl":{"type":"string","description":"URL to the audio used for the short"},"videoUrl":{"type":"string","description":"URL to the generated short video (when completed)"},"imageUrl":{"type":"string","description":"URL to the thumbnail image (when completed)"},"audioTitle":{"type":"string","description":"Title of the short video"},"responseText":{"type":"string","description":"Text content used in the short"},"errorOn":{"type":"string","format":"date-time","description":"Error occurrence date (if applicable)"},"errorMessage":{"type":"string","description":"Error message (if applicable)"}}},"TranscriptLine":{"type":"object","properties":{"text":{"type":"string","description":"Transcript line text"},"speaker":{"type":"string","description":"Speaker label"},"timestamp":{"type":"array","description":"Start/end time in seconds","items":{"type":"number"}}}},"ExplainerTranscript":{"type":"object","properties":{"videoId":{"type":"string","description":"Explainer video identifier (request ID)"},"createdOn":{"type":"string","format":"date-time","description":"Transcript creation timestamp"},"transcript":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptLine"}}}},"Feed":{"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier for the feed","example":1},"name":{"type":"string","description":"Name of the feed","example":"Tech News Twitter Feed"},"token":{"type":"string","description":"Client token (null for public feeds)","example":"abc123-def456-ghi789"},"feedTypeId":{"type":"integer","description":"Type of feed (1 for X/Twitter, 2 for Reddit, 3 for YouTube channel, 4 for RSS, 5 for X News topic)","example":1},"internalId":{"type":"string","description":"Internal identifier for the feed source (username for X, subreddit for Reddit, channel source ID for YouTube)","example":"elonmusk"},"createdOn":{"type":"string","format":"date-time","description":"Creation timestamp","example":"2023-01-01T12:00:00Z"}}},"FeedSubscription":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the subscription","example":"123e4567-e89b-12d3-a456-426614174000"},"feedId":{"type":"integer","description":"Identifier of the subscribed feed","example":42},"token":{"type":"string","description":"Token that owns the subscription"},"requestId":{"type":"string","description":"ClientRequest template identifier used for automation"},"createdOn":{"type":"string","format":"date-time","description":"When the subscription was created"},"removedOn":{"type":"string","format":"date-time","nullable":true,"description":"When the subscription was removed, if applicable"},"lastProcessedItemId":{"type":"string","nullable":true,"description":"Identifier of the last feed item processed for this subscription"},"lastProcessedOn":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the last processed feed item"},"request":{"type":"object","nullable":true,"description":"Snapshot of the underlying template request"}}},"CreateFeedRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name of the feed","example":"Tech News Twitter Feed"},"feedTypeId":{"type":"integer","description":"Type of feed (1 for X/Twitter, 2 for Reddit, 3 for YouTube channel, 4 for RSS, 5 for X News topic)","example":1},"internalId":{"type":"string","description":"Internal identifier - Twitter username for X, subreddit name for Reddit (without r/ prefix), topic/search query for X News (feedTypeId=5), feed URL for RSS. For YouTube channels this is populated automatically.","example":"elonmusk"},"channel":{"type":"string","description":"(YouTube only) Channel handle, URL, or ID. Either `channel` or `url` may be provided.","example":"https://youtube.com/@AutoContentAPI"},"url":{"type":"string","description":"(YouTube only) Channel URL alternative field.","example":"https://youtube.com/@AutoContentAPI"}}},"DeleteFeedRequest":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"ID of the feed to delete","example":1}}},"CreatePodcastShowRequest":{"type":"object","required":["name","description","author","link","imageUrl","email"],"properties":{"name":{"type":"string","description":"Podcast show name (displayed on Spotify, Apple Music, etc.)","example":"AI-Generated Tech Talk"},"description":{"type":"string","description":"Show description for platform listings and RSS feed","example":"Weekly tech discussions generated by AI, covering the latest in technology and innovation."},"author":{"type":"string","description":"Host/author name displayed on podcast platforms","example":"AI Content Creator"},"link":{"type":"string","format":"uri","description":"Official website URL for the podcast show","example":"https://mywebsite.com/podcast"},"imageUrl":{"type":"string","format":"uri","description":"URL of the podcast show image/artwork","example":"https://mywebsite.com/podcast-artwork.jpg"},"email":{"type":"string","format":"email","description":"Owner email address for RSS feed and platform registration","example":"podcast@mywebsite.com"},"language":{"type":"string","description":"Primary language for generated podcast episodes (defaults to English)","example":"Italian"}}},"PodcastShow":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the podcast show"},"name":{"type":"string","description":"Name of the podcast show (displayed on Spotify, Apple Music, etc.)"},"description":{"type":"string","description":"Description of the podcast show (used in platform listings)"},"author":{"type":"string","description":"Author/host name (displayed on podcast platforms)"},"link":{"type":"string","description":"Website link for the podcast show"},"email":{"type":"string","format":"email","description":"Owner email address (used in RSS feed and platform settings)"},"token":{"type":"string","description":"Client token for authentication"},"createdOn":{"type":"string","format":"date-time","description":"Creation timestamp"},"updatedOn":{"type":"string","format":"date-time","description":"Last update timestamp"},"rssUrl":{"type":"string","description":"RSS feed URL for automated distribution to Spotify, Apple Music, and other podcast platforms","example":"https://autocontentapi.com/podcast/rss/abc123"}}},"PodcastEpisode":{"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier for the episode"},"podcastId":{"type":"string","description":"ID of the podcast show this episode belongs to"},"requestId":{"type":"string","description":"ID of the client request that created the source audio content"},"title":{"type":"string","description":"Episode title (displayed on podcast platforms)"},"description":{"type":"string","description":"Episode description (displayed on podcast platforms)"},"audioTitle":{"type":"string","description":"Original title from the generated audio content"},"audioUrl":{"type":"string","description":"Direct URL to the episode audio file (MP3 format for platform compatibility)"},"requestedOn":{"type":"string","format":"date-time","description":"When the episode was requested/created"},"succeededOn":{"type":"string","format":"date-time","description":"When the episode processing completed successfully"},"scheduledOn":{"type":"string","format":"date-time","description":"When the episode is scheduled to be published (if scheduled)"},"fileSize":{"type":"integer","description":"Audio file size in bytes (required for RSS enclosure tag)"},"durationSeconds":{"type":"integer","description":"Episode duration in seconds (displayed on podcast platforms)"}}},"Project":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the project (GUID)","example":"123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string","description":"Name of the project","example":"AI Startup Launch"},"description":{"type":"string","description":"Detailed description of the project","example":"Building an AI-powered SaaS tool for content creators. Focus on automation, efficiency, and user experience."},"url":{"type":"string","description":"Optional URL associated with the project","example":"https://example.com"},"token":{"type":"string","description":"Client token (owner of the project)","example":"abc123-def456-ghi789"},"createdOn":{"type":"string","format":"date-time","description":"Creation timestamp","example":"2024-01-01T12:00:00Z"},"updatedOn":{"type":"string","format":"date-time","description":"Last update timestamp","example":"2024-01-02T14:30:00Z"},"active":{"type":"boolean","description":"Whether the project is active","example":true},"imageUrl":{"type":"string","format":"uri","description":"Optional URL of the 200x50 brand image associated with the project"},"textColor":{"type":"string","nullable":true,"description":"Hex color (e.g.","example":"#111827"},"backgroundColor":{"type":"string","nullable":true,"description":"Hex color (e.g.","example":"#F9FAFB"},"brandColor":{"type":"string","nullable":true,"description":"Primary branding accent color applied to overlay shapes when branding is configured","example":"#4338CA"},"accentColor":{"type":"string","nullable":true,"description":"Secondary accent color applied to overlay highlights and subtitles when branding is configured","example":"#7C72EF"}}},"CreateProjectRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name of the project (max 200 characters)","example":"AI Startup Launch"},"description":{"type":"string","description":"Detailed description of the project. Either description or url must be provided.","example":"Building an AI-powered SaaS tool for content creators. Focus on automation, efficiency, and user experience."},"url":{"type":"string","description":"Optional URL to fetch website content for auto-generating description. If provided without a description, AI will generate one.","example":"https://example.com"},"imageData":{"type":"string","description":"Optional base64 encoded PNG/JPG representing the project's brand image. The source image must be fully opaque; images containing any fully or partially transparent pixels are rejected. Any dimensions are accepted and the API resizes the image to 200x50 before storing the hosted copy as `imageUrl`."},"imageUrl":{"type":"string","format":"uri","description":"Optional HTTP/HTTPS URL to an existing PNG or JPG brand image. The source image must be fully opaque; images containing any fully or partially transparent pixels are rejected. The API downloads the source, resizes it to 200x50, and hosts the optimized copy. Cannot be combined with `imageData`."},"textColor":{"type":"string","description":"Optional hex color (format","example":"#111827","pattern":"^#[0-9A-Fa-f]{6}$"},"backgroundColor":{"type":"string","description":"Optional hex color (format","example":"#F9FAFB","pattern":"^#[0-9A-Fa-f]{6}$"},"brandColor":{"type":"string","description":"Optional primary accent hex color (format","example":"#4338CA","pattern":"^#[0-9A-Fa-f]{6}$"},"accentColor":{"type":"string","description":"Optional secondary accent hex color (format","example":"#7C72EF","pattern":"^#[0-9A-Fa-f]{6}$"}}},"UpdateProjectRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Updated name of the project (max 200 characters)","example":"AI SaaS Platform"},"description":{"type":"string","description":"Updated description of the project. Either description or url must be provided.","example":"Revolutionary AI-powered content creation platform with advanced automation features."},"url":{"type":"string","description":"Optional URL to fetch website content for auto-generating description. If provided without a description, AI will generate one.","example":"https://example.com"},"imageData":{"type":"string","nullable":true,"description":"Optional base64 encoded PNG/JPG. Provide `null` to remove the current brand image. The source image must be fully opaque; images containing any fully or partially transparent pixels are rejected. Any size is accepted and will be resized to 200x50 on upload."},"imageUrl":{"type":"string","nullable":true,"format":"uri","description":"Optional HTTP/HTTPS URL pointing to a PNG or JPG brand image. Provide `null` to remove the stored image. The source image must be fully opaque; images containing any fully or partially transparent pixels are rejected. The API stores a 200x50 version. Cannot be combined with `imageData`."},"textColor":{"type":"string","nullable":true,"description":"Optional hex color (format","example":"#111827","pattern":"^#[0-9A-Fa-f]{6}$"},"backgroundColor":{"type":"string","nullable":true,"description":"Optional hex color (format","example":"#F9FAFB","pattern":"^#[0-9A-Fa-f]{6}$"},"brandColor":{"type":"string","nullable":true,"description":"Optional primary accent hex color (format","example":"#4338CA","pattern":"^#[0-9A-Fa-f]{6}$"},"accentColor":{"type":"string","nullable":true,"description":"Optional secondary accent hex color (format","example":"#7C72EF","pattern":"^#[0-9A-Fa-f]{6}$"}}},"XPost":{"type":"object","properties":{"id":{"type":"string","description":"Unique ID of the post (use this for refinement)","example":"550e8400-e29b-41d4-a716-446655440000"},"requestId":{"type":"string","example":"660e8400-e29b-41d4-a716-446655440000"},"result":{"type":"string","description":"The generated content or metadata"},"type":{"type":"string","description":"The post type (e.g., tweet or thread item)","example":"tweet"},"order":{"type":"integer","description":"Order in the thread (starts at 0)","example":0},"createdOn":{"type":"string","format":"date-time","example":"2024-01-15T10:35:00Z"},"tweetImageUrl":{"type":"string","nullable":true,"description":"Main image for the tweet (from user upload or provided URL)","example":"https://cdn.example.com/user-image.jpg"},"dataTableImageUrl":{"type":"string","nullable":true,"description":"Optional URL to a generated data table image","example":"https://cdn.example.com/table.png"},"barChartImageUrl":{"type":"string","nullable":true,"description":"Optional URL to a generated bar chart image","example":"https://cdn.example.com/chart.png"},"sources":{"type":"array","description":"Provenance entries describing where the content came from","items":{"$ref":"#/components/schemas/XPostSource"}},"shareUrl":{"type":"string","description":"Share URL for the post (only in getPodcasts response)","example":"https://autocontentapi.com/share/podcast/550e8400-e29b-41d4-a716-446655440000/20240115"}}},"XPostSource":{"type":"object","properties":{"type":{"type":"string","description":"Classification of the source (e.g. feed, resource, deep-research)","example":"feed-item"},"sourceId":{"type":"string","nullable":true,"description":"Optional identifier for the source record","example":"c0a8015c-82ff-455b-b3d5-8bfab98809c2"},"reference":{"type":"string","nullable":true,"description":"User-friendly reference like a URL or handle","example":"https://twitter.com/autocontentapi/status/123"},"description":{"type":"string","nullable":true,"description":"Short summary of the source content","example":"Reddit: Launch post announcing v2"},"metadata":{"type":"object","nullable":true,"additionalProperties":true,"description":"Arbitrary metadata captured for the source"}}}},"responses":{"UnauthorizedError":{"description":"Access token is missing or invalid"},"NotFoundError":{"description":"The requested resource was not found"},"BadRequestError":{"description":"Bad request parameters"},"ServerError":{"description":"Internal server error"}}},"tags":[{"name":"Content","description":"Content operations and usage information"},{"name":"Dedicated Account","description":"Operations available only for enterprise dedicated accounts"},{"name":"Video","description":"Video generation and avatar operations"},{"name":"Share","description":"Public sharing operations without authentication"},{"name":"Podcast","description":"Podcast operations and RSS feeds"},{"name":"Projects","description":"Project context management for content generation"},{"name":"Feeds","description":"Social media feed management operations"},{"name":"Deep Research","description":"Advanced research operations"},{"name":"X","description":"X (Twitter) operations"},{"name":"Automations","description":"Automation management and history"},{"name":"Infographics","description":"Infographic assets generated per token"},{"name":"Data Tables","description":"Data table assets generated per token"},{"name":"Quizzes","description":"Quiz assets generated per token"},{"name":"Documents","description":"Briefing document assets generated per token"},{"name":"Files","description":"Upload and manage private files for resources"},{"name":"Slide Decks","description":"Slide deck assets generated per token"},{"name":"Billing","description":"Billing and invoices operations"}],"paths":{"/content/Usage":{"get":{"summary":"Get usage information","description":"Returns current usage statistics and remaining credits","tags":["Content"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Unauthorized"}}}},"/content/QueueStats":{"get":{"summary":"Get queued and processing request counts","description":"Returns lightweight queue counts for the authenticated client. Active means queued + processing.","tags":["Content"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStats"}}}},"401":{"description":"Unauthorized"}}}},"/content/QueueRequests":{"get":{"summary":"Get queued or processing request IDs","description":"Returns paginated request IDs and lightweight request metadata for the authenticated client.","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"state","required":false,"schema":{"type":"string","enum":["queued","processing","active","all"],"default":"active"},"description":"Request state to fetch. `active` means queued + processing; `all` is accepted as an alias for active."},{"in":"query","name":"page","schema":{"type":"integer","minimum":1,"default":1},"required":false,"description":"Page number for pagination, starting at 1."},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"required":false,"description":"Number of items per page."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueRequestsResponse"}}}},"400":{"description":"Invalid state"},"401":{"description":"Unauthorized"}}}},"/content/Podcasts":{"get":{"summary":"Get all podcasts","description":"Returns all podcasts created by the current client, optionally filtered by status. Supports optional pagination.","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"status","required":false,"schema":{"type":"string","enum":["all","queued","failed","succeeded","processed"],"default":"all"},"description":"Filter podcasts by status (all=all podcasts, queued=status=0 and no error, failed=has errorOn, succeeded=status=100, processed=has processingOn)"},{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"$ref":"#/components/schemas/Podcast"}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"podcasts":{"type":"array","items":{"$ref":"#/components/schemas/Podcast"}},"totalCount":{"type":"integer","description":"Total number of podcasts","example":100},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":5}}}]}}}},"400":{"description":"Invalid status parameter"},"401":{"description":"Unauthorized"}}}},"/content/Transcripts":{"get":{"summary":"Get all transcripts","description":"Returns all transcripts created by the current client, optionally filtered by status. Supports optional pagination.","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"status","required":false,"schema":{"type":"string","enum":["all","queued","failed","succeeded","processed"],"default":"all"},"description":"Filter transcripts by status (all=all transcripts, queued=status=0 and no error, failed=has errorOn, succeeded=status=100, processed=has processingOn)"},{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"$ref":"#/components/schemas/Transcript"}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"transcripts":{"type":"array","items":{"$ref":"#/components/schemas/Transcript"}},"totalCount":{"type":"integer","description":"Total number of transcripts","example":100},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":5}}}]}}}},"400":{"description":"Invalid status parameter"},"401":{"description":"Unauthorized"}}}},"/content/Create":{"post":{"summary":"Create new content","description":"Generate new content based on resources, topic, feed selections, researches, YouTube channels, or linked podcast episodes. Use video metadata fields (titlePrompt, descriptionPrompt, thumbnailImagePrompt, introImagePrompt, voices, publishTargets, format) when outputType is video. Video formats are explainer and short at 50 credits, or cinematic at 100 credits. Supplying voice1 or voice2 adds one 200-credit explicit-voice surcharge to a video request, including when the ID is from the global GetVoices catalogue. Video requests ignore the generic duration field if it is provided. Set isScheduled or templateMode to create recurring templates instead of immediate processing.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentRequest"}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Standard immediate request","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}},{"type":"object","description":"Response when creating a recurring schedule (isScheduled = true)","properties":{"schedule_id":{"type":"string"},"request_id":{"type":"string"},"status":{"type":"integer"},"message":{"type":"string"},"dailyCount":{"type":"integer"},"endDate":{"type":"string","format":"date-time","nullable":true}}},{"type":"object","description":"Response when creating a reusable template (templateMode)","properties":{"template_request_id":{"type":"string"},"request_id":{"type":"string"},"status":{"type":"integer"},"template":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string","nullable":true}}}}}]}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/Repurpose":{"post":{"summary":"Repurpose a completed request","description":"Creates a new request using the resources and parameters of a completed request, allowing a new output type and optional updated text.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepurposeRequest"}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the new request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request or request not completed"},"401":{"description":"Unauthorized"},"404":{"description":"Original request not found"}}}},"/content/Status/{id}":{"get":{"summary":"Check request status","description":"Get the status of a content generation request. A non-null `error_on` or non-zero `error_code` is a terminal failure; the numeric `status` may remain at its last processing stage, including 0.","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Request ID"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"Request ID"},"audio_title":{"type":"string","description":"Title of the generated audio"},"status":{"type":"integer","description":"Status code (100 = completed)"},"audio_url":{"type":"string","description":"URL to the generated audio file"},"video_url":{"type":"string","description":"URL to the generated video file (if applicable)"},"image_url":{"type":"string","description":"URL to the generated image file (if applicable)"},"response_text":{"type":"string","description":"Generated text content"},"requested_on":{"type":"string","format":"date-time","description":"When the request was created"},"callback_data":{"type":"string","description":"User-provided callback data"},"updated_on":{"type":"string","format":"date-time","description":"When the request was last updated"},"request_type_id":{"type":"integer","description":"Type of request"},"error_code":{"type":"integer","description":"Error code (0 if no error)"},"citations":{"type":"array","items":{"$ref":"#/components/schemas/Citation"},"description":"Citations if requested"},"file_size":{"type":"integer","description":"Size of the generated file in bytes"},"audio_duration":{"type":"number","description":"Duration of the audio in seconds"},"share_url":{"type":"string","description":"Public sharing URL for the content"},"briefing_doc_url":{"type":"string","description":"Direct URL to the generated Briefing Doc PDF when output type is `briefing_doc`"},"document_format":{"type":"string","description":"Stored document format when output type is `briefing_doc`"},"document_content":{"type":"string","description":"Stored text or HTML content when output type is `briefing_doc`"},"document_url":{"type":"string","description":"Stored PDF URL when output type is `briefing_doc`"}}},{"type":"object","properties":{"id":{"type":"string","description":"Request ID"},"status":{"type":"integer","description":"Status code (0 = pending, other values indicate processing stages)"},"updated_on":{"type":"string","format":"date-time","description":"When the request was last updated"},"error_code":{"type":"integer","description":"Error code (0 if no error)"},"error_message":{"type":"string","description":"Error message if any"},"requested_on":{"type":"string","format":"date-time","description":"When the request was created"},"callback_data":{"type":"string","description":"User-provided callback data"}}}]}}}},"401":{"description":"Unauthorized"},"404":{"description":"Request not found"}}}},"/content/List":{"get":{"summary":"List content requests","description":"Get a list of content generation requests. Supports optional pagination.","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"type":"object","properties":{"id":{"type":"string","description":"Request ID"},"requestTypeId":{"type":"integer","description":"Type of content request"},"status":{"type":"integer","description":"Current status code"},"requestedOn":{"type":"string","format":"date-time","description":"Request creation timestamp"},"audioTitle":{"type":"string","description":"Title of the generated audio (if available)"}}}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Request ID"},"requestTypeId":{"type":"integer","description":"Type of content request"},"status":{"type":"integer","description":"Current status code"},"requestedOn":{"type":"string","format":"date-time","description":"Request creation timestamp"},"audioTitle":{"type":"string","description":"Title of the generated audio (if available)"}}}},"totalCount":{"type":"integer","description":"Total number of requests","example":100},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":5}}}]}}}},"401":{"description":"Unauthorized"}}}},"/content/GetVoices":{"get":{"summary":"Get available voices","description":"List all available voices for audio generation","tags":["Content"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Numeric voice ID to pass as voice1, voice2, or voiceId in voice-enabled requests. For /content/Create video requests, any supplied voice1 or voice2 ID adds one 200-credit explicit-voice surcharge, whether this is a global catalogue voice or a client-cloned voice."},"name":{"type":"string","description":"Voice name"},"clientId":{"type":"string","description":"ID of the client that owns this voice (for custom voices)"}}}}}}},"401":{"description":"Unauthorized"}}}},"/content/Me":{"get":{"summary":"Get current client info","description":"Returns current client ID","tags":["Content"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"clientId":{"type":"string","description":"Current authenticated client ID"}}}}}},"401":{"description":"Unauthorized"}}}},"/content/Webhook":{"post":{"summary":"Register webhook","description":"Register an HTTPS webhook URL for terminal request notifications. Callbacks are sent for both successes and failures; failure callbacks include `error_code` and `error_message`.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Webhook URL to register"}}}}}},"responses":{"200":{"description":"Webhook registered","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID"},"url":{"type":"string","description":"Registered webhook URL"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/RemoveWebhook":{"post":{"summary":"Remove webhook","description":"Remove a registered webhook","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"ID of the webhook to remove"}}}}}},"responses":{"200":{"description":"Webhook removed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the operation was successful"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/Webhooks":{"get":{"summary":"Get webhooks","description":"List all registered webhooks","tags":["Content"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID"},"url":{"type":"string","description":"Registered webhook URL"}}}}}}},"401":{"description":"Unauthorized"}}}},"/content/ModifyPodcast":{"post":{"summary":"Modify podcast","description":"Modify an existing podcast with new voices and background music","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl","voice1","voice2"],"properties":{"audioUrl":{"type":"string","description":"URL to the audio file to modify"},"voice1":{"type":"integer","description":"Numeric id of first voice from /content/GetVoices"},"voice2":{"type":"integer","description":"Numeric id of second voice from /content/GetVoices"},"instructions":{"type":"string","description":"Additional instructions"},"backgroundMusicUrl":{"type":"string","description":"Optional URL to background music file"},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/SeparateSpeakersAudio":{"post":{"summary":"Separate speakers in audio","description":"Separate speakers in an audio file","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","description":"URL to the audio file"},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/CloneVoice":{"post":{"summary":"Clone voice","description":"Clone a voice from an audio file (PRO only). Accepts either a file upload or a URL.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["name"],"properties":{"audioFile":{"type":"string","format":"binary","description":"MP3 audio file to upload (max 10MB). Cannot be used with audioUrl."},"name":{"type":"string","description":"Name for the cloned voice"}}}},"application/json":{"schema":{"type":"object","required":["audioUrl","name"],"properties":{"audioUrl":{"type":"string","description":"URL to the MP3 audio file for voice cloning. Cannot be used with audioFile upload."},"name":{"type":"string","description":"Name for the cloned voice"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/GetTranscript":{"post":{"summary":"Get transcript","description":"Generate transcript from an audio file or episode. Accepts file upload, URL, or episode ID (only one at a time).","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"audioFile":{"type":"string","format":"binary","description":"MP3 or WAV audio file to upload (max 50MB). Cannot be used with audioUrl or episodeId."},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}},"application/json":{"schema":{"type":"object","oneOf":[{"required":["audioUrl"]},{"required":["episodeId"]}],"properties":{"audioUrl":{"type":"string","description":"URL to the audio file (.mp3 or .wav format). Cannot be used with audioFile or episodeId."},"episodeId":{"type":"string","description":"ID of an existing episode to transcribe. Cannot be used with audioFile or audioUrl."},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request (missing parameters, both parameters provided, or invalid audio format)"},"401":{"description":"Unauthorized"}}}},"/content/GetTranscript/{episodeId}":{"get":{"summary":"Get transcript by episode ID","description":"Retrieve an existing transcript for a specific episode","tags":["Content"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"episodeId","required":true,"schema":{"type":"string"},"description":"The ID of the episode to get the transcript for"}],"responses":{"200":{"description":"Transcript retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the operation was successful"},"episodeId":{"type":"string","description":"The episode ID that was requested"},"requestId":{"type":"string","description":"The original request ID used to generate this transcript"},"transcript":{"type":"string","description":"The transcript content (JSON string format)"},"createdOn":{"type":"string","format":"date-time","description":"When the transcript was created"}}}}}},"400":{"description":"Invalid request (missing episode ID)"},"401":{"description":"Unauthorized"},"404":{"description":"Transcript not found for the specified episode ID"},"500":{"description":"Internal server error"}}}},"/content/CreatePodcastCustomScript":{"post":{"summary":"Create podcast from custom script","description":"Create a podcast using a custom script","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["script","voice1","voice2"],"properties":{"script":{"type":"string","description":"Script with SPEAKER_00/SPEAKER_01 prefixes"},"voice1":{"type":"integer","description":"Numeric id of first voice from /content/GetVoices (SPEAKER_00)"},"voice2":{"type":"integer","description":"Numeric id of second voice from /content/GetVoices (SPEAKER_01)"},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/CreatePodcastCustomVoices":{"post":{"summary":"Create podcast with custom voices","description":"Create a podcast with specified voices based on resources, topic, or feeds. Either 'resources', 'topic', or 'feeds' must be provided.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["voice1","voice2"],"properties":{"resources":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","youtube","website","pdf","file"]},"content":{"type":"string","description":"For type \"file\", provide an https URL or a file id returned by POST /files. For other types, provide the text or URL expected by that type."}}},"description":"Resources for content generation (required if topic or feeds are not provided)"},"topic":{"type":"string","description":"Topic for content generation (alternative to resources or feeds)"},"feeds":{"type":"array","items":{"type":"integer"},"description":"Array of feed IDs for content generation (alternative to resources or topic, max 10)"},"projects":{"type":"array","items":{"type":"string"},"description":"Array of project IDs to use as context for generation (max 10)"},"text":{"type":"string","description":"Instructions or query for content generation"},"voice1":{"type":"integer","description":"Numeric id of first voice from /content/GetVoices"},"voice2":{"type":"integer","description":"Numeric id of second voice from /content/GetVoices"},"duration":{"type":"string","enum":["short","long","default"],"description":"Duration preference for content generation"},"style":{"type":"string","enum":["deep dive","brief","critique","debate"],"description":"Style of podcast content (defaults to deep dive)"},"language":{"type":"string","description":"Optional language for the generated podcast (leave empty to use the default)"},"notebookId":{"type":"string","description":"Notebook ID for enterprise clients"},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"Unique ID for tracking the request"},"status":{"type":"integer","description":"Initial status code (0)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/CreateGPT":{"post":{"summary":"Create content via GPT","description":"Special endpoint for GPT integration","x-internal":true,"tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","resources"],"properties":{"email":{"type":"string","format":"email","description":"User email for delivery"},"resources":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","youtube","website","pdf","file"]},"content":{"type":"string","description":"For type \"file\", provide an https URL or a file id returned by POST /files. For other types, provide the text or URL expected by that type."}}},"description":"Resources for content generation (max 3)"},"text":{"type":"string","description":"Instructions or query for content generation"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was accepted"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/content/RemoveVoice":{"post":{"summary":"Remove cloned voice","description":"Remove a cloned voice owned by the current user","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"ID of the voice to remove"}}}}}},"responses":{"200":{"description":"Voice removed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the operation was successful"},"message":{"type":"string","description":"Success message"}}}}}},"400":{"description":"Invalid request or missing voice ID"},"401":{"description":"Unauthorized"},"404":{"description":"Voice not found or cannot be deleted"}}}},"/content/DeleteRequest":{"post":{"summary":"Delete request","description":"Mark a content request as deleted","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"ID of the request to delete"}}}}}},"responses":{"200":{"description":"Request deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the operation was successful"},"message":{"type":"string","description":"Success message"}}}}}},"400":{"description":"Invalid request or missing request ID"},"401":{"description":"Unauthorized"},"404":{"description":"Request not found or not owned by user"},"500":{"description":"Failed to delete request"}}}},"/content/Schedule":{"post":{"summary":"Schedule multiple podcasts","description":"Create multiple podcasts at once, scheduled at intervals from a start time. Supports two modes - URLs mode (one podcast per episode, with each episode containing multiple URLs) or cached sources mode (feedSelections and/or youtubeChannels). Either 'urls' or (feedSelections/youtubeChannels + numberOfEpisodes) must be provided, but not both.","tags":["Content"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["frequency"],"oneOf":[{"required":["urls"]},{"required":["feedSelections","numberOfEpisodes"]},{"required":["youtubeChannels","numberOfEpisodes"]}],"properties":{"urls":{"type":"array","items":{"type":"array","items":{"type":"string","format":"uri"}},"description":"Array of episodes, where each episode is an array of URLs to create a podcast from (URLs mode - cannot be used with feedSelections or youtubeChannels)","example":[["https://example.com/article1","https://example.com/article2"],["https://example.com/article3"]]},"feedSelections":{"type":"array","description":"Cached feed items to include in scheduled episodes (cannot be used with urls)","items":{"$ref":"#/components/schemas/FeedSelection"},"example":[{"feedId":1,"feedItemIds":["post-123","post-456"]}]},"numberOfEpisodes":{"type":"integer","minimum":1,"maximum":100,"description":"Number of episodes to create (required when using feedSelections or youtubeChannels)","example":5},"youtubeChannels":{"type":"array","items":{"type":"string"},"description":"Array of connected YouTube channel IDs to pull recent videos from (cannot be used with urls)","example":["yt-channel-1","yt-channel-2"]},"frequency":{"type":"integer","minimum":1,"description":"Frequency in minutes between scheduled podcasts","example":60},"instructions":{"type":"string","maxLength":500,"description":"Optional instructions for podcast generation","example":"Create a conversational podcast discussing the main points"},"brandUrl":{"type":"string","format":"uri","description":"Optional brand/service URL to include in each podcast (URLs mode only)","example":"https://yourbrand.com"},"duration":{"type":"string","enum":["short","long","default"],"description":"Duration preference for podcasts","example":"default"},"style":{"type":"string","enum":["deep dive","brief","critique","debate"],"description":"Style of podcast content","example":"deep dive"},"language":{"type":"string","description":"Language for podcast generation","example":"English"},"podcastId":{"type":"string","description":"Podcast show ID to associate episodes with"},"episodeTitle":{"type":"string","description":"Optional episode title when associating to a podcast show"},"voice1":{"type":"integer","description":"Numeric id of first voice from /content/GetVoices (if provided, will use custom voices mode)"},"voice2":{"type":"integer","description":"Numeric id of second voice from /content/GetVoices (requires voice1)"},"startOn":{"type":"string","format":"date-time","description":"Start time for scheduling (defaults to current time, cannot be more than 24 hours in the past)","example":"2024-01-01T12:00:00Z"},"callbackData":{"type":"string","description":"Optional data for webhook callbacks"},"notebookId":{"type":"string","description":"Notebook ID for enterprise clients"}}}}}},"responses":{"200":{"description":"Podcasts scheduled successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the operation was successful"},"scheduled_requests":{"type":"array","items":{"oneOf":[{"type":"object","description":"Response for URLs mode","properties":{"request_id":{"type":"string","description":"ID of the scheduled request"},"urls":{"type":"array","items":{"type":"string"},"description":"Array of URLs this request was created from"},"scheduled_on":{"type":"string","format":"date-time","description":"When this request is scheduled to run"},"status":{"type":"integer","description":"Initial status (0)"}}},{"type":"object","description":"Response for feedSelections / YouTube mode","properties":{"request_id":{"type":"string","description":"ID of the scheduled request"},"feed_ids":{"type":"array","items":{"type":"integer"},"description":"Feed IDs used for this episode (if any)"},"feed_selections":{"type":"array","items":{"$ref":"#/components/schemas/FeedSelection"},"description":"Feed selections used for this episode"},"feed_items_per_episode":{"type":"integer","description":"Total cached items included across feeds for this episode"},"youtube_channel_ids":{"type":"array","items":{"type":"string"},"description":"YouTube channel IDs used for this episode"},"episode_number":{"type":"integer","description":"Episode number in the series"},"scheduled_on":{"type":"string","format":"date-time","description":"When this request is scheduled to run"},"status":{"type":"integer","description":"Initial status (0)"}}}]}},"total_created":{"type":"integer","description":"Total number of requests created"},"start_time":{"type":"string","format":"date-time","description":"Start time used for scheduling"},"frequency_minutes":{"type":"integer","description":"Frequency in minutes between requests"},"mode":{"type":"string","enum":["URLs","sources"],"description":"Mode used for scheduling"},"total_feeds_per_episode":{"type":"integer","description":"Number of feed groups per episode (sources mode only)"},"total_feed_items_per_episode":{"type":"integer","description":"Number of cached feed items per episode (sources mode only)"},"total_youtube_channels_per_episode":{"type":"integer","description":"Number of YouTube channels per episode (sources mode only)"},"total_urls":{"type":"integer","description":"Total number of URLs across all episodes (URLs mode only)"}}}}}},"400":{"description":"Invalid request parameters or insufficient credits"},"401":{"description":"Unauthorized"}}}},"/data-tables/get":{"get":{"summary":"Get data tables","description":"Returns paginated data tables created by the authenticated token, including in-progress requests (default 20 per page, max 100).","tags":["Data Tables"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"description":"Page number (default 1)"},{"in":"query","name":"pageSize","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Items per page (default 20, max 100)"}],"responses":{"200":{"description":"Paginated list of data tables","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DataTable"}},"totalCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}}}}}},"401":{"description":"Unauthorized"}}}},"/data-tables/{dataTableId}/download":{"get":{"summary":"Download data table","description":"Streams the generated data table file for the authenticated token.","tags":["Data Tables"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"dataTableId","required":true,"schema":{"type":"string"},"description":"Data table request identifier"}],"responses":{"200":{"description":"Binary data table file stream","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Data table not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/deep-research/research":{"post":{"summary":"Perform deep research on a given query","description":"Conducts advanced research on the provided text query and returns results in the specified output format","tags":["Deep Research"],"operationId":"research","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","outputType"],"properties":{"text":{"type":"string","description":"The research query text","example":"What are the latest developments in artificial intelligence?"},"outputType":{"type":"string","enum":["text","json"],"description":"The format of the output result. When set to json, the response is serialized JSON.","example":"json"},"jsonFormat":{"type":"string","description":"Optional instructions or template describing the JSON structure to generate.","example":"{\n \"summary\": \"\",\n \"keyFindings\": [],\n \"sources\": []\n}\n"},"provider":{"type":"string","enum":["gemini","openai"],"description":"The AI provider to use for research (defaults to gemini)","example":"gemini"},"projectIds":{"type":"array","items":{"type":"string"},"description":"Optional array of project IDs to add context from their descriptions","example":["proj-123","proj-456"]},"files":{"type":"array","description":"Optional array of file URLs or uploaded file IDs (from /files) to attach to the research request","items":{"type":"string"},"example":["https://example.com/reference.pdf","2c9fe88f-d3e2-41a8-9156-76c5e34dbfdd"]},"callbackData":{"type":"string","description":"Optional callback data to be returned with the response","example":"user-specific-data"},"isScheduled":{"type":"boolean","description":"If true, creates a recurring schedule instead of a one-time request","example":false},"dailyCount":{"type":"integer","minimum":1,"maximum":24,"description":"Number of times per day to execute the research (default 1, only used when isScheduled is true)","example":2},"scheduleEndDate":{"type":"string","format":"date-time","description":"Optional end date for the schedule (only used when isScheduled is true). If not provided, schedule runs indefinitely.","example":"2024-12-31T23:59:59Z"}}}}}},"responses":{"200":{"description":"Research request or schedule submitted successfully","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Response for a one-time research request","properties":{"request_id":{"type":"string","description":"The unique ID of the created research request","example":"550e8400-e29b-41d4-a716-446655440000"}}},{"type":"object","description":"Response for a scheduled research request","properties":{"schedule_id":{"type":"string","description":"The unique ID of the created schedule","example":"550e8400-e29b-41d4-a716-446655440000"},"message":{"type":"string","description":"Confirmation message for the schedule","example":"Deep research scheduled 2 time(s) per day until 2024-12-31T23:59:59.000Z"},"dailyCount":{"type":"integer","description":"Number of times per day the research will execute","example":2},"endDate":{"type":"string","format":"date-time","description":"End date for the schedule, or null if no end date","example":"2024-12-31T23:59:59Z"}}}]}}}},"400":{"description":"Bad request - validation error or unauthorized access","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}}},"get":{"summary":"Get all deep research requests","description":"Retrieves all deep research requests made by the authenticated user","tags":["Deep Research"],"operationId":"getResearches","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved deep research requests","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The request ID","example":"550e8400-e29b-41d4-a716-446655440000"},"requestedOn":{"type":"string","format":"date-time","description":"When the request was made","example":"2024-01-15T10:30:00Z"},"succeededOn":{"type":"string","format":"date-time","description":"When the request was completed","example":"2024-01-15T10:35:00Z"},"status":{"type":"integer","description":"Request status (0=pending, 5=processing, 100=completed)","example":100},"errorOn":{"type":"string","format":"date-time","description":"When the error occurred","example":null},"errorMessage":{"type":"string","description":"Error message if request failed","example":null},"errorCode":{"type":"integer","description":"Error code if request failed","example":0},"prompt":{"type":"string","description":"The research query text","example":"What are the latest developments in artificial intelligence?"},"outputType":{"type":"string","description":"Output format used for the response (text or json)","example":"json"},"jsonFormat":{"type":"string","description":"JSON formatting instructions applied when outputType is json","example":"{\"summary\":\"\",\"keyInsights\":[]}"},"isScheduleTemplate":{"type":"boolean","description":"True if this item is a schedule template rather than an executed request","example":true},"scheduleId":{"type":"string","description":"The ID of the schedule template","example":"550e8400-e29b-41d4-a716-446655440000"},"dailyCount":{"type":"integer","description":"Number of times per day this schedule will execute","example":2},"scheduleEndDate":{"type":"string","format":"date-time","description":"End date for the schedule, or null if it runs indefinitely","example":"2024-12-31T23:59:59Z"},"lastScheduleExecutionOn":{"type":"string","format":"date-time","description":"The most recent time this schedule executed","example":"2024-01-16T09:00:00Z"},"nextScheduleExecutionOn":{"type":"string","format":"date-time","description":"The next scheduled execution time","example":"2024-01-16T12:00:00Z"}}}}}}}}}},"/deep-research/research/{id}":{"get":{"summary":"Get a specific deep research request by ID","description":"Retrieves a single deep research request by its unique ID","tags":["Deep Research"],"operationId":"getResearchById","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"The ID of the deep research request to retrieve"}],"responses":{"200":{"description":"Successfully retrieved deep research request","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The request ID","example":"550e8400-e29b-41d4-a716-446655440000"},"requestedOn":{"type":"string","format":"date-time","description":"When the request was made","example":"2024-01-15T10:30:00Z"},"succeededOn":{"type":"string","format":"date-time","description":"When the request was completed","example":"2024-01-15T10:35:00Z"},"status":{"type":"integer","description":"Request status (0=pending, 5=processing, 100=completed)","example":100},"errorOn":{"type":"string","format":"date-time","description":"When the error occurred","example":null},"errorMessage":{"type":"string","description":"Error message if request failed","example":null},"errorCode":{"type":"integer","description":"Error code if request failed","example":0},"prompt":{"type":"string","description":"The research query text","example":"What are the latest developments in artificial intelligence?"},"outputType":{"type":"string","description":"Output format used for the response (text or json)","example":"json"},"jsonFormat":{"type":"string","description":"JSON formatting instructions applied when outputType is json","example":"{\"summary\":\"\",\"keyInsights\":[]}"},"isScheduleTemplate":{"type":"boolean","description":"True if this item is a schedule template rather than an executed request","example":true},"scheduleId":{"type":"string","description":"The ID of the schedule template","example":"550e8400-e29b-41d4-a716-446655440000"},"dailyCount":{"type":"integer","description":"Number of times per day this schedule will execute","example":2},"scheduleEndDate":{"type":"string","format":"date-time","description":"End date for the schedule, or null if it runs indefinitely","example":"2024-12-31T23:59:59Z"},"lastScheduleExecutionOn":{"type":"string","format":"date-time","description":"The most recent time this schedule executed","example":"2024-01-16T09:00:00Z"},"nextScheduleExecutionOn":{"type":"string","format":"date-time","description":"The next scheduled execution time","example":"2024-01-16T12:00:00Z"},"responseText":{"type":"string","description":"The research result content. When outputType is json, this value is a serialized JSON string.","example":"{\"summary\":\"AI advancements\",\"keyInsights\":[\"...\"]}"}}}}}},"404":{"description":"Deep research request not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Deep research request not found"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}}}},"/documents/get":{"get":{"summary":"Get documents","description":"Returns paginated briefing documents created by the authenticated token, including in-progress requests.","tags":["Documents"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"description":"Page number (default 1)"},{"in":"query","name":"pageSize","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Items per page (default 20, max 100)"}],"responses":{"200":{"description":"Paginated list of documents","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"totalCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}}}}}},"401":{"description":"Unauthorized"}}}},"/documents/{documentId}":{"get":{"summary":"Get document","description":"Returns the stored briefing document payload for the authenticated token.","tags":["Documents"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"documentId","required":true,"schema":{"type":"string"},"description":"Document request identifier"}],"responses":{"200":{"description":"Document payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Document not found"}}}},"/documents/{documentId}/download":{"get":{"summary":"Download document","description":"Downloads the stored briefing document as PDF, HTML, or text for the authenticated token.","tags":["Documents"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"documentId","required":true,"schema":{"type":"string"},"description":"Document request identifier"}],"responses":{"200":{"description":"Document download","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Document not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/documents/{documentId}/preview":{"get":{"summary":"Preview document","description":"Streams the stored briefing document inline using its native format. Supports PDF, HTML, and plain text documents for the authenticated token.","tags":["Documents"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"documentId","required":true,"schema":{"type":"string"},"description":"Document request identifier"}],"responses":{"200":{"description":"Document preview","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}},"text/html":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Document not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/infographics/get":{"get":{"summary":"Get infographics","description":"Returns paginated infographics created by the authenticated token, including in-progress requests (default 20 per page, max 100).","tags":["Infographics"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"description":"Page number (default 1)"},{"in":"query","name":"pageSize","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Items per page (default 20, max 100)"}],"responses":{"200":{"description":"Paginated list of infographics","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Infographic"}},"totalCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}}}}}},"401":{"description":"Unauthorized"}}}},"/infographics/{infographicId}/download":{"get":{"summary":"Download infographic","description":"Streams the generated infographic image for the authenticated token.","tags":["Infographics"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"infographicId","required":true,"schema":{"type":"string"},"description":"Infographic request identifier"}],"responses":{"200":{"description":"Binary infographic image stream","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Infographic not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/quizzes/get":{"get":{"summary":"Get quizzes","description":"Returns paginated quizzes created by the authenticated token, including in-progress requests (default 20 per page, max 100).","tags":["Quizzes"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"description":"Page number (default 1)"},{"in":"query","name":"pageSize","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Items per page (default 20, max 100)"}],"responses":{"200":{"description":"Paginated list of quizzes","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Quiz"}},"totalCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}}}}}},"401":{"description":"Unauthorized"}}}},"/quizzes/{quizId}/download":{"get":{"summary":"Download quiz","description":"Downloads the generated quiz JSON for the authenticated token.","tags":["Quizzes"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"quizId","required":true,"schema":{"type":"string"},"description":"Quiz request identifier"}],"responses":{"200":{"description":"Quiz JSON download","content":{"application/json":{"schema":{"type":"string"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Quiz not found or not ready"}}}},"/share/podcast/{requestId}/{t}":{"get":{"summary":"Get a shared podcast","description":"Publicly retrieve a podcast by requestId and date string without requiring authentication","tags":["Share"],"parameters":[{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The ID of the podcast to retrieve"},{"in":"path","name":"t","required":true,"schema":{"type":"string"},"description":"Date in YYYYMMDD format to validate the request"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"integer"},"requestedOn":{"type":"string","format":"date-time"},"succeededOn":{"type":"string","format":"date-time"},"requestTypeId":{"type":"integer"},"audioTitle":{"type":"string"},"audioUrl":{"type":"string"},"responseText":{"type":"string"},"script":{"type":"string"},"voice1":{"type":"integer"},"voice2":{"type":"integer"},"language":{"type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters"},"404":{"description":"Podcast not found"}}}},"/share/video/{requestId}/{t}":{"get":{"summary":"Get a shared video","description":"Publicly retrieve a generated video by requestId and date string without requiring authentication","tags":["Share"],"parameters":[{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The ID of the video to retrieve"},{"in":"path","name":"t","required":true,"schema":{"type":"string"},"description":"Date in YYYYMMDD format to validate the request"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"integer"},"requestedOn":{"type":"string","format":"date-time"},"succeededOn":{"type":"string","format":"date-time"},"videoTitle":{"type":"string"},"videoUrl":{"type":"string"},"imageUrl":{"type":"string"},"responseText":{"type":"string"},"language":{"type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters"},"404":{"description":"Video not found"}}}},"/share/infographic/{requestId}/{t}":{"get":{"summary":"Get a shared infographic","description":"Publicly retrieve an infographic by requestId and date string without requiring authentication","tags":["Share"],"parameters":[{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The ID of the infographic to retrieve"},{"in":"path","name":"t","required":true,"schema":{"type":"string"},"description":"Date in YYYYMMDD format to validate the request"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"requestedOn":{"type":"string","format":"date-time"},"title":{"type":"string"},"imageUrl":{"type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters"},"404":{"description":"Infographic not found"}}}},"/share/slide-deck/{requestId}/{t}":{"get":{"summary":"Get a shared slide deck","description":"Publicly retrieve a slide deck by requestId and date string without requiring authentication","tags":["Share"],"parameters":[{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The ID of the slide deck to retrieve"},{"in":"path","name":"t","required":true,"schema":{"type":"string"},"description":"Date in YYYYMMDD format to validate the request"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"requestedOn":{"type":"string","format":"date-time"},"title":{"type":"string"},"deckUrl":{"type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters"},"404":{"description":"Slide deck not found"}}}},"/share/quiz/{requestId}/{t}":{"get":{"summary":"Get a shared quiz","description":"Publicly retrieve a quiz by requestId and date string without requiring authentication","tags":["Share"],"parameters":[{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The ID of the quiz to retrieve"},{"in":"path","name":"t","required":true,"schema":{"type":"string"},"description":"Date in YYYYMMDD format to validate the request"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"requestedOn":{"type":"string","format":"date-time"},"quizJson":{"type":"string"}}}}}},"400":{"description":"Bad Request - Invalid parameters"},"404":{"description":"Quiz not found"}}}},"/slide-decks/get":{"get":{"summary":"Get slide decks","description":"Returns paginated slide decks created by the authenticated token, including in-progress requests (default 20 per page, max 100).","tags":["Slide Decks"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"description":"Page number (default 1)"},{"in":"query","name":"pageSize","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Items per page (default 20, max 100)"}],"responses":{"200":{"description":"Paginated list of slide decks","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SlideDeck"}},"totalCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}}}}}},"401":{"description":"Unauthorized"}}}},"/slide-decks/{slideDeckId}/download":{"get":{"summary":"Download slide deck","description":"Streams the generated slide deck file (PDF or PPT) for the authenticated token.","tags":["Slide Decks"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"slideDeckId","required":true,"schema":{"type":"string"},"description":"Slide deck request identifier"}],"responses":{"200":{"description":"Binary slide deck stream","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Slide deck not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/slide-decks/{slideDeckId}/preview":{"get":{"summary":"Preview slide deck","description":"Streams the generated slide deck file inline for browser previews.","tags":["Slide Decks"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"slideDeckId","required":true,"schema":{"type":"string"},"description":"Slide deck request identifier"}],"responses":{"200":{"description":"Inline slide deck stream","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-powerpoint":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Slide deck not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/slide-decks/public/{slideDeckId}/preview":{"get":{"summary":"Public preview slide deck","description":"Streams the slide deck inline without authentication for marketing/demo pages.","tags":["Slide Decks"],"parameters":[{"in":"path","name":"slideDeckId","required":true,"schema":{"type":"string"},"description":"Slide deck request identifier"}],"responses":{"200":{"description":"Inline slide deck stream","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Slide deck not found or not ready"},"502":{"description":"Upstream asset unavailable"}}}},"/slide-decks/public-preview":{"get":{"summary":"Public preview slide deck by URL","description":"Streams a whitelisted slide deck URL inline (PDF) without authentication.","tags":["Slide Decks"],"parameters":[{"in":"query","name":"url","required":true,"schema":{"type":"string","format":"uri"},"description":"Direct URL to the slide deck asset (limited to autocontentapi.blob.core.windows.net)"}],"responses":{"200":{"description":"Inline slide deck stream","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Missing or invalid URL"},"502":{"description":"Upstream asset unavailable"}}}},"/video/GetAvatars":{"get":{"summary":"Get available avatars","description":"List all available avatars for video generation","tags":["Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Avatar"}}}}},"401":{"description":"Unauthorized"}}}},"/video/GetShorts":{"get":{"summary":"Get shorts videos","description":"List all shorts videos for the authenticated user (includes pending, processing, completed, and failed)","tags":["Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Short"}}}}},"401":{"description":"Unauthorized"}}}},"/video/CreateShorts":{"post":{"summary":"Create shorts","description":"Create short videos from audio content or feeds","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["avatar1"],"properties":{"audioUrl":{"type":"string","description":"URL to the audio file to create shorts from (optional if feedIds provided)"},"feedIds":{"type":"array","items":{"type":"string"},"description":"Array of feed IDs to generate content from (optional if audioUrl provided)"},"prompt":{"type":"string","description":"Optional instructions for short creation"},"avatar1":{"type":"string","description":"ID of the first avatar to use"},"avatar2":{"type":"string","description":"Optional ID of the second avatar to use"},"subtitles":{"type":"boolean","description":"Optional boolean to include subtitles (default: true)"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Request identifier"},"status":{"type":"integer","description":"Initial status code (0 = pending)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/video/CreateShortsFromContent":{"post":{"summary":"Create shorts from text","description":"Create short videos from text content or feeds","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["avatar1"],"properties":{"content":{"type":"string","description":"Text content to create shorts from (optional if feedIds provided)"},"feedIds":{"type":"array","items":{"type":"string"},"description":"Array of feed IDs to generate content from (optional if content provided)"},"prompt":{"type":"string","description":"Optional instructions for short creation"},"avatar1":{"type":"string","description":"ID of the first avatar to use"},"avatar2":{"type":"string","description":"Optional ID of the second avatar to use"},"subtitles":{"type":"boolean","description":"Optional boolean to include subtitles (default: true)"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Request identifier"},"status":{"type":"integer","description":"Initial status code (0 = pending)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/video/CreateShortsFromScript":{"post":{"summary":"Create shorts from script","description":"Create short videos from a custom script with avatar dialogue or from feeds","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"script":{"type":"array","description":"Array of dialogue entries with avatar IDs and text (optional if feedIds provided)","items":{"type":"object","required":["avatarId","text"],"properties":{"avatarId":{"type":"number","description":"ID of the avatar speaking this line"},"text":{"type":"string","description":"Text for the avatar to speak"}}}},"feedIds":{"type":"array","items":{"type":"string"},"description":"Array of feed IDs to generate content from (optional if script provided)"},"subtitles":{"type":"boolean","description":"Optional boolean to include subtitles (default: true)"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Request identifier"},"status":{"type":"integer","description":"Initial status code (0 = pending)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/video/CreateShortsFromDeepResearch":{"post":{"summary":"Create shorts from deep research","description":"Create short videos from the results of a completed deep research","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deepResearchId","avatar1"],"properties":{"deepResearchId":{"type":"string","description":"ID of the completed deep research to create shorts from"},"prompt":{"type":"string","description":"Optional instructions for short creation"},"avatar1":{"type":"string","description":"ID of the first avatar to use"},"avatar2":{"type":"string","description":"Optional ID of the second avatar to use"},"subtitles":{"type":"boolean","description":"Optional boolean to include subtitles (default: true)"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Request identifier"},"status":{"type":"integer","description":"Initial status code (0 = pending)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"404":{"description":"Deep research not found or not accessible"}}}},"/video/CreateAvatar":{"post":{"summary":"Create avatar","description":"Create a new talking head avatar from text or image","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name for the avatar"},"imageUrl":{"type":"string","description":"Optional URL to an image to use as the base for the avatar"},"prompt":{"type":"string","description":"Optional text prompt describing the avatar (used when imageUrl is not provided)"},"voiceId":{"type":"integer","description":"Optional numeric voice id from /content/GetVoices to use for the avatar"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}},"multipart/form-data":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name for the avatar"},"imageFile":{"type":"string","format":"binary","description":"Image file to use as the base for the avatar (max 10MB, image files only)"},"prompt":{"type":"string","description":"Optional text prompt describing the avatar (used when imageFile is not provided)"},"voiceId":{"type":"integer","description":"Optional numeric voice id from /content/GetVoices to use for the avatar"},"callbackData":{"type":"string","description":"Optional data to include in webhooks"},"scheduledOn":{"type":"string","format":"date-time","description":"Optional date/time to schedule the request for processing"}}}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Request identifier"},"status":{"type":"integer","description":"Initial status code (0 = pending)"}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"}}}},"/video/UpdateAvatarVoice":{"post":{"summary":"Update avatar voice","description":"Update the voice assigned to an existing avatar","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["avatarId","voiceId"],"properties":{"avatarId":{"type":"integer","description":"ID of the avatar to update"},"voiceId":{"type":"integer","description":"Numeric voice id from /content/GetVoices to assign to the avatar"}}}}}},"responses":{"200":{"description":"Avatar voice updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Success status"},"message":{"type":"string","description":"Success message"}}}}}},"400":{"description":"Invalid request (missing or invalid parameters)"},"401":{"description":"Unauthorized"},"404":{"description":"Avatar not found or not accessible"},"500":{"description":"Failed to update avatar voice"}}}},"/video/GetExplainerVideos":{"get":{"summary":"Get explainer videos","description":"List all explainer videos for the authenticated user","tags":["Video"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Video explainer identifier (matches request ID)"},"title":{"type":"string","description":"Title of the explainer video"},"description":{"type":"string","description":"Description of the explainer video"},"videoUrl":{"type":"string","description":"URL to the explainer video"},"fileSize":{"type":"integer","description":"Size of the video file in bytes"},"durationSeconds":{"type":"integer","description":"Duration of the video in seconds"},"shareUrl":{"type":"string","description":"Shareable public URL for the video"},"createdOn":{"type":"string","format":"date-time","description":"Creation date of the explainer video"},"requestedOn":{"type":"string","format":"date-time","description":"Request creation date"},"succeededOn":{"type":"string","format":"date-time","description":"Completion date"},"status":{"type":"integer","description":"Status code (100 = completed)"},"errorOn":{"type":"string","format":"date-time","description":"Error occurrence date (if applicable)"},"errorMessage":{"type":"string","description":"Error message (if applicable)"},"callbackData":{"type":"string","description":"Custom callback data"},"scheduledOn":{"type":"string","format":"date-time","description":"Scheduled processing time (if applicable)"}}}}}}},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/video/Transcribe":{"post":{"summary":"Transcribe an explainer video","description":"Submit a transcription job for an explainer video by ID","tags":["Video"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["videoId"],"properties":{"videoId":{"type":"string","description":"Explainer video ID (request ID)"}}}}}},"responses":{"200":{"description":"Transcription request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string"},"status":{"type":"integer"}}}}}},"400":{"description":"Invalid request (missing videoId)"},"401":{"description":"Unauthorized"},"404":{"description":"Explainer video not found or not ready"}}}},"/video/Transcript/{videoId}":{"get":{"summary":"Get an explainer transcript","description":"Retrieve the transcript for a completed explainer video","tags":["Video"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"videoId","required":true,"schema":{"type":"string"},"description":"Explainer video ID (request ID)"}],"responses":{"200":{"description":"Transcript retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainerTranscript"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Transcript not found for the specified explainer video"}}}},"/video/GenerateIntroImage":{"get":{"summary":"Generate branded intro image","description":"Generate the branded intro image used for explainer videos and download the PNG asset.","tags":["Video"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"title","required":true,"schema":{"type":"string"},"description":"Title text rendered on the intro image."},{"in":"query","name":"subtitle","required":false,"schema":{"type":"string"},"description":"Optional subtitle text displayed beneath the title."},{"in":"query","name":"logoUrl","required":false,"schema":{"type":"string"},"description":"Optional logo URL to render on the intro image."},{"in":"query","name":"heroImageUrl","required":false,"schema":{"type":"string"},"description":"Optional hero/background image URL composited into the intro artwork."}],"responses":{"200":{"description":"PNG image download containing the branded intro artwork.","headers":{"X-Intro-Image-Url":{"description":"Public URL of the uploaded intro image variant when available.","schema":{"type":"string"}},"X-Intro-Image-Size":{"description":"Size of the generated intro image in bytes.","schema":{"type":"integer"}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Missing or invalid query parameters."},"401":{"description":"Unauthorized"},"500":{"description":"Error generating or uploading the intro image"}}}},"/x/post":{"post":{"summary":"Create an X (Twitter) post or thread request","description":"Creates a request to generate and publish a tweet or thread from various content sources. Supports immediate execution or scheduling.","tags":["X"],"operationId":"createPost","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["tweet","thread"],"description":"Whether to create a single tweet or a thread","example":"tweet"},"feedIds":{"type":"string","description":"Optional feed IDs to use as content sources (max 10). When using multipart/form-data, send as comma-separated string.","example":"101,202"},"deepResearchIds":{"type":"string","description":"Optional deep research request IDs to use as content sources (max 10). When using multipart/form-data, send as comma-separated string.","example":"550e8400-e29b-41d4-a716-446655440000,660e8400-e29b-41d4-a716-446655440000"},"projectIds":{"type":"string","description":"Optional project IDs to use as context for generation (max 10). When using multipart/form-data, send as comma-separated string.","example":"123e4567-e89b-12d3-a456-426614174000,234e5678-f90a-23e4-b567-537725285111"},"audioUrl":{"type":"string","description":"Optional audio URL to transcribe and use as content source","example":"https://example.com/audio.mp3"},"promptAudioFile":{"type":"string","format":"binary","description":"Audio file to upload and transcribe as style instructions (alternative to promptAudioUrl)"},"url":{"type":"string","description":"Optional URL to scrape and use as content source","example":"https://example.com/article"},"text":{"type":"string","description":"Optional raw text to post (or to seed generation)","example":"Here are my thoughts on today's AI news..."},"prompt":{"type":"string","description":"Optional style instructions to guide the content generation","example":"Make it funny and casual, use emojis"},"tweetStyle":{"type":"string","enum":["OneLiner","Paragraphs","Explainer"],"description":"Optional formatting style for the tweet. OneLiner for concise tweets, Paragraphs for story-style tweets, Explainer for educational content. If not specified, a random style will be selected.","example":"Paragraphs"},"count":{"type":"integer","minimum":1,"maximum":10,"description":"Number of tweets/threads to generate (default 1)","example":3},"deepResearch":{"type":"boolean","description":"If true, triggers deep research to gather additional context and insights before generating the tweet/thread. This enhances the content with supporting evidence, implications, and key learnings.","example":false},"imageUrl":{"type":"string","description":"URL to an image to include context from (will be analyzed and described)","example":"https://example.com/image.jpg"},"imageFile":{"type":"string","format":"binary","description":"Image file to upload and include context from (will be analyzed and described). Max 10MB."},"callbackData":{"type":"string","description":"Optional opaque value returned in eventual callbacks","example":"user-specific-data"},"isScheduled":{"type":"boolean","description":"If true, creates a recurring schedule instead of a one-time request","example":false},"dailyCount":{"type":"integer","minimum":1,"maximum":100,"description":"Number of times per day to execute when scheduled (default 1)","example":2},"scheduleEndDate":{"type":"string","format":"date-time","description":"Optional end date for the schedule. If not provided, schedule runs indefinitely.","example":"2024-12-31T23:59:59Z"}},"oneOf":[{"required":["type","feedIds"]},{"required":["type","deepResearchIds"]},{"required":["type","audioUrl"]},{"required":["type","url"]},{"required":["type","text"]},{"required":["type","imageUrl"]},{"required":["type","imageFile"]}]}},"application/json":{"schema":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["tweet","thread"],"description":"Whether to create a single tweet or a thread","example":"tweet"},"feedIds":{"type":"array","items":{"type":"integer"},"description":"Optional feed IDs to use as content sources (max 10)","example":[101,202]},"deepResearchIds":{"type":"array","items":{"type":"string"},"description":"Optional deep research request IDs to use as content sources (max 10)","example":["550e8400-e29b-41d4-a716-446655440000"]},"projectIds":{"type":"array","items":{"type":"string"},"description":"Optional project IDs to use as context for generation (max 10)","example":["123e4567-e89b-12d3-a456-426614174000","proj-456"]},"audioUrl":{"type":"string","description":"Optional audio URL to transcribe and use as content source","example":"https://example.com/audio.mp3"},"promptAudioUrl":{"type":"string","description":"URL to an audio file to transcribe and use as the prompt/style instructions","example":"https://example.com/prompt-audio.mp3"},"url":{"type":"string","description":"Optional URL to scrape and use as content source","example":"https://example.com/article"},"text":{"type":"string","description":"Optional raw text to post (or to seed generation)","example":"Here are my thoughts on today's AI news..."},"prompt":{"type":"string","description":"Optional style instructions to guide the content generation","example":"Make it funny and casual, use emojis"},"imageUrl":{"type":"string","description":"URL to an image to include context from (will be analyzed and described)","example":"https://example.com/image.jpg"},"tweetStyle":{"type":"string","enum":["OneLiner","Paragraphs","Explainer"],"description":"Optional formatting style for the tweet. OneLiner for concise tweets, Paragraphs for story-style tweets, Explainer for educational content. If not specified, a random style will be selected.","example":"Paragraphs"},"count":{"type":"integer","minimum":1,"maximum":10,"description":"Number of tweets/threads to generate (default 1)","example":3},"deepResearch":{"type":"boolean","description":"If true, triggers deep research to gather additional context and insights before generating the tweet/thread. This enhances the content with supporting evidence, implications, and key learnings.","example":false},"callbackData":{"type":"string","description":"Optional opaque value returned in eventual callbacks","example":"user-specific-data"},"isScheduled":{"type":"boolean","description":"If true, creates a recurring schedule instead of a one-time request","example":false},"dailyCount":{"type":"integer","minimum":1,"maximum":100,"description":"Number of times per day to execute when scheduled (default 1)","example":2},"scheduleEndDate":{"type":"string","format":"date-time","description":"Optional end date for the schedule. If not provided, schedule runs indefinitely.","example":"2024-12-31T23:59:59Z"},"imageFile":{"type":"string","description":"Base64 encoded image file to include context from (will be analyzed and described). Cannot be used with imageUrl.","example":"data:image/jpeg;base64,/9j/4AAQSkZJRg..."}},"oneOf":[{"required":["type","feedIds"]},{"required":["type","deepResearchIds"]},{"required":["type","audioUrl"]},{"required":["type","url"]},{"required":["type","text"]},{"required":["type","imageUrl"]}]}}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Response for a one-time X post request","properties":{"request_id":{"type":"string","description":"The unique ID of the created request","example":"550e8400-e29b-41d4-a716-446655440000"}}},{"type":"object","description":"Response for a scheduled X post request","properties":{"schedule_id":{"type":"string","description":"The unique ID of the created schedule","example":"550e8400-e29b-41d4-a716-446655440000"},"message":{"type":"string","description":"Confirmation message for the schedule","example":"X tweet scheduled 2 time(s) per day until 2024-12-31T23:59:59Z"},"dailyCount":{"type":"integer","description":"Number of times per day the X post will be created","example":2},"endDate":{"type":"string","format":"date-time","description":"End date for the schedule, or null if no end date","example":"2024-12-31T23:59:59Z"}}}]}}}},"400":{"description":"Bad request - validation error or unauthorized access","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Missing type parameter (tweet or thread)"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Too many requests - rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Rate limit exceeded. Please wait 5 seconds before creating another X post request."}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}}}},"/x/post/quick":{"post":{"summary":"Quick-create an X (Twitter) post or thread","description":"Minimal input endpoint. Provide type and either queryText or queryAudioFile, optionally an image.","tags":["X"],"operationId":"createPostQuick","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["tweet","thread"],"description":"Whether to create a single tweet or a thread","example":"tweet"},"queryText":{"type":"string","description":"Text query to drive the generation (required if queryAudioFile not provided)","example":"Top 3 AI news today in an engaging tone"},"tweetStyle":{"type":"string","enum":["OneLiner","Paragraphs","Explainer"],"description":"Optional formatting style for the tweet. OneLiner for concise tweets, Paragraphs for story-style tweets, Explainer for educational content. If not specified, a random style will be selected.","example":"Paragraphs"},"count":{"type":"integer","minimum":1,"maximum":10,"description":"Number of tweets/threads to generate (default 1)","example":3},"deepResearch":{"type":"boolean","description":"If true, triggers deep research to gather additional context and insights before generating the tweet/thread. This enhances the content with supporting evidence, implications, and key learnings.","example":false},"queryAudioFile":{"type":"string","format":"binary","description":"Optional audio file to upload and transcribe as the query (required if queryText not provided)"},"imageFile":{"type":"string","format":"binary","description":"Optional image to upload and include context from"}}},"oneOf":[{"required":["type","queryText"]},{"required":["type","queryAudioFile"]}]}}},"responses":{"200":{"description":"Request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"The unique ID of the created request","example":"550e8400-e29b-41d4-a716-446655440000"}}}}}},"400":{"description":"Bad request - validation error or unauthorized access","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Too many requests - rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Rate limit exceeded. Please wait 5 seconds before creating another X post request."}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}}}}},"/x/refine":{"post":{"summary":"Refine an existing X (Twitter) post","description":"Refines an existing tweet based on user instructions while maintaining context. Costs 1 credit. Can update the tweet text and any associated data tables or charts.","tags":["X"],"operationId":"refineTweet","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tweetId"],"properties":{"tweetId":{"type":"string","description":"The unique ID of the tweet to refine","example":"550e8400-e29b-41d4-a716-446655440000"},"prompt":{"type":"string","description":"Instructions for how to refine the tweet","example":"Make it more engaging and add relevant emojis"},"promptAudioUrl":{"type":"string","description":"URL to an audio file to transcribe and use as refinement instructions. Required if prompt is not provided.","example":"https://example.com/refinement-audio.mp3"}}}}}},"responses":{"200":{"description":"Tweet refined successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"post":{"type":"object","properties":{"id":{"type":"string","description":"The unique ID of the refined tweet","example":"550e8400-e29b-41d4-a716-446655440000"},"requestId":{"type":"string","description":"The original request ID","example":"660e8400-e29b-41d4-a716-446655440000"},"result":{"type":"string","description":"The refined tweet text","example":"🚀 Just launched our new AI feature! It's revolutionizing how teams collaborate. Check it out! 💡"},"type":{"type":"string","description":"The post type","example":"tweet"},"order":{"type":"integer","description":"Order in thread (0 for single tweets)","example":1},"createdOn":{"type":"string","format":"date-time","description":"Original creation date","example":"2024-01-15T10:35:00Z"},"tweetImageUrl":{"type":"string","nullable":true,"description":"Main image for the tweet if present","example":"https://cdn.example.com/user-image.jpg"},"dataTableImageUrl":{"type":"string","nullable":true,"description":"URL to updated data table image if present","example":"https://cdn.example.com/table-updated.png"},"barChartImageUrl":{"type":"string","nullable":true,"description":"URL to updated bar chart image if present","example":"https://cdn.example.com/chart-updated.png"}}}}}}}},"400":{"description":"Bad request - validation error or insufficient credits","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Insufficient credits for tweet refinement. Please upgrade to continue."}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"404":{"description":"Tweet not found or unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Tweet not found or unauthorized"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}}}},"/x/posts":{"get":{"summary":"Get generated X (Twitter) posts for the authenticated user","description":"Returns the list of generated X posts and threads, including visualization image URLs when available. Supports optional pagination.","tags":["X"],"operationId":"getPosts","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved X posts","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique ID of the post (use this for refinement)","example":"550e8400-e29b-41d4-a716-446655440000"},"requestId":{"type":"string","description":"The request ID that generated this post","example":"660e8400-e29b-41d4-a716-446655440000"},"result":{"type":"string","description":"The tweet text content","example":"Just launched our new AI feature! It's amazing."},"type":{"type":"string","description":"The post type (tweet or thread item)","example":"tweet"},"order":{"type":"integer","description":"Order in thread (starts at 0)","example":0},"createdOn":{"type":"string","format":"date-time","description":"When the post was created","example":"2024-01-15T10:35:00Z"},"tweetImageUrl":{"type":"string","nullable":true,"description":"Main image for the tweet (from user upload or provided URL). When present, visualization images are not generated.","example":"https://cdn.example.com/user-image.jpg"},"dataTableImageUrl":{"type":"string","nullable":true,"description":"URL to generated data table image if present","example":"https://cdn.example.com/table.png"},"barChartImageUrl":{"type":"string","nullable":true,"description":"URL to generated bar chart image if present","example":"https://cdn.example.com/chart.png"}}}}},"oneOf":[{"type":"object","description":"Non-paginated response (when page and limit are not provided)","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/XPost"}}}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/XPost"}},"totalCount":{"type":"integer","description":"Total number of posts","example":100},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":5}}}],"examples":{"nonPaginated":{"summary":"Response without pagination","value":{"posts":[{"id":"550e8400-e29b-41d4-a716-446655440000","requestId":"660e8400-e29b-41d4-a716-446655440000","result":"AI is revolutionizing healthcare...","type":"tweet","order":0,"createdOn":"2024-01-15T10:35:00Z","tweetImageUrl":"https://cdn.example.com/user-image.jpg","dataTableImageUrl":null,"barChartImageUrl":null}]}},"paginated":{"summary":"Response with pagination","value":{"posts":[{"id":"550e8400-e29b-41d4-a716-446655440000","requestId":"660e8400-e29b-41d4-a716-446655440000","result":"AI is revolutionizing healthcare...","type":"tweet","order":0,"createdOn":"2024-01-15T10:35:00Z","tweetImageUrl":"https://cdn.example.com/user-image.jpg","dataTableImageUrl":null,"barChartImageUrl":null}],"totalCount":100,"page":1,"pageSize":20,"totalPages":5}}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}},"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}]}},"/x/posts/{id}":{"get":{"summary":"Get a single generated X (Twitter) post by ID","description":"Returns a single generated tweet or thread item belonging to the authenticated user by its unique ID.","tags":["X"],"operationId":"getPostById","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"The unique ID of the post to retrieve","example":"550e8400-e29b-41d4-a716-446655440000"}],"responses":{"200":{"description":"Successfully retrieved the X post","content":{"application/json":{"schema":{"type":"object","properties":{"post":{"type":"object","properties":{"id":{"type":"string","description":"Unique ID of the post","example":"550e8400-e29b-41d4-a716-446655440000"},"requestId":{"type":"string","description":"The request ID that generated this post","example":"660e8400-e29b-41d4-a716-446655440000"},"result":{"type":"string","description":"The generated content or metadata","example":"Just launched our new AI feature! It's amazing."},"type":{"type":"string","description":"The post type (e.g., tweet or thread item)","example":"tweet"},"order":{"type":"integer","description":"Order in the thread (starts at 0)","example":0},"createdOn":{"type":"string","format":"date-time","description":"When the post was created","example":"2024-01-15T10:35:00Z"},"tweetImageUrl":{"type":"string","nullable":true,"description":"Main image for the tweet (from user upload or provided URL)","example":"https://cdn.example.com/user-image.jpg"},"dataTableImageUrl":{"type":"string","nullable":true,"description":"Optional URL to a generated data table image","example":"https://cdn.example.com/table.png"},"barChartImageUrl":{"type":"string","nullable":true,"description":"Optional URL to a generated bar chart image","example":"https://cdn.example.com/chart.png"}}}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"404":{"description":"Post not found or unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Post not found or unauthorized"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Internal server error"}}}}}}}}},"/billing/invoices":{"get":{"summary":"Get Stripe invoices for the authenticated client","description":"Resolves the authenticated token to the client's email and returns matching Stripe invoices.","tags":["Billing"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of invoices","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"invoiceid":{"type":"string","example":"in_1ABCDEFgHIJKLMN"},"invoice_url":{"type":"string","nullable":true,"example":"https://pay.stripe.com/invoice/acct_12345/live_abc/pdf?s=ap"},"receipt_url":{"type":"string","nullable":true,"example":"https://pay.stripe.com/receipts/invoices/abc"},"date":{"type":"string","format":"date-time","example":"2026-03-03T10:20:30.000Z"}}}}}}},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/deep-research/recurring":{"get":{"summary":"Get recurring deep research templates","description":"Returns all recurring deep research templates for the authenticated user with their configuration and scheduling details.","tags":["Deep Research"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved recurring templates","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"templates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique ID of the recurring template","example":"550e8400-e29b-41d4-a716-446655440000"},"text":{"type":"string","description":"The research query text","example":"Latest developments in quantum computing"},"provider":{"type":"string","enum":["gemini","openai"],"description":"The AI provider for research","example":"gemini"},"outputType":{"type":"string","description":"Output format type","example":"json"},"jsonFormat":{"type":"string","nullable":true,"description":"JSON formatting template applied when outputType is json","example":"{\"summary\":\"\",\"takeaways\":[]}"},"deletedOn":{"type":"string","format":"date-time","nullable":true,"description":"When the template was deleted (null if not deleted)","example":null},"callbackData":{"type":"string","nullable":true,"description":"User-specific callback data","example":"user-data-123"},"dailyCount":{"type":"integer","description":"Number of executions per day","example":2},"scheduleEndDate":{"type":"string","format":"date-time","nullable":true,"description":"End date for the recurring template (null = indefinite)","example":"2024-12-31T23:59:59Z"},"lastRunAt":{"type":"string","format":"date-time","nullable":true,"description":"Last execution timestamp","example":"2024-01-15T10:30:00Z"},"nextRunAt":{"type":"string","format":"date-time","nullable":true,"description":"Next scheduled execution (null = paused)","example":"2024-01-15T14:30:00Z"},"createdOn":{"type":"string","format":"date-time","description":"Template creation timestamp","example":"2024-01-01T00:00:00Z"}}}}}}}}},"400":{"description":"Bad request - amateur subscription","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Deep research is only available to PRO subscribers."}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}}}}},"/deep-research/recurring/{id}":{"post":{"summary":"Update a recurring deep research template","description":"Updates specific fields of a recurring template. Can be used to pause/resume, change frequency, update end date, or modify the research text.","tags":["Deep Research"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"The unique ID of the recurring template to update","example":"550e8400-e29b-41d4-a716-446655440000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"New research query text","example":"Updated research on AI ethics"},"dailyCount":{"type":"integer","minimum":1,"maximum":24,"description":"New number of executions per day","example":3},"scheduleEndDate":{"type":"string","format":"date-time","nullable":true,"description":"New end date for the recurring executions (null to remove end date)","example":"2025-01-31T23:59:59Z"},"isActive":{"type":"boolean","description":"Set to false to pause the recurring template, true to resume","example":false}}}}}},"responses":{"200":{"description":"Recurring template updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Recurring template updated successfully"},"template":{"type":"object","description":"The updated template with all fields (same structure as GET /deep-research/recurring response items)"}}}}}},"400":{"description":"Bad request - validation error or amateur subscription","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"dailyCount must be between 1 and 24"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"404":{"description":"Recurring template not found or unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Recurring template not found or unauthorized"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}}}}},"/feeds":{"get":{"summary":"Get all feeds (public + user's private feeds)","description":"Retrieves all public feeds (feeds with no token) and user's private feeds if token is provided.\n\n**Public Access:**\n- Public feeds are available without authentication\n- Returns all feeds where token is null\n\n**Authenticated Access:**\n- Returns public feeds + user's private feeds\n- Requires valid API token in Authorization header\n","tags":["Feeds"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of feeds (public + user's private feeds)","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Feed"}}}}},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new feed","description":"Creates a new feed associated with the authenticated user.\n\n**Feed Types:**\n- feedTypeId=1: X/Twitter feed (internalId = username)\n- feedTypeId=2: Reddit feed (internalId = subreddit name without r/ prefix)\n- feedTypeId=3: YouTube channel feed (channel handle/URL, resolved to channel source ID automatically)\n- feedTypeId=4: RSS feed (internalId = feed URL)\n- feedTypeId=5: X News feed (internalId = topic/search query, e.g. \"ai\")\n\n**Access Control:**\n- Requires valid API token\n- Feed will be private to the creating user\n- PRO subscription required\n","tags":["Feeds"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeedRequest"}}}},"responses":{"201":{"description":"Feed created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"feedId":{"type":"integer","description":"ID of the created feed","example":1},"message":{"type":"string","example":"Feed created successfully"}}}}}},"400":{"description":"Bad request - Missing required fields, feed limit reached, or other validation errors","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_name":{"value":"Missing feed name"},"feed_limit":{"value":"Feed limit reached. You can create up to 4 feeds. You currently have 4 feeds."}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"429":{"description":"Rate limit exceeded - too many requests","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Rate limit exceeded. Please wait 3 seconds before creating another feed."}}}}}},"500":{"description":"Internal server error during feed creation"}}}},"/feeds/{id}":{"get":{"summary":"Get a specific feed by ID","description":"Retrieves a specific feed by its ID.\nPublic feeds are accessible without authentication.\nPrivate feeds require appropriate token validation.\n","tags":["Feeds"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"Feed ID","example":1}],"responses":{"200":{"description":"Feed details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"}}}},"400":{"description":"Bad request - Invalid feed ID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_id":{"value":"Missing feed ID"},"invalid_id":{"value":"Invalid feed ID"}}}}}}}},"404":{"description":"Feed not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Feed not found"}}}}}},"500":{"description":"Internal server error"}}}},"/feeds/delete":{"post":{"summary":"Delete a feed","description":"Deletes a feed owned by the authenticated user.\n\n**Security:**\n- Only the feed owner can delete their feeds\n- Requires valid API token matching the feed's token\n","tags":["Feeds"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteFeedRequest"}}}},"responses":{"200":{"description":"Feed deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Feed deleted successfully"}}}}}},"400":{"description":"Bad request - Missing or invalid feed ID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_id":{"value":"Missing feed ID"},"invalid_id":{"value":"Invalid feed ID"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Feed not found or cannot be deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Feed not found or cannot be deleted"}}}}}},"500":{"description":"Internal server error during feed deletion"}}}},"/feeds/subscriptions":{"get":{"summary":"List feed subscriptions for the authenticated token","description":"Returns active feed automations associated with the authenticated user. Use `includeRemoved=true` to include archived subscriptions.","tags":["Feeds"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"includeRemoved","schema":{"type":"boolean"},"required":false,"description":"Include subscriptions that have been removed when set to true."}],"responses":{"200":{"description":"Array of feed subscriptions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedSubscription"}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error while fetching subscriptions"}}},"post":{"summary":"Create a feed subscription","description":"Links a feed to a schedule template (ClientRequest) so that new feed items trigger automated content generation.","tags":["Feeds"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["feedId","requestId"],"properties":{"feedId":{"type":"integer","description":"Identifier of the feed to subscribe to.","example":42},"requestId":{"type":"string","description":"Schedule template (ClientRequest) to clone when new items arrive.","example":"123e4567-e89b-12d3-a456-426614174000"},"lastProcessedItemId":{"type":"string","description":"Optional feed item identifier to mark as already processed."}}}}}},"responses":{"201":{"description":"Subscription created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedSubscription"}}}},"400":{"description":"Validation error"},"404":{"description":"Feed or template not found"},"409":{"description":"Subscription already exists for this feed/template pair"},"500":{"description":"Internal server error during creation"}}}},"/feeds/subscriptions/{subscriptionId}":{"delete":{"summary":"Remove a feed subscription","description":"Soft-deletes a feed subscription by setting its removedOn timestamp.","tags":["Feeds"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"subscriptionId","required":true,"schema":{"type":"string"},"description":"Identifier of the subscription to remove."}],"responses":{"200":{"description":"Subscription removed"},"400":{"description":"Missing or invalid subscription identifier"},"404":{"description":"Subscription not found or already removed"},"500":{"description":"Internal server error during removal"}}}},"/files":{"post":{"summary":"Upload a private file for later use as a content resource","tags":["Files"],"security":[{"bearerAuth":[]}],"consumes":["multipart/form-data"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"File to upload (max 200MB)"}}}}}},"responses":{"200":{"description":"File uploaded"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}}},"get":{"summary":"List uploaded files for the authenticated token","tags":["Files"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of files"},"401":{"description":"Unauthorized"}}}},"/files/{id}":{"delete":{"summary":"Delete an uploaded file by id","tags":["Files"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"File id returned by the upload endpoint"}],"responses":{"200":{"description":"File deleted"},"401":{"description":"Unauthorized"},"404":{"description":"File not found"}}}},"/podcast/rss/{podcastId}":{"get":{"summary":"Get iTunes-compatible RSS feed for podcast distribution","description":"Generates a public RSS feed compatible with Spotify, Apple Music, and other podcast platforms.\nThis endpoint is designed for automated platform distribution - no authentication required.\n\n**Platform Integration:**\n- Submit this RSS URL to Spotify for Podcasters, Apple Podcasts Connect\n- Platforms automatically pull new episodes as they're added via API\n- Supports iTunes namespace for Apple Podcasts compatibility\n- Includes proper enclosure tags with audio URLs and metadata\n\n**Automation Workflow:**\n1. Create podcast show → Get RSS URL from response\n2. Submit RSS URL to podcast platforms (one-time setup)\n3. Add episodes via API → Platforms automatically discover new content\n","tags":["Podcast"],"parameters":[{"in":"path","name":"podcastId","required":true,"schema":{"type":"string"},"description":"Podcast show ID to generate RSS feed for","example":"abc123-def456-ghi789"}],"responses":{"200":{"description":"iTunes-compatible RSS XML feed ready for platform submission","content":{"application/xml":{"schema":{"type":"string","description":"RSS 2.0 XML feed with iTunes namespace extensions"},"example":"\n\n \n My Automated Podcast\n AI Content Creator\n \n \n\n"}}},"400":{"description":"Missing or invalid podcast ID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Missing podcastId parameter"}}}}}},"500":{"description":"Internal server error during RSS generation"}}}},"/podcast/shows":{"get":{"summary":"Get all podcast shows for automated management","description":"Retrieves all podcast shows with their RSS URLs for platform distribution.\nEach show includes its RSS feed URL for easy platform integration.\nSupports optional pagination.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"List of podcast shows with RSS URLs for platform submission","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"$ref":"#/components/schemas/PodcastShow"}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"shows":{"type":"array","items":{"$ref":"#/components/schemas/PodcastShow"}},"totalCount":{"type":"integer","description":"Total number of podcast shows","example":10},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":1}}}]}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new podcast show for automated distribution","description":"Creates a new podcast show and returns the RSS URL for platform submission.\n\n**Platform Setup Workflow:**\n1. Create show via this endpoint → Get RSS URL in response\n2. Submit RSS URL to:\n - Spotify for Podcasters (https://podcasters.spotify.com)\n - Apple Podcasts Connect (https://podcastsconnect.apple.com)\n - Google Podcasts Manager\n - Other podcast platforms\n3. Start adding episodes via API → Platforms automatically discover new content\n\n**Required Metadata:** All major podcast platforms require name, description, author, website link, and owner email for contact and verification purposes.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePodcastShowRequest"}}}},"responses":{"201":{"description":"Podcast show created successfully with RSS URL for platform distribution","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"podcastId":{"type":"string","description":"Unique ID of the created podcast show","example":"abc123-def456-ghi789"},"rssUrl":{"type":"string","description":"RSS feed URL to submit to Spotify, Apple Music, and other platforms","example":"https://autocontentapi.com/podcast/rss/abc123-def456-ghi789"}}}}}},"400":{"description":"Bad request - Missing required fields for platform compatibility","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_name":{"value":"Missing podcast name"},"missing_description":{"value":"Missing podcast description"},"missing_author":{"value":"Missing podcast author"},"missing_link":{"value":"Missing podcast link"},"missing_image_url":{"value":"Missing podcast image URL"},"missing_email":{"value":"Missing owner email"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during podcast creation"}}}},"/podcast/shows/with-image":{"post":{"summary":"Create a new podcast show with image upload for automated distribution","description":"Creates a new podcast show with image upload and returns the RSS URL for platform submission.\nThis endpoint accepts multipart/form-data to allow direct image upload alongside podcast metadata.\n\n**Platform Setup Workflow:**\n1. Create show via this endpoint → Get RSS URL in response\n2. Submit RSS URL to:\n - Spotify for Podcasters (https://podcasters.spotify.com)\n - Apple Podcasts Connect (https://podcastsconnect.apple.com)\n - Google Podcasts Manager\n - Other podcast platforms\n3. Start adding episodes via API → Platforms automatically discover new content\n\n**Required Metadata:** All major podcast platforms require name, description, author, website link, and owner email for contact and verification purposes.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["name","description","author","link","email","imageFile"],"properties":{"name":{"type":"string","description":"Podcast show name (displayed on Spotify, Apple Music, etc.)","example":"AI-Generated Tech Talk"},"description":{"type":"string","description":"Show description for platform listings and RSS feed","example":"Weekly tech discussions generated by AI, covering the latest in technology and innovation."},"author":{"type":"string","description":"Host/author name displayed on podcast platforms","example":"AI Content Creator"},"link":{"type":"string","format":"uri","description":"Official website URL for the podcast show","example":"https://mywebsite.com/podcast"},"email":{"type":"string","format":"email","description":"Owner email address for RSS feed and platform registration","example":"podcast@mywebsite.com"},"imageFile":{"type":"string","format":"binary","description":"Podcast show image/artwork file (JPG, PNG, etc.)"}}}}}},"responses":{"201":{"description":"Podcast show created successfully with RSS URL for platform distribution","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"podcastId":{"type":"string","description":"Unique ID of the created podcast show","example":"abc123-def456-ghi789"},"rssUrl":{"type":"string","description":"RSS feed URL to submit to Spotify, Apple Music, and other platforms","example":"https://autocontentapi.com/podcast/rss/abc123-def456-ghi789"},"imageUrl":{"type":"string","description":"URL of the uploaded podcast artwork image","example":"https://autocontentapi.com/uploads/podcast-artwork-abc123.jpg"}}}}}},"400":{"description":"Bad request - Missing required fields or invalid image file","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_name":{"value":"Missing podcast name"},"missing_description":{"value":"Missing podcast description"},"missing_author":{"value":"Missing podcast author"},"missing_link":{"value":"Missing podcast link"},"missing_email":{"value":"Missing owner email"},"missing_image":{"value":"Missing image file"},"invalid_image":{"value":"Invalid image file format"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during podcast creation"}}}},"/podcast/episodes":{"get":{"summary":"Get all podcast episodes for user (deprecated)","deprecated":true,"description":"Deprecated: this broad all-episodes endpoint is expensive for large accounts and will be removed later.\nUse `/podcast/episodes/unallocated` for episodes not assigned to any show, or `/podcast/shows/{podcastId}/episodes` for show-specific episode lists.\n\nRetrieves all podcast episodes owned by the user, including:\n- Episodes assigned to one or more podcast shows (with podcast show IDs)\n- Orphaned episodes not yet assigned to any podcast show (with empty podcastShowIds array)\n\nEach episode includes an array of podcast show IDs it belongs to, supporting episodes that appear in multiple shows.\nUseful for getting a comprehensive view of all published episodes and their distribution across shows.\nSupports optional pagination.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"List of all episodes with platform-ready metadata and associated podcast show IDs","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"allOf":[{"$ref":"#/components/schemas/PodcastEpisode"},{"type":"object","properties":{"podcastShowIds":{"type":"array","description":"Array of podcast show IDs this episode belongs to (empty for orphaned episodes)","items":{"type":"string"},"example":["abc123-def456","ghi789-jkl012"]}}}]}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"episodes":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PodcastEpisode"},{"type":"object","properties":{"podcastShowIds":{"type":"array","description":"Array of podcast show IDs this episode belongs to (empty for orphaned episodes)","items":{"type":"string"},"example":["abc123-def456","ghi789-jkl012"]}}}]}},"totalCount":{"type":"integer","description":"Total number of episodes","example":50},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":3}}}]}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}}},"/podcast/episodes/unallocated":{"get":{"summary":"Get unallocated podcast episodes for user","description":"Retrieves generated audio episodes that are not assigned to any podcast show.\nThis is the preferred paginated endpoint for the `/podcasts/shows/unallocated` app screen.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1).","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50).","example":100}],"responses":{"200":{"description":"Paginated list of unallocated podcast episodes.","content":{"application/json":{"schema":{"type":"object","properties":{"episodes":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PodcastEpisode"},{"type":"object","properties":{"podcastShowIds":{"type":"array","description":"Always empty for unallocated episodes.","items":{"type":"string"},"example":[]}}}]}},"totalCount":{"type":"integer","description":"Total number of unallocated episodes.","example":421},"page":{"type":"integer","description":"Current page number.","example":1},"pageSize":{"type":"integer","description":"Number of items per page.","example":100},"totalPages":{"type":"integer","description":"Total number of pages.","example":5},"draftEpisodes":{"type":"array","description":"Always empty for this endpoint.","items":{"type":"object"},"example":[]}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}}},"/podcast/shows/{podcastId}/episodes":{"get":{"summary":"Get all episodes for automated podcast management","description":"Retrieves all episodes for a specific podcast show.\nEach episode includes an array of podcast show IDs it belongs to (including the specified one and any others).\nUseful for monitoring automated podcast publishing and episode management.\nSupports optional pagination.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"podcastId","required":true,"schema":{"type":"string"},"description":"The podcast show ID","example":"abc123-def456-ghi789"},{"in":"query","name":"page","schema":{"type":"integer","minimum":1},"required":false,"description":"Page number for pagination (starts at 1). If not provided, returns all results.","example":1},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"description":"Number of items per page (max 100, default 50 if page is specified)","example":20}],"responses":{"200":{"description":"List of episodes with platform-ready metadata and associated podcast show IDs","content":{"application/json":{"schema":{"oneOf":[{"type":"array","description":"Non-paginated response (when page and limit are not provided)","items":{"allOf":[{"$ref":"#/components/schemas/PodcastEpisode"},{"type":"object","properties":{"podcastShowIds":{"type":"array","description":"Array of podcast show IDs this episode belongs to","items":{"type":"string"},"example":["abc123-def456","ghi789-jkl012"]}}}]}},{"type":"object","description":"Paginated response (when page or limit are provided)","properties":{"episodes":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PodcastEpisode"},{"type":"object","properties":{"podcastShowIds":{"type":"array","description":"Array of podcast show IDs this episode belongs to","items":{"type":"string"},"example":["abc123-def456","ghi789-jkl012"]}}}]}},"totalCount":{"type":"integer","description":"Total number of episodes for this podcast show","example":25},"page":{"type":"integer","description":"Current page number","example":1},"pageSize":{"type":"integer","description":"Number of items per page","example":20},"totalPages":{"type":"integer","description":"Total number of pages","example":2}}}]}}}},"400":{"description":"Bad request - Invalid podcast ID"},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}},"post":{"summary":"Add episode to podcast for automated distribution","description":"Converts existing audio content into a podcast episode for automated platform distribution.\n\n**Automation Workflow:**\n1. Generate audio content via content API → Get requestId\n2. Add episode via this endpoint → Links audio to podcast show\n3. RSS feed automatically updates with new episode\n4. Spotify, Apple Music, etc. automatically discover and publish new episode\n\n**Content Linking:** Uses requestId to link existing audio content, enabling seamless\nconversion of any generated audio into podcast episodes without file uploads.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"podcastId","required":true,"schema":{"type":"string"},"description":"The podcast show ID to add episode to","example":"abc123-def456-ghi789"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["requestId"],"properties":{"requestId":{"type":"string","description":"ID of existing audio content to convert into podcast episode","example":"req_789xyz123abc"},"title":{"type":"string","description":"Custom episode title (optional - defaults to original audio title)","example":"Episode 1: The Future of AI"},"description":{"type":"string","description":"Custom episode description (optional - defaults to original audio title)","example":"In this episode, we explore the exciting developments in artificial intelligence..."}}}}}},"responses":{"201":{"description":"Episode added successfully - will appear on podcast platforms automatically","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"episodeId":{"type":"integer","description":"ID of the created episode","example":42},"message":{"type":"string","example":"Episode added successfully"}}}}}},"400":{"description":"Bad request - Missing required fields or invalid IDs","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_podcast_id":{"value":"Missing podcast ID"},"missing_request_id":{"value":"Missing request ID"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during episode creation"}}}},"/podcast/episodes/remove":{"post":{"summary":"Remove episode from automated podcast distribution","description":"Removes an episode from the podcast show and RSS feed.\nThe episode will be automatically removed from podcast platforms on their next RSS feed refresh.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["episodeId"],"properties":{"episodeId":{"type":"integer","description":"The episode ID to remove from podcast distribution","example":42}}}}}},"responses":{"200":{"description":"Episode removed successfully - will be removed from platforms automatically","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Episode removed successfully"}}}}}},"400":{"description":"Bad request - Missing or invalid episode ID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_episode_id":{"value":"Missing episode ID"},"invalid_episode_id":{"value":"Invalid episode ID"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Episode not found or cannot be deleted"},"500":{"description":"Internal server error during episode removal"}}}},"/podcast/episodes/{episodeId}":{"post":{"summary":"Update podcast episode title and description","description":"Updates the title and description of a specific podcast episode.\nThe episode must belong to a podcast owned by the authenticated user.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"episodeId","required":true,"schema":{"type":"integer"},"description":"The ID of the episode to update","example":42}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","description"],"properties":{"title":{"type":"string","description":"New episode title","example":"Updated Episode Title"},"description":{"type":"string","description":"New episode description","example":"Updated episode description with more details..."}}}}}},"responses":{"200":{"description":"Episode updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Episode updated successfully"}}}}}},"400":{"description":"Bad request - Missing required fields or invalid episode ID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_episode_id":{"value":"Missing episode ID"},"invalid_episode_id":{"value":"Invalid episode ID"},"missing_title":{"value":"Missing title or description"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Episode not found or cannot be updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Episode not found or cannot be updated"}}}}}},"500":{"description":"Internal server error during episode update"}}}},"/podcast/import-rss":{"post":{"summary":"Import podcast from RSS feed URL","description":"Imports an entire podcast show and its episodes from an existing RSS feed URL.\nThis is perfect for migrating podcasts from other platforms (Buzzsprout, Anchor, Podbean, etc.) to AutoContent API.\n\n**Features:**\n- Preserves ALL RSS metadata (language, copyright, categories, season/episode numbers, etc.)\n- Smart duplicate detection using GUIDs\n- Automatically imports and stores podcast artwork\n- Updates existing podcasts if they already exist\n- Generates new RSS feed URL that maintains all original metadata\n\n**Migration Workflow:**\n1. Import your existing podcast from any platform using this endpoint\n2. All metadata is preserved (language, categories, episode numbers, etc.)\n3. Get a new RSS URL that you can submit to Spotify, Apple Podcasts, etc.\n4. Your podcast continues seamlessly with all historical data intact\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rssUrl"],"properties":{"rssUrl":{"type":"string","format":"uri","description":"The RSS feed URL to import from (must end with .rss or contain 'rss' or 'feed')","example":"https://example.com/podcast/feed.rss"},"email":{"type":"string","format":"email","description":"Optional owner email override when the source RSS feed does not include itunes:owner email.","example":"podcast@mywebsite.com"}}}}}},"responses":{"200":{"description":"Podcast imported successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"podcastId":{"type":"string","description":"The ID of the imported/updated podcast show","example":"abc123-def456-ghi789"},"rssUrl":{"type":"string","description":"Your new RSS feed URL for distribution to podcast platforms","example":"https://api.autocontentapi.com/podcast/rss/abc123-def456-ghi789"}}}}}},"400":{"description":"Bad request - Invalid or missing RSS URL","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_url":{"value":"Missing RSS URL"},"invalid_url":{"value":"Invalid RSS URL. URL should be a valid RSS feed"},"missing_owner_email":{"value":"Missing podcast owner email. Provide email in the request body or ensure the RSS feed includes itunes:owner email."},"no_podcast_info":{"value":"Could not extract podcast information from RSS feed"}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during import","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Failed to parse RSS feed: Invalid XML structure"}}}}}}}}},"/podcast/remove":{"post":{"summary":"Remove podcast from distribution","description":"Endpoint for removing individual podcast episodes or shows.\n\n**Note:** This marks content as deleted rather than physically removing it,\nallowing for potential recovery and maintaining referential integrity.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"The podcast or episode ID to mark as deleted","example":"abc123-def456-ghi789"}}}}}},"responses":{"200":{"description":"Podcast marked as deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Podcast deleted successfully"}}}}}},"400":{"description":"Bad request - Missing podcast id","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Missing podcast id"}}}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Podcast not found or cannot be deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Podcast not found or cannot be deleted"}}}}}},"500":{"description":"Internal server error during podcast removal"}}}},"/podcast/episodes/csv":{"get":{"summary":"Download all podcast episodes as CSV","description":"Downloads all episodes for the authenticated user as a CSV file.\nThe CSV includes: id, audioUrl, title, and requestedOn fields.\nUseful for data export, analysis, or backup purposes.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"CSV file containing all podcast episodes","content":{"text/csv":{"schema":{"type":"string","example":"id,audioUrl,title,requestedOn\n\"episode1\",\"https://example.com/audio1.mp3\",\"Episode 1: Introduction\",\"2024-01-15T10:30:00.000Z\"\n\"episode2\",\"https://example.com/audio2.mp3\",\"Episode 2: Deep Dive\",\"2024-01-16T11:00:00.000Z\"\n"}}},"headers":{"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"all-episodes-2024-01-20T14-30-00.csv\""}},"Content-Type":{"schema":{"type":"string","example":"text/csv"}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during CSV generation"}}}},"/podcast/shows/{podcastId}/episodes/csv":{"get":{"summary":"Download podcast show episodes as CSV","description":"Downloads all episodes for a specific podcast show as a CSV file.\nThe CSV includes: id, audioUrl, title, and requestedOn fields.\nUseful for exporting podcast show data for analysis or migration.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"podcastId","required":true,"schema":{"type":"string"},"description":"The podcast show ID","example":"abc123-def456-ghi789"}],"responses":{"200":{"description":"CSV file containing podcast show episodes","content":{"text/csv":{"schema":{"type":"string","example":"id,audioUrl,title,requestedOn\n\"episode1\",\"https://example.com/audio1.mp3\",\"Episode 1: Introduction\",\"2024-01-15T10:30:00.000Z\"\n\"episode2\",\"https://example.com/audio2.mp3\",\"Episode 2: Deep Dive\",\"2024-01-16T11:00:00.000Z\"\n"}}},"headers":{"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"podcast-abc123-episodes-2024-01-20T14-30-00.csv\""}},"Content-Type":{"schema":{"type":"string","example":"text/csv"}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error during CSV generation"}}}},"/podcast/episodes/audio-zip":{"get":{"summary":"Download all podcast episode audio files as a ZIP archive","description":"Streams a ZIP archive containing audio files for every episode owned by the authenticated user.\nOnly episodes with a valid `audioUrl` are included in the archive.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"ZIP archive containing all available episode audio files","headers":{"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"all-episodes-2024-01-20T14-30-00.zip\""}},"Content-Type":{"schema":{"type":"string","example":"application/zip"}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"No downloadable audio files were found"},"500":{"description":"Internal server error while building the audio archive"}}}},"/podcast/shows/{podcastId}/episodes/audio-zip":{"get":{"summary":"Download podcast show episode audio files as a ZIP archive","description":"Streams a ZIP archive with audio files for the specified podcast show. Only episodes\ncontaining a valid `audioUrl` are included. If no files can be gathered, a 404 is returned.\n","tags":["Podcast"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"podcastId","required":true,"schema":{"type":"string"},"description":"The podcast show ID","example":"abc123-def456-ghi789"}],"responses":{"200":{"description":"ZIP archive containing the show's available episode audio files","headers":{"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"podcast-abc123-episodes-2024-01-20T14-30-00.zip\""}},"Content-Type":{"schema":{"type":"string","example":"application/zip"}}}},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"No downloadable audio files were found for the show"},"500":{"description":"Internal server error while building the audio archive"}}}},"/podcast/ideas":{"post":{"summary":"Generate podcast ideas (public, origin-restricted)","description":"Returns 3–8 podcast ideas. Each idea includes a podcast name, description,\nexactly four episode titles, and AI-estimated 0–100 scores for questionComplexity,\ntopicalDepth, searchVolumeConversational, and contentFreshness.\nNo JWT required, but the request must come from an allowlisted Origin\n(autocontentapi.com / app.autocontentapi.com / localhost) OR carry a valid\n`X-Free-Tools-Secret` header (used by the Next.js proxy). Other callers\nreceive 403. Limits: 2 requests per IP per 24h, 30 total per 24h,\n2 concurrent per IP.\n","tags":["Podcast"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","nullable":true,"description":"Optional topic to tailor podcast ideas. If omitted or null, the AI will propose topics.","example":"AI in healthcare"}}}}}},"responses":{"200":{"description":"Structured list of podcast ideas","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"requestId":{"type":"string"},"ideas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"episodes":{"type":"array","items":{"type":"string"},"minItems":4,"maxItems":4},"stats":{"type":"object","properties":{"questionComplexity":{"type":"integer","minimum":0,"maximum":100},"topicalDepth":{"type":"integer","minimum":0,"maximum":100},"searchVolumeConversational":{"type":"integer","minimum":0,"maximum":100},"contentFreshness":{"type":"integer","minimum":0,"maximum":100}}}}}}}}}}},"429":{"description":"Rate limit exceeded (10/day) or too many concurrent requests (2/IP)"},"500":{"description":"Internal server error"}}}},"/projects":{"get":{"summary":"Get all projects for the authenticated user","description":"Retrieves all active projects owned by the authenticated user.\nProjects are returned in descending order by last update time.\n","tags":["Projects"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of user's projects","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}},"post":{"summary":"Create a new project","description":"Creates a new project for the authenticated user.\nProjects can be referenced when generating tweets/threads to provide context.\n\nIf a URL is provided without a description, the API will:\n1. Fetch the website content\n2. Use AI to generate a comprehensive project description in markdown format\n\nEither description or url must be provided.\n","tags":["Projects"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"201":{"description":"Project created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"project":{"$ref":"#/components/schemas/Project"}}}}}},"400":{"description":"Bad request - Missing required fields or validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","examples":{"missing_name":{"value":"Missing required field: name"},"missing_description_or_url":{"value":"Either description or url must be provided"},"name_too_long":{"value":"Project name must be 200 characters or less"},"transparent_project_image":{"value":"Invalid project image: Project images must be fully opaque. Transparent or partially transparent pixels are not allowed."}}}}}}}},"401":{"description":"Unauthorized - valid API token required"},"500":{"description":"Internal server error"}}}},"/projects/{id}":{"get":{"summary":"Get a specific project by ID","description":"Retrieves a specific project by its ID.\nOnly the project owner can access their projects.\n","tags":["Projects"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Project ID (GUID)","example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"200":{"description":"Project details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Bad request - Missing project ID"},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Project not found"},"500":{"description":"Internal server error"}}}},"/projects/{id}/update":{"post":{"summary":"Update a project","description":"Updates an existing project's name and description.\nOnly the project owner can update their projects.\n\nIf a URL is provided without a description, the API will:\n1. Fetch the website content\n2. Use AI to generate a comprehensive project description in markdown format\n\nEither description or url must be provided.\n","tags":["Projects"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Project ID (GUID)","example":"123e4567-e89b-12d3-a456-426614174000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}}},"responses":{"200":{"description":"Project updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"project":{"$ref":"#/components/schemas/Project"}}}}}},"400":{"description":"Bad request - Missing required fields or validation error"},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Project not found or unauthorized"},"500":{"description":"Internal server error"}}}},"/projects/{id}/delete":{"post":{"summary":"Delete a project","description":"Soft deletes a project (marks it as inactive).\nOnly the project owner can delete their projects.\n","tags":["Projects"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Project ID (GUID)","example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"200":{"description":"Project deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Project deleted successfully"}}}}}},"400":{"description":"Bad request - Missing project ID"},"401":{"description":"Unauthorized - valid API token required"},"404":{"description":"Project not found or unauthorized"},"500":{"description":"Internal server error"}}}},"/public/podcasts":{"get":{"summary":"Get all public podcasts","description":"Publicly retrieve all public podcasts without requiring authentication (transcript excluded for performance)","tags":["Public"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"categoryId":{"type":"integer"},"audioUrl":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"imageUrl":{"type":"string"},"quizUrl":{"type":"string","nullable":true},"infographicUrl":{"type":"string","nullable":true},"slideDeckUrl":{"type":"string","nullable":true},"videoExplainerUrl":{"type":"string","nullable":true},"videoExplainerPosterUrl":{"type":"string","nullable":true},"fileSize":{"type":"integer"},"durationSeconds":{"type":"integer"}}}}}}}}},"500":{"description":"Internal server error"}}}},"/public/podcasts/category/{categoryId}":{"get":{"summary":"Get public podcasts by category","description":"Publicly retrieve public podcasts filtered by category ID without requiring authentication (transcript excluded for performance)","tags":["Public"],"parameters":[{"in":"path","name":"categoryId","required":true,"schema":{"type":"integer"},"description":"The category ID to filter podcasts by"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"categoryId":{"type":"integer"},"audioUrl":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"imageUrl":{"type":"string"},"quizUrl":{"type":"string","nullable":true},"infographicUrl":{"type":"string","nullable":true},"slideDeckUrl":{"type":"string","nullable":true},"videoExplainerUrl":{"type":"string","nullable":true},"videoExplainerPosterUrl":{"type":"string","nullable":true},"fileSize":{"type":"integer"},"durationSeconds":{"type":"integer"}}}}}}}}},"400":{"description":"Bad Request - Invalid categoryId parameter"},"500":{"description":"Internal server error"}}}},"/public/podcasts/{id}":{"get":{"summary":"Get a single public podcast with full details","description":"Publicly retrieve a single public podcast by ID with full details including transcript","tags":["Public"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"The podcast ID"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"id":{"type":"string"},"categoryId":{"type":"integer"},"audioUrl":{"type":"string"},"title":{"type":"string"},"transcript":{"type":"string"},"summary":{"type":"string"},"imageUrl":{"type":"string"},"quizUrl":{"type":"string","nullable":true},"fileSize":{"type":"integer"},"durationSeconds":{"type":"integer"},"slug":{"type":"string"}}}}}}}},"400":{"description":"Bad Request - Invalid id parameter"},"404":{"description":"Podcast not found"},"500":{"description":"Internal server error"}}}},"/public/podcasts/slug/{slug}":{"get":{"summary":"Get a single public podcast by slug with full details","description":"Publicly retrieve a single public podcast by slug with full details including transcript","tags":["Public"],"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"},"description":"The podcast slug"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"id":{"type":"string"},"categoryId":{"type":"integer"},"audioUrl":{"type":"string"},"title":{"type":"string"},"transcript":{"type":"string"},"summary":{"type":"string"},"imageUrl":{"type":"string"},"quizUrl":{"type":"string","nullable":true},"fileSize":{"type":"integer"},"durationSeconds":{"type":"integer"},"slug":{"type":"string"}}}}}}}},"400":{"description":"Bad Request - Invalid slug parameter"},"404":{"description":"Podcast not found"},"500":{"description":"Internal server error"}}}},"/x/recurring":{"get":{"summary":"Get recurring X (Twitter) templates","description":"Returns all recurring tweet/thread templates for the authenticated user with their configuration and scheduling details.","tags":["X"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successfully retrieved recurring templates","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"templates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique ID of the recurring template","example":"550e8400-e29b-41d4-a716-446655440000"},"type":{"type":"string","enum":["tweet","thread"],"description":"Type of X post to create","example":"tweet"},"deletedOn":{"type":"string","format":"date-time","nullable":true,"description":"When the template was deleted (null if not deleted)","example":null},"feedIds":{"type":"array","items":{"type":"integer"},"description":"Feed IDs used as content sources","example":[101,202]},"deepResearchIds":{"type":"array","items":{"type":"string"},"description":"Deep research IDs used as content sources","example":["550e8400-e29b-41d4-a716-446655440000"]},"projectIds":{"type":"array","items":{"type":"string"},"description":"Project IDs used as context","example":["123e4567-e89b-12d3-a456-426614174000"]},"audioUrl":{"type":"string","nullable":true,"description":"Audio URL for transcription","example":"https://example.com/audio.mp3"},"url":{"type":"string","nullable":true,"description":"URL for content scraping","example":"https://example.com/article"},"text":{"type":"string","nullable":true,"description":"Raw text content","example":"Breaking news about AI..."},"prompt":{"type":"string","nullable":true,"description":"Style instructions for generation","example":"Make it engaging with emojis"},"imageUrl":{"type":"string","nullable":true,"description":"Image URL for context","example":"https://example.com/image.jpg"},"promptAudioUrl":{"type":"string","nullable":true,"description":"Audio URL for prompt instructions","example":"https://example.com/prompt.mp3"},"queryText":{"type":"string","nullable":true,"description":"Quick mode query text","example":"Top AI news today"},"queryAudioUrl":{"type":"string","nullable":true,"description":"Quick mode query audio URL","example":"https://example.com/query.mp3"},"fast":{"type":"boolean","nullable":true,"description":"Whether this is a quick mode template","example":false},"tweetStyle":{"type":"string","enum":["OneLiner","Paragraphs","Explainer"],"nullable":true,"description":"Formatting style for tweets. OneLiner for concise tweets, Paragraphs for story-style tweets, Explainer for educational content.","example":"Paragraphs"},"callbackData":{"type":"string","nullable":true,"description":"User-specific callback data","example":"user-data-123"},"dailyCount":{"type":"integer","description":"Number of executions per day","example":2},"scheduleEndDate":{"type":"string","format":"date-time","nullable":true,"description":"End date for the recurring template (null = indefinite)","example":"2024-12-31T23:59:59Z"},"lastRunAt":{"type":"string","format":"date-time","nullable":true,"description":"Last execution timestamp","example":"2024-01-15T10:30:00Z"},"nextRunAt":{"type":"string","format":"date-time","nullable":true,"description":"Next scheduled execution (null = paused)","example":"2024-01-15T14:30:00Z"},"createdOn":{"type":"string","format":"date-time","description":"Template creation timestamp","example":"2024-01-01T00:00:00Z"}}}}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}}}}},"/x/recurring/{id}":{"post":{"summary":"Update a recurring X (Twitter) template","description":"Updates specific fields of a recurring template. Can be used to pause/resume, change frequency, update end date, or modify prompt.","tags":["X"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"The unique ID of the recurring template to update","example":"550e8400-e29b-41d4-a716-446655440000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"New style instructions for generation","example":"Use a more professional tone"},"dailyCount":{"type":"integer","minimum":1,"maximum":100,"description":"New number of executions per day","example":3},"scheduleEndDate":{"type":"string","format":"date-time","nullable":true,"description":"New end date for the recurring executions (null to remove end date)","example":"2025-01-31T23:59:59Z"},"isActive":{"type":"boolean","description":"Set to false to pause the recurring template, true to resume","example":false},"feedIds":{"type":"array","items":{"type":"integer"},"description":"Feed IDs to use as content sources (replaces existing)","example":[101,202]},"deepResearchIds":{"type":"array","items":{"type":"string"},"description":"Deep research template IDs to use as content sources (replaces existing)","example":["550e8400-e29b-41d4-a716-446655440000"]}}}}}},"responses":{"200":{"description":"Recurring template updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Recurring template updated successfully"},"template":{"type":"object","description":"The updated template with all fields (same structure as GET /x/recurring response items)"}}}}}},"400":{"description":"Bad request - validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"dailyCount must be between 1 and 100"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Invalid token"}}}}}},"404":{"description":"Recurring template not found or unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Recurring template not found or unauthorized"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}}}}}}}}}}}