{
  "openapi": "3.0.1",
  "info": {
    "title": "Podcast Opportunity Engine",
    "description": "CRM-native podcast prospecting infrastructure that generates deterministic outreach signals, sponsor-target leads, and podcast booking pipelines from Apple Podcasts + Spotify. Real-time timing-aware opportunity signals. $0.15/podcast.",
    "version": "1.0",
    "x-build-id": "RdgRDJCqxKDGIfKfl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ryanclinton~podcast-opportunity-engine/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ryanclinton-podcast-opportunity-engine",
        "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/ryanclinton~podcast-opportunity-engine/runs": {
      "post": {
        "operationId": "runs-sync-ryanclinton-podcast-opportunity-engine",
        "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/ryanclinton~podcast-opportunity-engine/run-sync": {
      "post": {
        "operationId": "run-sync-ryanclinton-podcast-opportunity-engine",
        "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",
        "required": [
          "searchTerms"
        ],
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "maxItems": 50,
            "type": "array",
            "description": "Keywords to search for on Apple Podcasts (e.g., \"true crime\", \"business marketing\", \"AI technology\").",
            "items": {
              "type": "string"
            },
            "default": [
              "technology startups"
            ]
          },
          "maxResults": {
            "title": "Max podcasts per search term",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum number of podcasts to return per search term. Apple limits to 200 per query.",
            "default": 50
          },
          "country": {
            "title": "iTunes Store country",
            "pattern": "^[a-zA-Z]{2}$",
            "type": "string",
            "description": "Two-letter country code for the iTunes Store to search (e.g., \"us\", \"gb\", \"de\").",
            "default": "us"
          },
          "includeEpisodes": {
            "title": "Include episode listings",
            "type": "boolean",
            "description": "Include recent episodes for each podcast in the output. Disable to reduce output size and speed up runs.",
            "default": true
          },
          "maxEpisodesPerShow": {
            "title": "Max episodes per podcast",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of recent episodes to include per podcast. Set to 0 for all episodes (can be very large).",
            "default": 10
          },
          "activeOnly": {
            "title": "Active podcasts only",
            "type": "boolean",
            "description": "Only include podcasts that have published an episode in the last 90 days.",
            "default": false
          },
          "spotifyClientId": {
            "title": "Spotify Client ID",
            "type": "string",
            "description": "Optional. Your Spotify app Client ID for searching Spotify Podcasts. Get one free at https://developer.spotify.com/dashboard. If not provided, only Apple Podcasts will be searched."
          },
          "spotifyClientSecret": {
            "title": "Spotify Client Secret",
            "type": "string",
            "description": "Optional. Your Spotify app Client Secret. Required together with Client ID to enable Spotify search."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apple's iTunes search caches 404 responses per-IP for up to 24 hours. Using Apify Proxy rotates IPs so repeat searches recover instead of hitting cached 404s. Default uses shared datacenter IPs (included free on paid Apify plans). For heavier use, select a datacenter or residential group in the proxy selector.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "auto",
              "guest-booking",
              "sponsor-buying",
              "pr-outreach",
              "market-map",
              "watchlist",
              "quick-discovery",
              "enrichment",
              "outreach",
              "sponsorship",
              "market-intel",
              "lightweight"
            ],
            "type": "string",
            "description": "guest-booking: shows likely to accept guest pitches (active-only + episode metadata for guest-format inference). sponsor-buying: advertiser/partnership prospecting (deep commercial signals + website probes). pr-outreach: media-pitch lists for PR campaigns. market-map: relationship graph + warm pathways + sponsor market signals + topic velocity. watchlist: scheduled monitoring run with cross-run drift detection (best with watchlistName set). quick-discovery: discovery-only, fast and cheap on big batches. enrichment: every layer ON, full output. auto: resolves from input shape. (Legacy aliases still accepted: outreach → guest-booking, sponsorship → sponsor-buying, market-intel → market-map, lightweight → quick-discovery.)",
            "default": "auto"
          },
          "outputProfile": {
            "title": "Output profile",
            "enum": [
              "minimal",
              "standard",
              "full",
              "llm"
            ],
            "type": "string",
            "description": "Field set in dataset records. minimal = essentials + score only. standard = full record. full = identical to standard (kept for forward compatibility). llm = standard minus large fields like full episode arrays, optimized for LLM context.",
            "default": "standard"
          },
          "enableContactabilityScoring": {
            "title": "Override: Enable contactability scoring",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. Only set if you want to force this layer ON or OFF independently of the mode. Compute a 0-100 contactability score + level band + 6-component breakdown per podcast. Also emits emailValidation, channelStrategy, coverageAnalysis."
          },
          "enableSuiteIntelligence": {
            "title": "Override: Enable suite intelligence",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. Emits per-record pipelineState, actorGraph (ranked next sibling actors), executionReadiness, improvementSuggestions, and an LLM-friendly summary string."
          },
          "enableCommercialIntelligence": {
            "title": "Override: Enable commercial intelligence",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. Emits per-record commercialSignals (sponsorship + format + network + cross-platform + type), showQualityScore, audienceProxy, dataQuality. Run-level marketInsights summary aggregates across all results."
          },
          "enableEntityExtraction": {
            "title": "Override: Enable entity extraction",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. Extracts guest names from interview-format episode titles + sponsor brand names from sponsor-copy patterns. Emits per-record guestSignals (top recurring guests, repeat ratio, founder-heavy boolean) + sponsorIntelligence (density, top sponsors, ad-tech stack). Run-level relationshipGraph summarises sharedGuests and sharedSponsors across all results."
          },
          "enableMaturityAnalysis": {
            "title": "Override: Enable maturity analysis",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. Emits per-record outreachDifficulty (easy/medium/hard + reasons), operationalMaturity (professional/mid/developing/starter tier + signals), marketSaturation (sponsor-heavy + guest competition + cold-pitch difficulty), and commercialFitScores (b2bFounderFit, sponsorshipFit, guestPlacementFit, agencyOutreachFit — each 0-100)."
          },
          "enableWebsiteProbe": {
            "title": "Override: Enable website probe (slower, opt-in)",
            "type": "boolean",
            "description": "Per-flag override of the mode preset. HEAD-probes the podcast website for known marketing-page paths (/contact, /advertise, /sponsor, /guest, /media-kit, /about, /newsletter). No HTML parsing — just path-existence checks. Adds ~3-5s per podcast. Different scope from website-contact-scraper which does full-page parsing."
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Optional. When set, the actor persists per-podcast snapshots to a named KV store and emits temporalSignals (firstSeenAt, runsSeen, changeFlag NEW/RECOVERED/DEGRADED/REFRESHED/UNCHANGED, isReturning, plus trendSignals for episode velocity and growth/decline signals) on every record. Set the same name across scheduled runs to track new shows + recovered-from-inactive shows + publishing-velocity drift automatically. Leave blank for stateless one-shot runs."
          },
          "seedPodcasts": {
            "title": "Seed podcasts",
            "maxItems": 20,
            "type": "array",
            "description": "Optional. List of podcast identifiers — Apple Podcast IDs (e.g. 1482738706), Apple Podcasts URLs, free-text titles. The actor resolves each seed via iTunes lookup, extracts the artist name + primary genre, and re-searches Apple Podcasts to surface neighbour shows. Hits are merged into the result set and tagged with discoverySource (seed-author / seed-category). Spotify show URLs/IDs require Spotify credentials AND are not yet supported as seeds — provide the Apple ID instead.",
            "items": {
              "type": "string"
            }
          },
          "seedExpansionMode": {
            "title": "Seed expansion mode",
            "enum": [
              "author",
              "category",
              "both"
            ],
            "type": "string",
            "description": "How to expand each seed podcast: author-neighbour (re-search by the seed's artist name — surfaces other shows by the same host/network), category-neighbour (re-search by the seed's primary genre — surfaces cohort-level neighbours), or both (default).",
            "default": "both"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}