{
  "openapi": "3.0.1",
  "info": {
    "title": "Voice Over Jobs Monitor",
    "description": "One scheduled sweep for voice-over work: paid casting listings from four public boards, the state of the talent doors you watch, and companies that buy VO but publish no door. Returns only what is new since the last run. Never guesses an email or writes outreach.",
    "version": "0.3",
    "x-build-id": "MEYf0EguQLiHfCa5e"
  },
  "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": "Lanes to run",
            "type": "array",
            "description": "Which product lanes to scrape this run. on_file also emits reopen_watch when a door is closed or paused. Never mix lanes on a single row.",
            "items": {
              "type": "string",
              "enum": [
                "board",
                "on_file",
                "cold_prospect"
              ],
              "enumTitles": [
                "Board — paid casting listings",
                "Direct — talent submission doors",
                "Prospects — companies with no door"
              ]
            },
            "default": [
              "board",
              "on_file",
              "cold_prospect"
            ]
          },
          "onlyNew": {
            "title": "Only new (delta vs named KV store)",
            "type": "boolean",
            "description": "When true, skip rows whose dedupe key was already stored in dedupeKvStoreName. Board/Direct keys are url or listingId; cold_prospect keys are the registrable domain. Direct rows re-emit if status/lane changed.",
            "default": true
          },
          "dryRun": {
            "title": "Local dry-run (fixtures only)",
            "type": "boolean",
            "description": "Skip the network and emit fixture rows through the same routing, filters, and KV dedupe path. Use this for apify run on a laptop.",
            "default": false
          },
          "dedupeKvStoreName": {
            "title": "Named Key-Value store for seen keys",
            "type": "string",
            "description": "Persists across scheduled Task runs so onlyNew can emit deltas. Create once and reuse the same name on every Task.",
            "default": "vo-jobs-seen"
          },
          "maxItemsPerSource": {
            "title": "Max items per source",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap listings or homepages processed for each source in this snapshot.",
            "default": 25
          },
          "sourceAllowlist": {
            "title": "Source allowlist",
            "type": "array",
            "description": "If empty, every source for the enabled lanes runs. Otherwise only these run. The board sources are bluesky, ytjobs, casting_call_club and casting_callback_uk; roster_watch is the Direct lane and cold_prospect the Prospects lane.",
            "items": {
              "type": "string",
              "enum": [
                "bluesky",
                "ytjobs",
                "casting_call_club",
                "casting_callback_uk",
                "roster_watch",
                "cold_prospect"
              ]
            },
            "default": []
          },
          "blueskyFeedUri": {
            "title": "Bluesky feed generator AT-URI",
            "type": "string",
            "description": "Public AppView feed. Fetched over HTTPS from public.api.bsky.app — no residential proxy required.",
            "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 duplicates what the feed already carries.",
            "items": {
              "type": "string"
            },
            "default": [
              "nsipstudio",
              "wadjeteyegames.com",
              "soughtaftercast",
              "soundswilde",
              "veryberrystudios",
              "castingcalls",
              "audioafauditions",
              "audiodramahub",
              "starrygstudios",
              "campcryptidshow"
            ]
          },
          "blueskyAppViewUrl": {
            "title": "Bluesky AppView base URL",
            "type": "string",
            "description": "Override only if you pin a different public AppView.",
            "default": "https://public.api.bsky.app"
          },
          "rosterWatchUrls": {
            "title": "Direct roster / apply URLs",
            "type": "array",
            "description": "Published talent doors (form, Typeform, Google Form, casting@ mailto, vendor portal). Closed or paused pages emit lane=reopen_watch.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "seedHomepageUrls": {
            "title": "Cold prospect homepage URLs",
            "type": "array",
            "description": "Company homepages. If a talent door is found, the row is emitted on Direct — never as cold_prospect.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "seedCsvPath": {
            "title": "Optional CSV of homepages",
            "type": "string",
            "description": "HTTP URL, local path, or default KV-store key. Columns: url|homepage|website and optional company.",
            "default": ""
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Off by default. Enable Apify Datacenter proxy only if a source starts blocking. Prefer not to use residential.",
            "default": {
              "useApifyProxy": false
            }
          },
          "genderFilter": {
            "title": "Board gender filter",
            "enum": [
              "any",
              "male",
              "female"
            ],
            "type": "string",
            "description": "Drop board rows that clearly conflict. any keeps unknown gender.",
            "default": "any"
          },
          "unpaidSkip": {
            "title": "Skip unpaid board listings",
            "type": "boolean",
            "description": "When true, board rows with isPaid=false are not emitted. Default true (sensible for paid-board Tasks); set false to keep unpaid.",
            "default": true
          },
          "minPayAmount": {
            "title": "Minimum pay amount (optional)",
            "minimum": 0,
            "type": "number",
            "description": "Board only. If set, drop rows whose parsed amount is below this floor when currency is compatible. Missing pay does not drop. Different known pay units vs minPayUnit are not compared."
          },
          "minPayCurrency": {
            "title": "Minimum pay currency (optional)",
            "type": "string",
            "description": "ISO code such as USD or GBP. Empty applies the amount floor to any parsed currency. Missing/different currency does not force a drop."
          },
          "enablePlaywrightFallback": {
            "title": "Playwright fallback for Casting Call Club",
            "type": "boolean",
            "description": "CCC HTTP uses projects_kick with search=voice actor and payment=paid (nc:voice_actor is not a role filter). Playwright is only used if that API returns no Voice Actor rows.",
            "default": true
          },
          "locations": {
            "title": "Location tokens (optional)",
            "type": "array",
            "description": "Soft place hints matched against board title/description/company (e.g. Remote, UK, US, London). Empty = no location filter. Unknown/blank location listings still pass.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "regions": {
            "title": "Region tokens (optional)",
            "type": "array",
            "description": "Complementary to locations (e.g. EMEA, North America, EU). Empty = no filter. Combined with locations as an OR token list.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "accentAllowlist": {
            "title": "Accent allowlist (board)",
            "type": "array",
            "description": "Keep only board listings whose page NAMES one of these accents. These six are the only accent words this Actor reads off a page, so nothing else can match. Leaving it empty is the usual choice: a listing that names no accent at all is excluded by any allowlist, and most listings name none.",
            "items": {
              "type": "string",
              "enum": [
                "Neutral",
                "General",
                "Standard",
                "GenAm",
                "American English",
                "International English"
              ],
              "enumTitles": [
                "Neutral",
                "General",
                "Standard",
                "GenAm (General American)",
                "American English",
                "International English"
              ]
            },
            "default": []
          },
          "minPayUnit": {
            "title": "Minimum pay unit (optional)",
            "enum": [
              "hour",
              "project",
              "day",
              "word",
              "line",
              "finished_hour",
              "unknown"
            ],
            "type": "string",
            "description": "When set with minPayAmount, only enforce the floor when the row unit matches or is unknown (hour/word/project/day/finished_hour). Prevents comparing e.g. per-word rates against an hourly floor."
          },
          "buyerTypes": {
            "title": "Cold buyer types (optional)",
            "type": "array",
            "description": "Cold lane only. If non-empty, drop prospects whose buyer_type is set and not in this list. unknown always passes. Empty = no filter.",
            "items": {
              "type": "string",
              "enum": [
                "explainer",
                "video_prodco",
                "youtube",
                "brand",
                "agency",
                "elearning",
                "game_studio",
                "unknown"
              ]
            },
            "default": []
          },
          "genres": {
            "title": "Cold genres / sectors (optional)",
            "type": "array",
            "description": "Cold lane only. Soft match against client_sectors when both are non-empty. Empty = no filter.",
            "items": {
              "type": "string"
            },
            "default": []
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}