Voice Over Jobs Monitor: Doors and Casting Calls
Pricing
from $1.21 / 1,000 finding returneds
Voice Over Jobs Monitor: Doors and Casting Calls
Monitor voice over jobs across studios' own talent-submission pages and the Bluesky and ytjobs casting feeds. Rows carry pay, deadline, union status, email, door state and the deciding sentence, plus what each page says about AI. Returns what is new since your last run, plus misses still unread.
Pricing
from $1.21 / 1,000 finding returneds
Rating
0.0
(0)
Developer
Pradio Actors
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
an hour ago
Last modified
Categories
Share
What does Voice Over Jobs Monitor do?
Voice Over Jobs Monitor finds voice over jobs and tells you when a studio's own talent-submission page opens or reopens, quoting the sentence that says so when the page gives one. Every page it reads is also flagged for what it says about AI: voice use, training bans, or content rules. Three kinds of finding row come back, and every run closes with a RUN_SUMMARY row counting what it read. Casting calls are swept from two public feeds. The studio doors you name come back open, closed, paused or unknown when a page reads but nothing on it decides. Company homepages that show signs of buying voice-over come back too. A run costs $0.00005 to start plus $0.00225 per finding row, and a named miss or the run's own summary row is never billed. It returns only what is new since your last one, plus any miss that still has not read.
Who uses Voice Over Jobs Monitor
| Who | What they run it for |
|---|---|
| A working voice actor | Paid casting calls and the studio doors they want on file with, filtered to their voice |
| A performer building a reel | The community casting posts on Bluesky: indie games, audio dramas and fan projects |
| A voice actor who pitches direct | Company homepages checked for signs they buy voice-over, with a published email when the site shows one |
| Anyone reading terms before applying | What each listing or door says about AI, and the phrase that decided it |
Features
- Watch the doors you care about. Paste the pages where you submit a demo or ask to join a roster. A web form, a Typeform, a Google Form, a casting email page and a vendor portal all count. Each run reports open, closed, paused, or
unknownwhen the page reads but none of its sentences decide, and quotes the sentence that says so when there is one. A page that closes stays on watch, so you hear when it reopens. - AI clauses read in both directions. Each page is classed as prohibiting, requiring, mentioning or silent on AI. The row carries the deciding phrase when the page gives one. A protective "no AI training" clause is never mistaken for a demand.
- Casting calls from two public feeds. Voice Over roles from ytjobs.co, plus casting posts on Bluesky read through the public API. That is a community feed and ten starter accounts you can replace with your own.
- Companies with no casting page. Give it homepages you suspect buy voice-over. It returns the ones showing a published sign. Sector, remote-working hints and a contact email come along, the email only when the site publishes one.
- Only what is new. A named memory skips what you already received. One listing is one row even when two posts link it.
- Filters that fit your voice. A pay floor with its own currency and unit, gender, place, accent, buyer type and sector. All filters are off by default except
unpaidSkip, which starts on: a listing that says it is unpaid is left out unless you turn that off. - Practice without a site. Turn on
dryRunand it returns built-in example rows without visiting a single page. - No proxy needed. These are plain public pages. A site that refuses a request is named in the run summary and is not retried through other addresses.
Why this one
- Three checks in one run. Casting calls, the studios' own submission pages and companies that quietly buy voice work land in one dataset. The closest overlapping seller on the Store covers one of the three.
- Door state nobody else returns. None of the sellers we found returns a submission page's open or closed state, or flags its AI language. Every door row carries
doorStatusand quotes the deciding sentence when the page gives one, and every read page gets an AI verdict, evidence included when the page states a position. - No duplicate rows. The one overlapping seller's own run returned 2 of its 20 rows as the same listing twice. This Actor's memory keys on the door's own state: a page that reopens comes back, a page that has not moved stays quiet.
- Misses named, not silent. A page that fails returns one of 3 named failures (
fetch_failed,unreadable,not_reached) as an unchargedITEM_STATUSrow instead of vanishing. A company homepage that reads clean with no sign of buying comes backno_signal, a billed verdict the memory keeps so the same quiet page stays quiet on later runs and reappears the day its answer moves. A door that reads clean with no status wording comes backokwithdoorStatus: "unknown", and the run's closingRUN_SUMMARYrow counts what it examined, kept, dropped and capped. - One row price, misses free. Every finding row bills the same $0.00225: a casting call, a door read and a company prospect price alike, while a named miss and the run's own summary row are never billed, so a run's cost is a count of findings.
Casting calls, studio doors and quiet buyers
Every finding row carries a lane saying which of the three checks produced it. Lanes are never mixed on one row. The run's own RUN_SUMMARY row is not a finding and carries none.
board: casting listings
Two public sources:
- Bluesky. Casting posts read through the public Bluesky API: a community feed another user publishes, plus a starter list of ten accounts that post voice castings (replace them with
blueskyHandles). A feed post is kept only when it names voice work or carries a voice hashtag, and only when it has somewhere to apply. Posts over two weeks old are dropped. So are closed-casting announcements, on-camera castings, non-voice extras calls, and listings whose stated deadline already passed: a closed audition is a dead lead, not a finding. One repost account is always skipped because it only repeats the feed. - ytjobs.co. Voice Over roles from its public jobs API, with a public feed as fallback when the API shows nothing. Feed items carry their post date, and anything over two weeks old is dropped under the same freshness bound as the Bluesky sweep.
A Bluesky post whose apply link is a form or a listing page gets that page read for a rate first. When the text negates its own pay line ("not a paid gig"), the row reads unpaid rather than paid.
on_file and reopen_watch: the doors you watch
Give it the roster or "work with us" URLs you care about. For each page you get the kind of door it is and its state: open, closed, paused, or unknown when the page reads but nothing decides, with the sentence that says so when there is one. You get whether joining is free or carries a fee, whether it asks for a home studio, and whether exclusivity language appears. You get what the page says about AI, and a public casting email when the page publishes one.
A door that reads closed or paused comes back as reopen_watch rather than disappearing, so the next run tells you when it opens again. A page that states no status comes back with doorStatus unknown, never guessed open.
Inside the cap, every page you paste is read on every run, and onlyNew decides what comes back as a row: the state when it moved, or a named miss when the read itself failed. maxItemsPerSource bounds the reads per source at 25 by default: a page past the cap comes back as a not_reached row rather than being read. Say you watch 50 doors and raise the cap past them. With onlyNew off, a run writes the 50 door rows plus its own RUN_SUMMARY row. Each page it reached is a status read; each one it could not reach is a named miss. With onlyNew on, later runs return only what is new or moved. If 47 of your 50 are unchanged, you get the ones that opened, closed or reopened, plus any misses.
cold_prospect: companies with no door
Give it company homepages, as a list or as a link to a CSV with a url, homepage or website column. Each homepage is checked for published signs it buys voice work. The ones that show one come back with sector and a remote-working hint. A published email and the short quote that signalled it come along when the site shows them.
A homepage that turns out to have a talent-submission page is reported as a door row instead. A published door always wins over a cold prospect. This lane checks the homepages you give it and does not go looking for companies. It says no to most of the pages it reads. That no is a row too, so "checked and nothing" is never indistinguishable from "never checked".
What casting calls and doors say about AI
Listings and doors carry aiUse, the field worth reading first:
aiUse | What the page said |
|---|---|
prohibited | Every AI mention is negated: "no AI training", "will never be cloned", "no AI-generated content in the work". A protective clause, whichever side it shields |
required | The page states it uses the voice for AI: training, cloning, a synthetic replica. A stated use counts, asked-for or not |
mentioned | AI language is on the page but it does not say which way |
none | The page was read and says nothing about AI |
| empty | There was no text to read. Not the same answer as none |
aiEvidence carries the deciding phrase when the page gives one, so you can check the reading rather than trust it. aiMentioned is the plainer flag: true when the page mentions AI at all, empty when the page gave nothing to read.
Every yes-or-no field works the same way. True means the page said it, false means the page was read and the answer is no, and empty means there was no text to read. A blank is never a no. Three fields bend the rule: isPaid stays empty when a read page gives no pay signal either way, has_talent_form stays false on company rows because a homepage naming its own talent form comes back as a door row instead, and records_remote answers Y, N or unknown, the letters the pages themselves use.
What data does Voice Over Jobs Monitor return?
Rows land in the run's dataset as they are read. These two are real rows from a run on 1 October 2026, trimmed to the main fields; a full casting row carries 28 fields.
A studio door that publishes a protective AI clause:
{"lane": "on_file","doorType": "google_form","url": "https://veryberrystudios.com/","title": "Very Berry Studios","company": "Very Berry Studios","status": "ok","doorStatus": "unknown","statusEvidence": null,"email": "casting@veryberrystudios.com","freeVsFee": "unknown","homeStudioAsked": false,"aiUse": "prohibited","aiEvidence": "⚠️ Please do not use our contract form if... • Your project contains AI-generated content or unethically sourced material"}
This page states an AI clause but no open-or-closed wording, so the door came back unknown and there is no deciding sentence to quote (statusEvidence is null).
A casting call from Bluesky:
{"lane": "board","source": "bluesky","listingId": "https://www.stingbotgames.com/karenaudition","url": "https://www.stingbotgames.com/karenaudition","title": "Casting Call - Paid Role","productionCompany": "stingbotgames.bsky.social","roleType": "Voice Over","gender": "female","payRaw": "Paid Role","payParsed": { "amount": null, "currency": null, "unit": "unknown" },"isPaid": true,"postedAt": "2026-09-28T16:17:44.228Z","applyUrl": "https://www.stingbotgames.com/karenaudition","aiUse": "none","aiEvidence": null}
The full field list, grouped by the kind of row that carries it.
Fields on casting and door rows
The listing details (listingId, productionCompany, roleType, gender, ageRange, payRaw, payParsed, isPaid, union, deadline, expiresAt, postedAt, applyUrl and description) are casting-call fields; a door row does not carry them. Everything else in this table appears on both.
| Field | What it is |
|---|---|
lane | Which check produced the row: board a casting listing, on_file or reopen_watch a door, cold_prospect a company |
row_type | ROW on a finding, ITEM_STATUS on a miss note (a read that failed or was never made; written but never billed), RUN_SUMMARY on the run's own accounting row |
entry_kind | Which kind of finding a ROW is: LISTING, DOOR or PROSPECT. A miss row carries the kind its entry would have returned; RUN_SUMMARY carries none |
source | Where the row was read: bluesky, ytjobs, roster_watch (a door page on your roster) or cold_prospect (a homepage you listed) |
listingId | A stable id for telling two posts about one casting apart when the URL is not enough |
url | The canonical listing, door or homepage URL |
title | The page's own title: the casting title on a listing, the door page's title on a door row: its leading heading when the heading is title-shaped, else its document title |
productionCompany | The production company or poster, when published |
roleType | Role type as written: Voice Over, Narrator, Voice Actor |
gender | Gender constraint copied from the page, never inferred from a name |
ageRange | Age range as written on the page |
accentTags | Accent words copied from the page, and only from six it knows: Neutral, General, Standard, GenAm, American English, International English. Empty when the page names none |
payRaw | The pay string copied from the page |
payParsed | That string read as amount, currency and unit (hour, project, day, word, line, finished_hour or unknown) |
isPaid | True when the page states pay, false for unpaid or credit-only, empty when it cannot be told |
union | Union status if written: non-union, SAG-AFTRA, Equity |
deadline | The deadline as an ISO date or the page's own short phrase |
expiresAt | The same date when the source publishes only one |
postedAt | When the listing was posted, if published |
applyUrl | A public apply link found on the page. Never Discord, Voices.com, LinkedIn or a guessed Gmail |
aiMentioned | True when the page says anything at all about AI, in either direction |
aiUse | Which way the AI wording points: prohibited, required, mentioned, none, or empty when there was no text |
aiEvidence | The sentence on the page that says which way its AI wording points, quoted so you can check it yourself |
scrapedAt | When this row was read |
description | A short summary: title and blurb, never the full job text |
requirementFlags | Accent, language or location requirements written on the page, such as RP, Scottish, UK native only or a non-English voice language. A signal, never a filter: no row is dropped for carrying one |
pageHints | Short facts copied from the page a voice actor filters on: a home studio mentioned, a rate stated, games or explainer work. Facts, never a score |
status | Whether the page answered: ok means it read. On an ITEM_STATUS miss row it names the failed or never-made read instead: fetch_failed, unreadable or not_reached. no_signal is different: a company homepage that read fine but shows no sign of buying voice work |
Fields on door rows
| Field | What it is |
|---|---|
doorType | The kind of door: form, typeform, google_form, email_once or vendor_portal |
company | The studio or company name, or its domain when the page never gives one |
email | A public casting address when the page publishes one. Never invented |
doorStatus | Whether you can submit today: open, closed, paused, or unknown when the page reads without saying either way. Empty on a miss row |
statusEvidence | The sentence on the page that says the door is open or closed, quoted. Empty when the page says neither way. On an uncharged ITEM_STATUS miss row it names what went wrong instead: fetch_failed, not_reached, blocked_or_empty_page, an http_ code or auth_or_sign_in_wall |
freeVsFee | Whether joining costs money: free, fee, commission_only or unknown |
homeStudioAsked | True when the door asks for a home studio or remote working, false when read and not asked, empty when there was no text |
exclusivityRisk | True when the page carries exclusivity wording, same three-way rule |
aiTrainingRisk | True when the AI wording reads as use of your voice or is unclear, false when the page is silent or protective, empty when there was no text |
lastCheckedAt | When the door page was fetched |
firstSeenAt | When this door first entered the memory (company rows carry it too, for the prospect's first sighting). Empty on a miss row: a miss is never remembered |
sourceList | Which input list this door came from |
Fields on company rows
Company rows carry these fields from the first table (lane, row_type, entry_kind, source, status, url, accentTags, requirementFlags, aiMentioned, aiUse, aiEvidence, scrapedAt, firstSeenAt), plus these:
| Field | What it is |
|---|---|
status | ok on a company the homepage read as a buyer; fetch_failed, unreadable or not_reached on an uncharged ITEM_STATUS row naming a read that failed; no_signal when it read fine and shows no sign of buying voice work |
statusEvidence | The reason: fetch_failed, not_reached, unreadable plus what the page answered, or the no-signal explanation |
company | The company name, from your seed list or the page itself. Empty when neither named one |
url | The homepage checked |
city | City, when the homepage publishes one |
country | Country, when the homepage publishes one |
contact_name | A published contact name. Never invented |
contact_role | The published role beside that name |
email | A published email on the homepage. Never a guessed address |
email_type | named, info or unknown |
buyer_type | The kind of company: explainer, video_prodco, youtube, brand, agency, elearning, game_studio or unknown |
client_sectors | Sectors the homepage names |
buys_vo_how | How it books voices when the page says: private_roster, client_shortlist or unknown |
records_remote | Whether the site mentions remote working: Y, N or unknown |
vo_buy_signal | The short quote that showed they buy voice work |
process_page_url | A linked casting, talent or careers page when one is published |
named_work | A named project or headline when published |
last_work_year | The latest work year mentioned on the page |
has_talent_form | False on company rows. A homepage with a talent form is returned as a door row instead |
talent_form_url | That door's URL when one was found |
tts_only | True when the page sells synthetic voices only |
fee_to_join | True when a joining or submission fee is stated |
local_consumer_business | True when the homepage reads as a small local business, a hint that it probably books voices through an agency |
Fields on the run's own row
A quiet day still answers you: every run closes by writing one RUN_SUMMARY row saying how much it read, so an empty market and an unread one are never the same answer. row_type separates findings (ROW) from an entry's miss note (ITEM_STATUS) and the run's own RUN_SUMMARY row; the last two are written but never billed. entry_kind says which kind of finding a ROW is: LISTING (a casting call from a feed), DOOR (a studio's talent-submission page) or PROSPECT (a company that buys voice work but publishes no door). A miss row carries the entry_kind its entry would have returned. Filter on entry_kind for reads that want only one kind.
| Field | What it is |
|---|---|
row_type | ROW on a finding, ITEM_STATUS on an entry's miss note (never billed), RUN_SUMMARY on the run's accounting row |
status | ok on a summary that wrote; the named read failures sit on the ITEM_STATUS miss rows |
runState | How the run ended: ROWS means findings were written, NOTHING_NEW means everything it read was seen before or quiet, ABORTED or FAILED means it stopped early or errored |
examined | How much it went through: doors fetched, homepages fetched, board posts and jobs scanned |
kept | How many finding rows it wrote, miss rows included. The RUN_SUMMARY row itself is not counted |
dropped | How many rows your filters or the dedupe memory held back |
capped | How many entries the per-source cap left unread; each one lands its own not_reached miss row, which is never billed |
runFinishedAt | When the run finished writing |
How much does it cost?
Two events are charged, and both figures are live on the pricing tab:
| Event | Price | What one unit is |
|---|---|---|
apify-actor-start | $0.00005 per run | Starting a run at all. The platform meters the start event per GB of memory with a one-event minimum; this Actor runs at 512MB, so one event, once per run, whether it finds rows or not |
finding-returned | $0.00225 per finding row | Each finding row written to the dataset: a casting call, a door read or a company prospect, charged once after the row lands |
A run costs the $0.00005 start plus $0.00225 for every finding row it writes; multiply the finding count by the row price and add the start.
| Finding rows in a run | What it bills |
|---|---|
| 100 | $0.225 in row events, plus the $0.00005 start |
| 1,000 | $2.25 in row events, plus the $0.00005 start |
| 10,000 | $22.50 in row events, plus the $0.00005 start |
What is not charged: a filtered or already-seen row is never written, so it is never billed. A miss row (ITEM_STATUS) that only names a failed or never-made read is written but never billed, and so is the RUN_SUMMARY row. The RUN_TOTALS totals are kept with the run rather than written to the dataset, so they never bill either.
Your plan's prices are the live ones on the pricing tab beside this page.
A dryRun practice run visits no site. Its built-in example rows are still written to the dataset and billed like any other finding rows. Keep it for one look at the shape.
How do I use Voice Over Jobs Monitor?
- Open the Actor and press Start. The defaults sweep all three checks; the door and company lanes come with four example doors and two example homepages you replace with your own.
- Paste the pages to watch, the homepages to check, or nothing at all: the casting feeds need no input.
- Rows land in the dataset as they are read. Download them as JSON, CSV or Excel, or read them through the Apify API.
- Save the input as a task and put it on a schedule: daily for casting calls, weekly for doors. The named memory makes each run return only what changed.
Worked examples
Use it to hear when a studio's submission page opens or reopens:
{"lanesEnabled": ["on_file"],"sourceAllowlist": ["roster_watch"],"rosterWatchUrls": ["https://www.soundswilde.com/directing-and-casting","https://veryberrystudios.com/","https://www.ab2talent.com/submissions/","https://www.amtagency.com/submit-1"],"onlyNew": true,"dedupeKvStoreName": "vo-jobs-seen","maxItemsPerSource": 25}
Use it to sweep the casting feeds for voice acting jobs that fit you:
{"lanesEnabled": ["board"],"sourceAllowlist": ["bluesky", "ytjobs"],"unpaidSkip": true,"minPayAmount": 100,"minPayCurrency": "USD","minPayUnit": "project","genderFilter": "female","locations": ["Remote", "US"]}
Use it to qualify companies that buy voice-over but publish no casting page:
{"lanesEnabled": ["cold_prospect"],"sourceAllowlist": ["cold_prospect"],"seedHomepageUrls": ["https://wadjeteyegames.com/","https://www.fableandfolly.com/"],"buyerTypes": ["explainer", "game_studio"],"sectors": ["games", "elearning"]}
Use it to see the output shape without reading a single site:
{"dryRun": true}
From the command line: apify call pradio/vo-jobs-pipeline. From the API, POST your input to https://api.apify.com/v2/acts/pradio~vo-jobs-pipeline/run-sync-get-dataset-items and the rows come back in the response.
Input
Everything is optional. The defaults run all three checks: four example studio doors, two example company homepages and a starter Bluesky list, all of which you replace with your own.
| Input | Default | What it does |
|---|---|---|
lanesEnabled | all three | What to check: board casting calls, on_file the doors you watch, cold_prospect the homepages you list |
rosterWatchUrls | 4 example doors | The talent-submission pages to watch. Each comes back open, closed, paused or unknown, with the deciding sentence when there is one |
onlyNew | on | On: already-seen rows are skipped and a door returns only when new or changed. Off: every run returns everything |
maxItemsPerSource | 25 | The most listings, doors or homepages read from each source in one run. Entries past the cap come back as named not_reached miss rows, written but never billed |
sourceAllowlist | empty | Empty runs every source for what you chose to check; pick some to run only those |
unpaidSkip | on | Drops a listing that says it is unpaid. A listing with no pay stated is kept, because a blank is not a no |
minPayAmount | none | Drops a listing whose stated pay is below this. A listing with no pay stated is kept |
minPayCurrency | none | A three-letter code such as USD. A listing in another currency, or none stated, is kept |
minPayUnit | none | Applies the floor to listings in that unit and to listings that state no unit, so a per-word rate is never held to an hourly floor |
genderFilter | any | male or female keeps only listings that fit. A listing that does not say, or wants either, always passes |
locations | empty | Keeps listings whose text names one of these, such as Remote or London. The two place lists act as one: a listing naming any place or region from them passes, and a listing naming none is left out, so keep them short |
regions | empty | Wider areas such as EMEA or North America, joined to the locations list above |
accentAllowlist | empty | Keeps only listings naming one of six accent words. Most listings name none, so setting it excludes most rows: leave empty unless you mean it |
blueskyFeedUri | a public casting feed | The Bluesky feed of casting posts to read. Paste another feed's address, or none to read only the accounts below |
blueskyHandles | ten starter accounts | Accounts whose public posts are read for castings on top of the feed. Replace with your own |
seedHomepageUrls | 2 example homepages | Company homepages to check for signs they buy voice-over |
seedCsvPath | none | A web link to a CSV with one homepage per row in a url, homepage or website column. Adds to the list above |
buyerTypes | empty | Keeps only companies of these kinds. A company whose kind could not be told always passes |
sectors | empty | Keeps only companies whose site names one of these sectors, such as games or elearning. A company whose sector could not be read passes rather than drops |
dedupeKvStoreName | vo-jobs-seen | The memory name that makes "only new" work across runs. Tasks that share the name share one memory |
blueskyAppViewUrl | public Bluesky API | The public Bluesky server posts are read from. Leave it unless you want a different one |
proxyConfiguration | off | None of the sources needs one. A refused request is named, not retried through other addresses |
dryRun | off | On: visits no site and returns built-in example rows |
Output: how a run ends
Every run, including a quiet one, writes a RUN_TOTALS entry to the run's key-value store. It carries state and the counts emitted, skippedDedupe and skippedFilter, split byLane and bySource. unreadableSources names any source that answered with a wall or could not be reached. Company runs add per-homepage outcomes (coldSeedStats).
state is one of four values. ROWS when rows were written. NOTHING_NEW when the sweep ran clean and found nothing new. ABORTED when the run was stopped, FAILED when it broke. A zero-finding run is a real answer, not an error. The RUN_TOTALS entry says whether the day was quiet or a source went unread. The dataset's RUN_SUMMARY row says how many entries were read to reach it.
A read that fails or never runs is never silent. It comes back as an ITEM_STATUS miss row, written but never billed, with status naming which miss it is. fetch_failed when the page could not be fetched, unreadable when it answered a wall, an error or an empty body, not_reached when the per-source cap, or the run's charge limit, cut it first. statusEvidence gives the detail: blocked_or_empty_page, an http_ code, auth_or_sign_in_wall or the error. A door miss leaves doorStatus empty. Miss rows are never remembered, so they come back on the next run too. A failed read today must not silence the day the page starts answering.
no_signal is not a miss. It is a billed finding row for a company homepage that read fine and shows no sign of buying voice work. The memory keeps the verdict, so the same quiet page stays quiet on later runs and reappears the day its answer moves.
What can you do with the data?
A daily sweep before your first session. The casting rows carry the title, the pay as written, the deadline, where to apply and what the page says about AI. You read a list instead of opening twenty tabs.
Hearing a door reopen. Studios open their rosters quietly and close them the same way. A door you flagged last month comes back the day its status changes, with the sentence that proves it.
Building a direct list. Feed it the homepages of explainer studios, game audio shops and e-learning companies you suspect buy voices. You get the ones showing a sign and a published email when the site shows one. The rest come back a clear no.
Checking terms before you audition. aiUse and aiEvidence tell you whether a casting plans to train on your voice. The clause is read before you send a demo, not after.
Pair it with our other tools. A cold prospect's homepage goes to Contact Details Scraper for the published contact details on it. A door that looks dead gets a second read from Broken Link Checker. And Bluesky Mentions Scraper watches the same platform for mentions of your own name.
Use Voice Over Jobs Monitor with AI agents
Paste this to give an agent the Actor through Apify's MCP server:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=pradio/vo-jobs-pipeline"
The agent can then start runs, read the dataset and check the RUN_TOTALS entry like any other tool.
Personal data
Some company rows carry a published contact name or a public casting email. This Actor returns only what a site chose to publish and never builds an address that is not on the page. Whatever you collect is yours to look after. Have a lawful reason to hold it, keep it no longer than you need, and honour a removal request. Do not use it for unsolicited bulk mail.
Release notes
- 2026-10-01: Billing moved to the product's own event. Each finding row bills
finding-returnedat $0.00225; a miss row and theRUN_SUMMARYrow are written but never billed, and a run starts at $0.00005. - 2026-09-30:
statusnow says how the read went on every row, and the door's own state moved todoorStatus. Every run also writes oneRUN_SUMMARYrow with the counts. - 2026-09-30: Search terms and listing wording set for the Store.
- 2026-09-30: Two casting boards removed. Casting Call Club and Casting Callback UK do not allow automated reading in their terms. They are no longer sources.
- 2026-09-28: A post that negates its own pay line now reads unpaid, a listing linked by two posts is written and charged once, and every input description was rewritten for buyers.
- 2026-09-05: First public build.
Limits
- Boards it does not read. Casting Call Club and Casting Callback UK were removed because their terms do not allow automated reading. Boards that are paywalled or terms-restricted are out entirely: no Voices.com, Spotlight, Equity, Backstage or Mandy. A listing link to Discord, Voices.com or LinkedIn is never handed to you as an apply destination.
- ytjobs is often quiet. The Voice Over section can go days with nothing new. The API is tried first, then its public feed. A quiet day returns nothing rather than padding it with irrelevant roles.
- A door with no status wording says
doorStatusunknown. It is never guessed open. - The Bluesky lane is the community lane. Indie games, audio dramas and fan projects, often with no rate stated. For professional rates only, leave
blueskyout ofsourceAllowlistand set a pay floor. - The accent vocabulary is six words.
accentTagsandaccentAllowlistknow only Neutral, General, Standard, GenAm, American English and International English. A page asking for another accent keeps the field empty and notes it inrequirementFlagsinstead. That flag vocabulary leans British and Irish. A British or Irish voice should read those flags as "this listing names an accent", not a warning. - The company lane says no to most homepages. It checks the pages you give it and does not go looking for companies. A long list can fairly come back with a handful of yeses and a named no for every other.
- A dead board fails the run. A source that stops answering is named in
unreadableSources. A whole-source failure ends the runFAILEDrather than returning empty rows that look like a quiet day. - The sources are English-language. It will run against other languages, but the reading is built for English pages.
Troubleshooting
I watch 50 doors and got only a few rows. onlyNew is doing its job. Doors that have not moved are remembered, not repeated. The 47 unchanged ones stay home; you get the ones that opened, closed or reopened, plus any misses (written but never billed). Set onlyNew off for one run to see every door at once.
The run returned only one row. That is the RUN_SUMMARY accounting row, written but never billed, and it means the run found nothing. Check the RUN_TOTALS entry in the run's key-value store. NOTHING_NEW means the sweep ran and found nothing new; unreadableSources names anything that could not be read. Also check the run log: a lane left on with no URLs warns that it is waiting for input.
A door came back doorStatus unknown. The page read but states no open or closed wording. When the read itself failed, status names the failure word. statusEvidence says why: fetch_failed, not_reached, blocked_or_empty_page, an http_ code or auth_or_sign_in_wall.
A homepage I gave it is missing from the companies. Look for it under door rows: a homepage with a talent-submission page is reported as a door instead. Otherwise it is a company row with a miss status and the reason in statusEvidence.
A listing came back that I already saw. Either the memory name changed (dedupeKvStoreName), or a door changed status, which is exactly the news worth repeating.
FAQ
Can I use integrations with Voice Over Jobs Monitor? Yes. Rows land in a standard dataset, so Apify integrations work as usual. Schedule it daily, push rows to Google Sheets or Slack, or trigger a webhook when a run finishes.
Can I use it with the Apify API? Yes. Start runs and pull rows through the standard API endpoints, or apify call pradio/vo-jobs-pipeline from the command line.
Can I use it through an MCP server? Yes. The command in the agents section above registers it with an MCP client in one step.
Is it legal to scrape casting calls? Every source is read as a member of the public. No login, no proxy needed (a proxyConfiguration input exists but stays off), a delay between requests. A site that refuses is named, never worked around. The two boards whose terms forbid automated reads were removed as sources. You are responsible for having the right to read the pages you give it, and for how you use the rows it returns.
Do I need an account on any of these sites? No. Every page is read the way a visitor sees it.
Will it apply to anything for me? No, and it never will. It returns rows; you decide what to do with them.
Feedback
Something wrong, or a field you wish it returned? Open the Issues tab on the Actor page. It will be answered within two days. If this Actor saved you time, a review on the Store helps other voice actors find it.
Not affiliated
This is an unofficial tool. It is not affiliated with, endorsed by or connected to the studios, casting boards, feeds or Bluesky accounts it reads. It reads their public pages the way a visitor would.


