{
  "openapi": "3.0.1",
  "info": {
    "title": "RSS Feed Checker: Dead Episodes & Stale Feeds",
    "description": "Directories point listeners at a podcast feed forever and never recheck it. Reports episodes whose audio answers 404, feeds that died or moved, and shows whose lastBuildDate is a year fresher than their newest episode - 14.2% of 300 sampled shows, all looking active to anything reading that date.",
    "version": "0.1",
    "x-build-id": "P1EvDXdDutaMYx5Md"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aiqlabs~rss-feed-checker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aiqlabs-rss-feed-checker",
        "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/aiqlabs~rss-feed-checker/runs": {
      "post": {
        "operationId": "runs-sync-aiqlabs-rss-feed-checker",
        "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/aiqlabs~rss-feed-checker/run-sync": {
      "post": {
        "operationId": "run-sync-aiqlabs-rss-feed-checker",
        "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": {
          "shows": {
            "title": "Shows",
            "type": "array",
            "description": "Apple Podcasts show ids or URLs, in whatever form you have them. Both 1200361736 and https://podcasts.apple.com/us/podcast/the-daily/id1200361736 work.",
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Apple charts",
            "type": "array",
            "description": "Audit the shows currently on these public Apple charts, for surveying rather than auditing a known list. Use top. Keyword search is deliberately not offered: itunes.apple.com/robots.txt names the search endpoint, and a chart is the better sample anyway.",
            "items": {
              "type": "string"
            }
          },
          "chartLimit": {
            "title": "Shows per chart",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many shows to take from each chart.",
            "default": 25
          },
          "sampleSize": {
            "title": "Random sample from the directory",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Draw this many shows from the sitemaps podcasts.apple.com advertises in its robots.txt. Use this to measure a slice of the directory rather than a list you already have. Leave at 0 to skip.",
            "default": 0
          },
          "country": {
            "title": "Storefront",
            "type": "string",
            "description": "Two-letter country code for the storefront the directory record is read from. A show can be listed in one storefront and absent from another.",
            "default": "us"
          },
          "episodesFromEachEnd": {
            "title": "Episodes to check from each end",
            "minimum": 0,
            "maximum": 25,
            "type": "integer",
            "description": "How many episodes to check the audio of, taken from the newest end and the oldest end of the feed. Newest is what a listener presses first; oldest is where rot appears years earlier. Set to 0 to skip audio entirely.",
            "default": 3
          },
          "checkOwnerAddress": {
            "title": "Check the owner address",
            "type": "boolean",
            "description": "Look at the domain behind the feed's owner email - the address Apple and Spotify send ownership verification to - and report whether it is registered and shaped to receive mail. Addresses at public mail providers are skipped. No mail server is ever contacted.",
            "default": true
          },
          "checkWebsite": {
            "title": "Check the show's website",
            "type": "boolean",
            "description": "Follow the site the feed links to and report where it ends up. One request per show.",
            "default": true
          },
          "dormantAfterDays": {
            "title": "Call a show dormant after (days)",
            "minimum": 30,
            "maximum": 7300,
            "type": "integer",
            "description": "How long without a new episode before it is worth noting. Default is 730 days. For context, 18.7% of a 300-show sample were past that, which is why this is a low-severity note rather than an alarm.",
            "default": 730
          },
          "veryDormantAfterDays": {
            "title": "And clearly finished after (days)",
            "minimum": 60,
            "maximum": 7300,
            "type": "integer",
            "description": "The point at which dormancy is reported at medium severity instead. Default is 1825 days (five years), which 5.8% of the same sample were past.",
            "default": 1825
          },
          "onlyIssues": {
            "title": "Only output shows with findings",
            "type": "boolean",
            "description": "Drop the rows that came back clean. Useful for a large sweep, though the clean rows are what tell you the run worked.",
            "default": false
          },
          "maxShows": {
            "title": "Maximum shows per run",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Upper bound on how many shows are audited in one run, applied after charts and samples are expanded.",
            "default": 200
          },
          "maxConcurrency": {
            "title": "Concurrent shows",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many shows to work on at once. Feeds and audio come from many different hosts, so this is gentle on each of them, but lower it if you are auditing many shows from one network.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "How long to wait for any single request before calling it unreachable.",
            "default": 30
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}