{
  "openapi": "3.0.1",
  "info": {
    "title": "Medium Scraper — Articles, Full Text, Authors, Claps & Comments",
    "description": "Scrape Medium by tag, search, author, publication or URL: posts with claps, responses, reading time, tags, author and publication stats, plus optional full article text as Markdown and comments. Whole tag archives, thousands of posts per run, no login. Not affiliated with Medium.",
    "version": "1.0",
    "x-build-id": "vN5pBM1ZY58AOpcin"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/logiover~medium-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-logiover-medium-scraper",
        "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/logiover~medium-scraper/runs": {
      "post": {
        "operationId": "runs-sync-logiover-medium-scraper",
        "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/logiover~medium-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-logiover-medium-scraper",
        "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": {
          "tags": {
            "title": "Tags (topics)",
            "type": "array",
            "description": "Medium tags as slugs, names or URLs: \"artificial-intelligence\", \"Machine Learning\", \"https://medium.com/tag/python\". The newest-first archive covers the tag's whole history, so one tag can give thousands of posts.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tagSort": {
            "title": "Tag posts",
            "enum": [
              "newest",
              "trending",
              "top-week",
              "top-month",
              "top-year",
              "top-all-time",
              "all-top"
            ],
            "type": "string",
            "description": "Which posts to read for each tag. \"Newest first\" walks the complete tag archive back in time; the ranked lists are Medium's own trending/top selections (about 100 posts each).",
            "default": "newest"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Medium search, one query per line, e.g. \"rust async\", \"product-led growth\". Up to ~1,000 results per query.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchType": {
            "title": "Search for",
            "enum": [
              "posts",
              "people",
              "publications",
              "tags"
            ],
            "type": "string",
            "description": "What the search queries look for. People, publications and tags come back as profile rows (followers, bio, description …).",
            "default": "posts"
          },
          "authors": {
            "title": "Authors",
            "type": "array",
            "description": "Writers as @username, username or profile URL (https://medium.com/@ev, https://name.medium.com). Returns the profile and every story, newest first.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "publications": {
            "title": "Publications",
            "type": "array",
            "description": "Publications as slug, URL or custom domain: \"better-programming\", \"https://medium.com/swlh\", \"levelup.gitconnected.com\". Returns the publication and all its stories, newest first.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Medium URLs",
            "type": "array",
            "description": "Any Medium URL — a story (also on custom domains), a tag page, a profile, a publication or a search page (medium.com/search?q=…). Each is detected automatically. Story IDs (12 hex characters) work too.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many rows in total (posts + responses + profile rows). 0 = no limit.",
            "default": 1000
          },
          "maxPostsPerSource": {
            "title": "Max posts per tag / author / publication / query",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Cap for each single tag, author, publication or search query, so one big source cannot use up the whole run. 0 = no per-source cap.",
            "default": 0
          },
          "publishedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Only posts published on or after this date: 2025-01-01, 2025-01-01T12:00:00Z, or relative like \"30 days\" / \"6 months\". Chronological sources stop reading at this date."
          },
          "publishedBefore": {
            "title": "Published before",
            "type": "string",
            "description": "Only posts published before this date (same formats). Chronological sources start reading here, so a past date range is cheap."
          },
          "minClaps": {
            "title": "Minimum claps",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Skip posts with fewer claps. 0 = keep all.",
            "default": 0
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Keep only posts in these languages (ISO codes, comma-separated): \"en\" or \"en, es, pt\". Empty = all languages."
          },
          "skipMemberOnly": {
            "title": "Skip member-only stories",
            "type": "boolean",
            "description": "Leave out stories behind the Medium paywall — useful when you need complete article text (e.g. for AI/RAG datasets).",
            "default": false
          },
          "includeContent": {
            "title": "Include full article text",
            "type": "boolean",
            "description": "Add the article body as plain text and Markdown (headings, lists, code blocks, links, images). Free stories come complete; member-only stories return the public preview. Same number of requests — the text rides along with each page.",
            "default": false
          },
          "includeResponses": {
            "title": "Include responses (comments)",
            "type": "boolean",
            "description": "Add the responses of every collected post as separate rows (rowType = response) with full text, author, claps and reply count.",
            "default": false
          },
          "maxResponsesPerPost": {
            "title": "Max responses per post",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Responses (and replies) to collect per post, best first. 0 = all.",
            "default": 50
          },
          "includeReplies": {
            "title": "Include replies to responses",
            "type": "boolean",
            "description": "Also follow the reply threads under each response (depth 2, 3 …), within the per-post limit.",
            "default": false
          },
          "includeProfiles": {
            "title": "Add a profile row per tag / author / publication",
            "type": "boolean",
            "description": "One extra row for every tag, author and publication you list: followers, bio, description, post count, editors and more.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Requests in flight at once. The default is fast and safe; lower it only if you see many retries.",
            "default": 20
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave the default (Apify Proxy, no group selected) for the fastest runs: the Actor talks to Medium directly and switches to Apify Proxy by itself if Medium starts refusing. Pick a proxy group or your own proxies to send every request through them; \"No proxy\" means direct only.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}