{
  "openapi": "3.0.1",
  "info": {
    "title": "Voice Over Jobs Monitor: Doors and Casting Calls",
    "description": "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.",
    "version": "0.3",
    "x-build-id": "Z309iifzKMhmpuwoE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pradio~vo-jobs-pipeline/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pradio-vo-jobs-pipeline",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/pradio~vo-jobs-pipeline/runs": {
      "post": {
        "operationId": "runs-sync-pradio-vo-jobs-pipeline",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/pradio~vo-jobs-pipeline/run-sync": {
      "post": {
        "operationId": "run-sync-pradio-vo-jobs-pipeline",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "lanesEnabled": {
            "title": "What to check",
            "type": "array",
            "description": "Casting boards returns casting listings and skips the ones that say they are unpaid. Talent doors checks the studio submission pages you list below and says whether each is open, closed or paused, and tells you when a closed one reopens. Companies checks the homepages you list for signs they buy voice-over. Each row says which of the three it came from.",
            "items": {
              "type": "string",
              "enum": [
                "board",
                "on_file",
                "cold_prospect"
              ],
              "enumTitles": [
                "Casting boards: casting listings",
                "Talent doors: studio submission pages you watch",
                "Companies: voice-over buyers with no submission page"
              ]
            },
            "default": [
              "board",
              "on_file",
              "cold_prospect"
            ]
          },
          "rosterWatchUrls": {
            "title": "Talent-submission pages to watch",
            "type": "array",
            "description": "The studio pages where you submit a demo or ask to join a roster: a web form, a Typeform, a Google Form, a casting email page or a vendor portal. Every run says whether each page is open, closed or paused, quotes the sentence that says so, and reads what the page says about AI use of your voice. A page that closes comes back marked as one to watch, so you hear when it opens again.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.soundswilde.com/directing-and-casting",
              "https://veryberrystudios.com/",
              "https://www.ab2talent.com/submissions/",
              "https://www.amtagency.com/submit-1"
            ]
          },
          "onlyNew": {
            "title": "Only return what is new since the last run",
            "type": "boolean",
            "description": "On: a listing or company you already received is skipped, and a talent page comes back only when it is new or its status changed (opened, closed, reopened). Off: every run returns everything it finds.",
            "default": true
          },
          "maxItemsPerSource": {
            "title": "Most items per source",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "The most listings, pages or homepages read from each source in one run. Keep it low on your first run.",
            "default": 25
          },
          "sourceAllowlist": {
            "title": "Sources to run",
            "type": "array",
            "description": "Leave empty to run every source for what you chose to check. Pick some to run only those.",
            "items": {
              "type": "string",
              "enum": [
                "bluesky",
                "ytjobs",
                "roster_watch",
                "cold_prospect"
              ],
              "enumTitles": [
                "Bluesky casting posts",
                "YouTube Jobs (ytjobs.co)",
                "Your talent-submission pages",
                "Your company homepages"
              ]
            },
            "default": []
          },
          "unpaidSkip": {
            "title": "Skip unpaid listings",
            "type": "boolean",
            "description": "On: a listing that says it is unpaid is left out. A listing that states no pay at all is kept, because a blank is not a no.",
            "default": true
          },
          "minPayAmount": {
            "title": "Lowest pay you want (optional)",
            "minimum": 0,
            "type": "number",
            "description": "Drop a listing whose stated pay is below this amount. A listing with no pay stated is kept. Set the currency and pay unit below so a per-word rate is never held to an hourly floor."
          },
          "minPayCurrency": {
            "title": "Currency of that pay floor (optional)",
            "type": "string",
            "description": "A three-letter code such as USD or GBP. Empty applies the floor whatever the listing's currency. A listing in another currency, or with none stated, is kept."
          },
          "minPayUnit": {
            "title": "Pay unit of that floor (optional)",
            "enum": [
              "hour",
              "project",
              "day",
              "word",
              "line",
              "finished_hour",
              "unknown"
            ],
            "type": "string",
            "description": "Apply the pay floor only to listings paid in this unit, or whose unit is not stated. A listing paid per word is never compared with an hourly floor."
          },
          "genderFilter": {
            "title": "Gender",
            "enum": [
              "any",
              "male",
              "female"
            ],
            "type": "string",
            "description": "Keep only listings that fit. A listing that does not say, or wants either, always passes.",
            "default": "any"
          },
          "locations": {
            "title": "Places (optional)",
            "type": "array",
            "description": "Keep listings whose title or description names one of these, for example Remote, UK, US or London. A listing that names none of them is left out, so keep this list short. Empty keeps everything.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "regions": {
            "title": "Regions (optional)",
            "type": "array",
            "description": "Wider areas such as EMEA, North America or EU, matched the same way as places. A listing that names any place or region from your two lists passes. Empty keeps everything.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "accentAllowlist": {
            "title": "Accents named on the listing (optional)",
            "type": "array",
            "description": "Keep only listings whose page names one of these accents. These six are the only accent words this Actor reads off a page. Choosing anything here also drops every listing that names no accent, and most listings name none, so leaving it empty is the usual choice.",
            "items": {
              "type": "string",
              "enum": [
                "Neutral",
                "General",
                "Standard",
                "GenAm",
                "American English",
                "International English"
              ],
              "enumTitles": [
                "Neutral",
                "General",
                "Standard",
                "GenAm (General American)",
                "American English",
                "International English"
              ]
            },
            "default": []
          },
          "blueskyFeedUri": {
            "title": "Bluesky casting feed",
            "type": "string",
            "description": "The public Bluesky feed of casting posts to read. The default is a casting feed another Bluesky user publishes. Paste the address of a different feed to use that one, or type none to read only the accounts below.",
            "default": "at://did:plc:5otr6wywnayoshmgypbodhyl/app.bsky.feed.generator/aaakequc66hv2"
          },
          "blueskyHandles": {
            "title": "Bluesky accounts to read",
            "type": "array",
            "description": "Accounts whose public posts are read for castings, on top of the feed. The default is a starter list of ten accounts that post voice-over castings; replace it with your own. One repost account (vacastingrt) is always skipped because it repeats what the feed already carries; it is not in the default ten, so the skip only matters when your own list adds it.",
            "items": {
              "type": "string"
            },
            "default": [
              "nsipstudio",
              "wadjeteyegames.com",
              "soughtaftercast",
              "soundswilde",
              "veryberrystudios",
              "castingcalls",
              "audioafauditions",
              "audiodramahub",
              "starrygstudios",
              "campcryptidshow"
            ]
          },
          "seedHomepageUrls": {
            "title": "Company homepages to check",
            "type": "array",
            "description": "Homepages of companies you think might hire voice-over. Each one that shows a published sign of buying voice work comes back with its sector, whether it records remotely, and a contact email only if the site publishes one. If a homepage turns out to have a talent-submission page, it is reported as a talent page instead.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://wadjeteyegames.com/",
              "https://www.fableandfolly.com/"
            ]
          },
          "seedCsvPath": {
            "title": "Link to a CSV list of homepages (optional)",
            "type": "string",
            "description": "A web link to a CSV file with one homepage per row, in a column named url, homepage or website, and an optional company column. It adds to the homepages above.",
            "default": ""
          },
          "buyerTypes": {
            "title": "Kinds of company (optional)",
            "type": "array",
            "description": "Keep only companies of these kinds. A company whose kind could not be told always passes. Empty keeps everything.",
            "items": {
              "type": "string",
              "enum": [
                "explainer",
                "video_prodco",
                "youtube",
                "brand",
                "agency",
                "elearning",
                "game_studio",
                "unknown"
              ],
              "enumTitles": [
                "Explainer video studio",
                "Video production company",
                "YouTube channel",
                "Brand",
                "Agency",
                "E-learning",
                "Game studio",
                "Could not tell"
              ]
            },
            "default": []
          },
          "sectors": {
            "title": "Sectors (optional)",
            "type": "array",
            "description": "Keep only companies whose site names one of these sectors: games, elearning, corporate, animation, audiobook, youtube or advertising. A company whose sector could not be read passes. Empty keeps everything.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "dedupeKvStoreName": {
            "title": "Memory name",
            "type": "string",
            "description": "The name of the storage this Actor uses to remember what it already returned, so that only new results come back on scheduled runs. Use the same name on every task that should share one memory; a new name starts fresh.",
            "default": "vo-jobs-seen"
          },
          "blueskyAppViewUrl": {
            "title": "Bluesky server address",
            "type": "string",
            "description": "The public Bluesky server the posts are read from. Leave it as it is unless you want to read through a different public Bluesky server.",
            "default": "https://public.api.bsky.app"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Off by default, and none of the sources needs one. A site that refuses a request is named in the run summary; it is not retried through other addresses.",
            "default": {
              "useApifyProxy": false
            }
          },
          "dryRun": {
            "title": "Practice run with built-in examples",
            "type": "boolean",
            "description": "On: visits no site and returns a few built-in example rows, so you can see the output and try your filters. Leave it off for real results.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}