{"name":"Askwho Casts API","version":"1","about":"Turn articles, your own text and whole books into multi-voice audio. Everything the website does, for scripts and AI agents.","auth":"Send 'Authorization: Bearer awc_…'. Make a key in Settings → API keys (needs a plan). The Askwho Casts app signs in with its own token (awca_…).","guide":"https://askwhocasts.com/api/v1/docs","openapi":"https://askwhocasts.com/api/v1/openapi.json","mcp":{"url":"https://askwhocasts.com/mcp","transport":"streamable-http","auth":"the same Bearer key"},"feedback":"POST https://askwhocasts.com/api/v1/feedback","groups":[{"group":"Start","endpoints":[{"method":"GET","path":"/api/v1","summary":"This index: every endpoint, the guide and the MCP address. No key needed."},{"method":"GET","path":"/api/v1/docs","summary":"The guide, in Markdown, written for agents. No key needed."},{"method":"GET","path":"/api/v1/openapi.json","summary":"This API as an OpenAPI 3.1 document. No key needed."}]},{"group":"Account","endpoints":[{"method":"GET","path":"/api/v1/account","summary":"Who the key belongs to: plan, credit balance, private podcast feed, what's switched on, warnings to pass on."},{"method":"GET","path":"/api/v1/credits","summary":"The credit ledger, newest first (the last 100 changes)."},{"method":"GET","path":"/api/v1/settings","summary":"The account's settings (chooseVoices, directInput)."},{"method":"PATCH","path":"/api/v1/settings","summary":"Change settings: {chooseVoices?, directInput?}."}]},{"group":"Voices","endpoints":[{"method":"GET","path":"/api/v1/voices","summary":"The voice pool. Filter with ?gender=f|m&age=young|adult|middle|old&accent=british|american&narrator=true&q=words."},{"method":"GET","path":"/api/v1/voices/:id/preview","summary":"A voice's sample, as MP3."},{"method":"POST","path":"/api/v1/voices/suggest","summary":"Three to five fitting voices for a character: {character: {name, gender, kind, note}, genre, narratorVoice, taken}."}]},{"group":"Episodes","endpoints":[{"method":"POST","path":"/api/v1/quotes","summary":"Price a link before recording it: {url}, or {url, html} for a page you already have (paywalled, signed in). Returns the price, speakers and a 24-hour snapshot."},{"method":"POST","path":"/api/v1/episodes","summary":"Record an episode in one call: {url} (or {url, html}, or {title, text}), optional maxCredits, cast, describeImages, wait.","spendsCredits":true,"wait":true},{"method":"GET","path":"/api/v1/episodes","summary":"The library, newest first: ?status=generating|ready|failed&kind=link|page|script|document&limit=&offset=. ?updatedSince=<ms> (the last answer's now) lists only what changed, with ids (all of the library) and deleted."},{"method":"GET","path":"/api/v1/episodes/:id","summary":"One episode (by id or articleId): status, progress, and audio/transcript links when ready.","wait":true},{"method":"DELETE","path":"/api/v1/episodes/:id","summary":"Take an episode out of the library and the feed."},{"method":"GET","path":"/api/v1/episodes/:id/transcript","summary":"The timed transcript: every line, who says it, when."},{"method":"GET","path":"/api/v1/episodes/:id/cast","summary":"Who's in the episode and their voices."},{"method":"POST","path":"/api/v1/episodes/:id/issues","summary":"Report a problem with an episode: {category: speaker|missing|description|audio|other, seconds?, note?}."},{"method":"POST","path":"/api/v1/episodes/:id/studio","summary":"Open a script episode as a Studio draft again, to edit and re-record."}]},{"group":"Studio drafts","endpoints":[{"method":"GET","path":"/api/v1/drafts","summary":"Your Studio drafts, newest first."},{"method":"POST","path":"/api/v1/drafts","summary":"Make a draft: {title, text, genre?: fiction|nonfiction, seriesId?, narratorVoice?, operations?}. A narrator is chosen if you don't name one."},{"method":"POST","path":"/api/v1/drafts/from-episode","summary":"A draft from a recorded episode: {episodeId} or {articleId}."},{"method":"GET","path":"/api/v1/drafts/:id","summary":"A draft: its body, a summary (cast, quotations placed, problems, price). ?include=marks,script adds those."},{"method":"PUT","path":"/api/v1/drafts/:id","summary":"Replace a draft's whole body: {version?, body}."},{"method":"PATCH","path":"/api/v1/drafts/:id","summary":"Change {title?, text?, genre?, seriesId?}. Editing the text keeps the casting, as the Studio does."},{"method":"DELETE","path":"/api/v1/drafts/:id","summary":"Delete a draft."},{"method":"GET","path":"/api/v1/drafts/:id/marks","summary":"Every quotation the Studio finds, numbered, with who reads it now (or unplaced). ?status=unplaced filters."},{"method":"GET","path":"/api/v1/drafts/:id/script","summary":"The draft as it will be heard: each piece and its speaker. ?format=text for \"ALICE: …\" lines; ?from=&to= to window it."},{"method":"POST","path":"/api/v1/drafts/:id/cast","summary":"Cast it in one call: {operations: [...]} (add_character, assign, set_voice, cast_labels, merge_characters, …). All or nothing."},{"method":"GET","path":"/api/v1/drafts/:id/estimate","summary":"The price, the take count and anything that would stop recording."},{"method":"GET","path":"/api/v1/drafts/:id/autocast","summary":"Auto Cast's price for this draft, and its last run."},{"method":"POST","path":"/api/v1/drafts/:id/autocast","summary":"Let Auto Cast read the draft and give every quotation a speaker and a voice: {maxCredits?, wait?}.","spendsCredits":true,"wait":true},{"method":"GET","path":"/api/v1/autocast/:runId","summary":"An Auto Cast run.","wait":true},{"method":"POST","path":"/api/v1/drafts/:id/auditions","summary":"Hear a voice read a line: {voiceId, text} or {voiceId, character}. Returns an MP3 link."},{"method":"GET","path":"/api/v1/auditions/:file","summary":"An audition, as MP3."},{"method":"POST","path":"/api/v1/drafts/:id/render","summary":"Record the draft: {maxCredits?, wait?}. Returns the episode.","spendsCredits":true,"wait":true}]},{"group":"Series","endpoints":[{"method":"GET","path":"/api/v1/series","summary":"Your series (cast books shared by drafts)."},{"method":"POST","path":"/api/v1/series","summary":"Make a series: {name, genre?}."},{"method":"GET","path":"/api/v1/series/:id","summary":"A series and its characters."},{"method":"PATCH","path":"/api/v1/series/:id","summary":"Rename it or set its narrator: {name?, narratorVoice?}."},{"method":"DELETE","path":"/api/v1/series/:id","summary":"Delete a series (drafts keep their casts)."},{"method":"PATCH","path":"/api/v1/series/:id/characters/:key","summary":"Change a series character: {name?, aliases?, gender?, note?, voiceId?}."},{"method":"DELETE","path":"/api/v1/series/:id/characters/:key","summary":"Remove a series character."},{"method":"POST","path":"/api/v1/series/:id/merge","summary":"Merge two series characters: {from, into}."},{"method":"POST","path":"/api/v1/series/:id/restore","summary":"Undo a series change: {undo}."}]},{"group":"Books","endpoints":[{"method":"POST","path":"/api/v1/documents","summary":"Upload a book or document (EPUB, DOCX, PDF, TXT, Markdown, HTML): JSON {filename, text | contentBase64, rightsConfirmed: true}, or raw bytes with X-Filename and X-Rights-Confirmed: true.","wait":true},{"method":"GET","path":"/api/v1/documents","summary":"Your documents and books."},{"method":"GET","path":"/api/v1/documents/:id","summary":"A document: when ready, its chapters (review) and layout.","wait":true},{"method":"GET","path":"/api/v1/documents/:id/chapters/:chapter","summary":"A chapter's text (?full=1 for every word)."},{"method":"POST","path":"/api/v1/documents/:id/layout","summary":"Arrange chapters: {op: include|include-group|merge|split|rename|notes|citations|reset}."},{"method":"POST","path":"/api/v1/documents/:id/title","summary":"Rename the book: {title}."},{"method":"DELETE","path":"/api/v1/documents/:id","summary":"Remove a document, its book and its audio."},{"method":"POST","path":"/api/v1/documents/:id/cast","summary":"Cast the book: find every character and give each a voice (free).","wait":true},{"method":"GET","path":"/api/v1/documents/:id/cast","summary":"The book's cast sheet.","wait":true},{"method":"POST","path":"/api/v1/documents/:id/cast/edit","summary":"Change the cast: {op: {op: voice, character, voiceId} | {op: narrator, voiceId} | {op: reset, character?}}."},{"method":"POST","path":"/api/v1/documents/:id/auditions","summary":"Hear a voice read a character's line: {character | \"narrator\", voiceId}."},{"method":"GET","path":"/api/v1/documents/:id/auditions/:file","summary":"A book audition, as MP3."},{"method":"GET","path":"/api/v1/documents/:id/estimate","summary":"What making the book costs now, and anything in the way."},{"method":"POST","path":"/api/v1/documents/:id/make","summary":"Make the audiobook: {maxCredits?, wait?}.","spendsCredits":true,"wait":true},{"method":"GET","path":"/api/v1/documents/:id/production","summary":"The book's progress, chapter by chapter, its feed and downloads (MP3, ZIP, M4B).","wait":true},{"method":"GET","path":"/api/v1/documents/:id/listen","summary":"The book's tracks, with audio links and the saved listening place."},{"method":"POST","path":"/api/v1/documents/:id/feed/rotate","summary":"Give the book's private feed a new address (the old one stops)."},{"method":"GET","path":"/api/v1/books/position","summary":"The saved listening place: ?bookKey=doc:<id>."},{"method":"PUT","path":"/api/v1/books/position","summary":"Save the listening place: {bookKey, track, seconds}."},{"method":"GET","path":"/api/v1/books/bookmarks","summary":"Bookmarks in a book: ?bookKey=doc:<id>."},{"method":"POST","path":"/api/v1/books/bookmarks","summary":"Add a bookmark: {bookKey, track, seconds, note?}."},{"method":"DELETE","path":"/api/v1/books/bookmarks/:id","summary":"Delete a bookmark."}]},{"group":"Listening places","endpoints":[{"method":"GET","path":"/api/v1/places","summary":"Where you are in each episode: ?since=<ms> (the last answer's now) for only what changed. {places: [{itemKey, seconds, duration, played, at, device}], now}."},{"method":"PUT","path":"/api/v1/places","summary":"Save places, the newest listen winning: {places: [{itemKey: \"ep:<articleId>\", seconds, duration?, played?, at}]}, up to 200."}]},{"group":"Following blogs","endpoints":[{"method":"GET","path":"/api/v1/following","summary":"The blogs you follow, their limits and recent activity."},{"method":"POST","path":"/api/v1/following/preview","summary":"Look at a blog's feed before following it: {url}."},{"method":"POST","path":"/api/v1/following","summary":"Follow a blog: new posts become episodes. {url, monthly_limit?, post_limit?, describe_images?, title_include?, title_exclude?}.","spendsCredits":true},{"method":"PATCH","path":"/api/v1/following/settings","summary":"Spending limits for following: {monthly_limit, daily_limit, protected_balance, version}."},{"method":"POST","path":"/api/v1/following/check","summary":"Check every followed blog for new posts now."},{"method":"PATCH","path":"/api/v1/following/:id","summary":"Pause, resume, remove or change a followed blog: {version, status?, …}."},{"method":"POST","path":"/api/v1/following/:id/check","summary":"Check one followed blog now."},{"method":"POST","path":"/api/v1/following/items/:id/skip","summary":"Skip a post."},{"method":"POST","path":"/api/v1/following/items/:id/review","summary":"Take a post to the Studio instead of recording it automatically."}]},{"group":"Library","endpoints":[{"method":"GET","path":"/api/v1/serials","summary":"Serials and series in the library, with their episodes and feeds."},{"method":"GET","path":"/api/v1/classics","summary":"The Classics shelf: handmade audiobooks, and which you can listen to."},{"method":"GET","path":"/api/v1/classics/purchases","summary":"Classics you've bought."}]},{"group":"Feedback","endpoints":[{"method":"POST","path":"/api/v1/feedback","summary":"Tell the people who make Askwho Casts what was clumsy, missing or broken: {message, category?: bug|missing|confusing|idea|praise|other, endpoint?}."}]}]}