{
  "openapi": "3.0.1",
  "info": {
    "title": "Medium Article Scraper",
    "description": "Scrape full Medium article content past the paywall — title, subtitle, authors, publish and updated dates, reading time, cover image, table of contents, and the complete body as HTML, Markdown, and plain text. Accepts article URLs, author profiles, or publications. No login needed.",
    "version": "0.0",
    "x-build-id": "Ez6WZU7E7tlz3goka"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~medium-article-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-medium-article-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/memo23~medium-article-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-medium-article-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/memo23~medium-article-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-medium-article-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": {
          "startUrls": {
            "title": "Article URLs (or any Medium link)",
            "type": "array",
            "description": "Medium links to scrape. Each entry can be a URL string or a request-list object { \"url\": \"...\" }. Article URLs (medium.com/@user/slug-id, username.medium.com/slug-id, or a custom-domain post) come back in full, member-only posts included. A tag page, author profile, publication home, search page, or RSS feed URL is routed to that source: medium.com/tag/technology, medium.com/feed/tag/technology, medium.com/feed/@user, medium.com/@user/feed, medium.com/feed/publication, publication/feed, username.medium.com/feed, and a custom domain's /feed."
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keyword searches run through Medium's own search (e.g. `rust async`). Up to `maxArticlesPerSource` articles per query. Medium's search serves only ~1,000 results per query, so for more the actor repeats the query over publish-date windows (newest first) and merges them: \"python\" gave 2,500 unique articles in testing. A pasted medium.com/search?q=... link in Article URLs works too.",
            "items": {
              "type": "string"
            }
          },
          "authorProfiles": {
            "title": "Author profiles",
            "type": "array",
            "description": "Medium author profiles to enumerate. Accepts `@username`, `https://medium.com/@username`, or `username.medium.com`. The actor pages through the author's full post history, newest first, up to `maxArticlesPerSource`.",
            "items": {
              "type": "string"
            }
          },
          "publications": {
            "title": "Publications",
            "type": "array",
            "description": "Medium publications to enumerate. Accepts a slug (`data-science-collective`), `https://medium.com/data-science-collective`, the feed URL, or a custom-domain publication's home page (`levelup.gitconnected.com`). The actor pages through the publication's archive, newest first, up to `maxArticlesPerSource`.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Medium tags to enumerate, newest posts first. Accepts a slug (`machine-learning`), a name (`Machine Learning`), or a `https://medium.com/tag/machine-learning` URL. Up to `maxArticlesPerSource` articles per tag.",
            "items": {
              "type": "string"
            }
          },
          "tagSort": {
            "title": "Tag feed order",
            "enum": [
              "NEWEST",
              "OLDEST",
              "MOST_READ"
            ],
            "type": "string",
            "description": "Order of the posts taken from each tag: newest first, oldest first, or Medium's most-read ranking. The most-read list is short (about 15 to 20 posts per tag, or per month when a date range is set).",
            "default": "NEWEST"
          },
          "publishedAfter": {
            "title": "Published on or after",
            "type": "string",
            "description": "Only list articles first published on or after this date (YYYY-MM-DD). Applies to search queries, tags, authors and publications, not to article URLs. Searches use it server-side, so a narrow window returns results from that period."
          },
          "publishedBefore": {
            "title": "Published on or before",
            "type": "string",
            "description": "Only list articles first published on or before this date (YYYY-MM-DD, inclusive). Same scope as `publishedAfter`."
          },
          "outputFormat": {
            "title": "Body format",
            "enum": [
              "all",
              "markdown",
              "text"
            ],
            "type": "string",
            "description": "Which body representations to emit per article. `all` = html + markdown + text (largest, most flexible). `markdown` = markdown only. `text` = plain text only (smallest).",
            "default": "all"
          },
          "includeTableOfContents": {
            "title": "Include table of contents",
            "type": "boolean",
            "description": "Attach the parsed table of contents array to each row.",
            "default": true
          },
          "maxResponsesPerArticle": {
            "title": "Responses per article",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Attach up to this many responses (Medium comments) to each article as a `responses` array with author, claps, date and text. 0 = none (faster). Each 25 responses cost one extra request per article.",
            "default": 0
          },
          "maxItems": {
            "title": "Max articles",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum articles to scrape across all sources. Leave empty for 100. If this field is empty and the input sets maxArticles, that number is used."
          },
          "maxArticles": {
            "title": "Max articles (alias)",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Same cap as Max articles, under the field name other Medium scrapers use. Applied only when Max articles is left empty."
          },
          "maxArticlesPerSource": {
            "title": "Max articles per source",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on articles taken from any one author, publication, tag or search query. `maxItems` still caps the whole run.",
            "default": 50
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Concurrent article fetches against the Freedium mirror.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for each Medium, RSS, and paywall-mirror request. Leave empty for the built-in limits: 30 seconds for Medium and RSS, 60 seconds for the mirror."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional proxy for the Medium RSS and Freedium requests. Freedium is CDN-served and accepts datacenter IPs, so a proxy is usually unnecessary."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}