Voice Over Jobs Monitor: Doors and Casting Calls avatar

Voice Over Jobs Monitor: Doors and Casting Calls

Pricing

from $1.21 / 1,000 finding returneds

Go to Apify Store
Voice Over Jobs Monitor: Doors and Casting Calls

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

Pradio Actors

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

an hour ago

Last modified

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

WhoWhat they run it for
A working voice actorPaid casting calls and the studio doors they want on file with, filtered to their voice
A performer building a reelThe community casting posts on Bluesky: indie games, audio dramas and fan projects
A voice actor who pitches directCompany homepages checked for signs they buy voice-over, with a published email when the site shows one
Anyone reading terms before applyingWhat 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 unknown when 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 dryRun and 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 doorStatus and 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 uncharged ITEM_STATUS row instead of vanishing. A company homepage that reads clean with no sign of buying comes back no_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 back ok with doorStatus: "unknown", and the run's closing RUN_SUMMARY row 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:

aiUseWhat the page said
prohibitedEvery 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
requiredThe page states it uses the voice for AI: training, cloning, a synthetic replica. A stated use counts, asked-for or not
mentionedAI language is on the page but it does not say which way
noneThe page was read and says nothing about AI
emptyThere 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.

FieldWhat it is
laneWhich check produced the row: board a casting listing, on_file or reopen_watch a door, cold_prospect a company
row_typeROW 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_kindWhich 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
sourceWhere the row was read: bluesky, ytjobs, roster_watch (a door page on your roster) or cold_prospect (a homepage you listed)
listingIdA stable id for telling two posts about one casting apart when the URL is not enough
urlThe canonical listing, door or homepage URL
titleThe 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
productionCompanyThe production company or poster, when published
roleTypeRole type as written: Voice Over, Narrator, Voice Actor
genderGender constraint copied from the page, never inferred from a name
ageRangeAge range as written on the page
accentTagsAccent 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
payRawThe pay string copied from the page
payParsedThat string read as amount, currency and unit (hour, project, day, word, line, finished_hour or unknown)
isPaidTrue when the page states pay, false for unpaid or credit-only, empty when it cannot be told
unionUnion status if written: non-union, SAG-AFTRA, Equity
deadlineThe deadline as an ISO date or the page's own short phrase
expiresAtThe same date when the source publishes only one
postedAtWhen the listing was posted, if published
applyUrlA public apply link found on the page. Never Discord, Voices.com, LinkedIn or a guessed Gmail
aiMentionedTrue when the page says anything at all about AI, in either direction
aiUseWhich way the AI wording points: prohibited, required, mentioned, none, or empty when there was no text
aiEvidenceThe sentence on the page that says which way its AI wording points, quoted so you can check it yourself
scrapedAtWhen this row was read
descriptionA short summary: title and blurb, never the full job text
requirementFlagsAccent, 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
pageHintsShort 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
statusWhether 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

FieldWhat it is
doorTypeThe kind of door: form, typeform, google_form, email_once or vendor_portal
companyThe studio or company name, or its domain when the page never gives one
emailA public casting address when the page publishes one. Never invented
doorStatusWhether you can submit today: open, closed, paused, or unknown when the page reads without saying either way. Empty on a miss row
statusEvidenceThe 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
freeVsFeeWhether joining costs money: free, fee, commission_only or unknown
homeStudioAskedTrue when the door asks for a home studio or remote working, false when read and not asked, empty when there was no text
exclusivityRiskTrue when the page carries exclusivity wording, same three-way rule
aiTrainingRiskTrue 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
lastCheckedAtWhen the door page was fetched
firstSeenAtWhen 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
sourceListWhich 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:

FieldWhat it is
statusok 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
statusEvidenceThe reason: fetch_failed, not_reached, unreadable plus what the page answered, or the no-signal explanation
companyThe company name, from your seed list or the page itself. Empty when neither named one
urlThe homepage checked
cityCity, when the homepage publishes one
countryCountry, when the homepage publishes one
contact_nameA published contact name. Never invented
contact_roleThe published role beside that name
emailA published email on the homepage. Never a guessed address
email_typenamed, info or unknown
buyer_typeThe kind of company: explainer, video_prodco, youtube, brand, agency, elearning, game_studio or unknown
client_sectorsSectors the homepage names
buys_vo_howHow it books voices when the page says: private_roster, client_shortlist or unknown
records_remoteWhether the site mentions remote working: Y, N or unknown
vo_buy_signalThe short quote that showed they buy voice work
process_page_urlA linked casting, talent or careers page when one is published
named_workA named project or headline when published
last_work_yearThe latest work year mentioned on the page
has_talent_formFalse on company rows. A homepage with a talent form is returned as a door row instead
talent_form_urlThat door's URL when one was found
tts_onlyTrue when the page sells synthetic voices only
fee_to_joinTrue when a joining or submission fee is stated
local_consumer_businessTrue 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.

FieldWhat it is
row_typeROW on a finding, ITEM_STATUS on an entry's miss note (never billed), RUN_SUMMARY on the run's accounting row
statusok on a summary that wrote; the named read failures sit on the ITEM_STATUS miss rows
runStateHow 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
examinedHow much it went through: doors fetched, homepages fetched, board posts and jobs scanned
keptHow many finding rows it wrote, miss rows included. The RUN_SUMMARY row itself is not counted
droppedHow many rows your filters or the dedupe memory held back
cappedHow many entries the per-source cap left unread; each one lands its own not_reached miss row, which is never billed
runFinishedAtWhen the run finished writing

How much does it cost?

Two events are charged, and both figures are live on the pricing tab:

EventPriceWhat one unit is
apify-actor-start$0.00005 per runStarting 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 rowEach 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 runWhat 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?

  1. 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.
  2. Paste the pages to watch, the homepages to check, or nothing at all: the casting feeds need no input.
  3. Rows land in the dataset as they are read. Download them as JSON, CSV or Excel, or read them through the Apify API.
  4. 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.

InputDefaultWhat it does
lanesEnabledall threeWhat to check: board casting calls, on_file the doors you watch, cold_prospect the homepages you list
rosterWatchUrls4 example doorsThe talent-submission pages to watch. Each comes back open, closed, paused or unknown, with the deciding sentence when there is one
onlyNewonOn: already-seen rows are skipped and a door returns only when new or changed. Off: every run returns everything
maxItemsPerSource25The 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
sourceAllowlistemptyEmpty runs every source for what you chose to check; pick some to run only those
unpaidSkiponDrops a listing that says it is unpaid. A listing with no pay stated is kept, because a blank is not a no
minPayAmountnoneDrops a listing whose stated pay is below this. A listing with no pay stated is kept
minPayCurrencynoneA three-letter code such as USD. A listing in another currency, or none stated, is kept
minPayUnitnoneApplies 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
genderFilteranymale or female keeps only listings that fit. A listing that does not say, or wants either, always passes
locationsemptyKeeps 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
regionsemptyWider areas such as EMEA or North America, joined to the locations list above
accentAllowlistemptyKeeps only listings naming one of six accent words. Most listings name none, so setting it excludes most rows: leave empty unless you mean it
blueskyFeedUria public casting feedThe Bluesky feed of casting posts to read. Paste another feed's address, or none to read only the accounts below
blueskyHandlesten starter accountsAccounts whose public posts are read for castings on top of the feed. Replace with your own
seedHomepageUrls2 example homepagesCompany homepages to check for signs they buy voice-over
seedCsvPathnoneA web link to a CSV with one homepage per row in a url, homepage or website column. Adds to the list above
buyerTypesemptyKeeps only companies of these kinds. A company whose kind could not be told always passes
sectorsemptyKeeps 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
dedupeKvStoreNamevo-jobs-seenThe memory name that makes "only new" work across runs. Tasks that share the name share one memory
blueskyAppViewUrlpublic Bluesky APIThe public Bluesky server posts are read from. Leave it unless you want a different one
proxyConfigurationoffNone of the sources needs one. A refused request is named, not retried through other addresses
dryRunoffOn: 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-returned at $0.00225; a miss row and the RUN_SUMMARY row are written but never billed, and a run starts at $0.00005.
  • 2026-09-30: status now says how the read went on every row, and the door's own state moved to doorStatus. Every run also writes one RUN_SUMMARY row 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 doorStatus unknown. 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 bluesky out of sourceAllowlist and set a pay floor.
  • The accent vocabulary is six words. accentTags and accentAllowlist know only Neutral, General, Standard, GenAm, American English and International English. A page asking for another accent keeps the field empty and notes it in requirementFlags instead. 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 run FAILED rather 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.