{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk Article Extractor: Full Text from a CSV, Sheet or Dataset",
    "description": "Returns full text, title, author, date, publisher, image and tags for every article linked in an Apify dataset, CSV, Excel or Google Sheet, keeping your columns. Inputs: datasetId, fileUrl or articleUrls. $0.002 per article extracted; blocked or failed links free. Agent-ready via x402 and MCP.",
    "version": "0.1",
    "x-build-id": "0mONpdaZ5mD5AvY5k"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nerolabs~bulk-article-extractor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nerolabs-bulk-article-extractor",
        "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/nerolabs~bulk-article-extractor/runs": {
      "post": {
        "operationId": "runs-sync-nerolabs-bulk-article-extractor",
        "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/nerolabs~bulk-article-extractor/run-sync": {
      "post": {
        "operationId": "run-sync-nerolabs-bulk-article-extractor",
        "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": {
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "An Apify dataset with one row per article link, for example the output of a Google News, RSS or search scraper. Every original column is kept and the article text, author, date and metadata are added alongside. Use the picker rather than typing an ID."
          },
          "fileUrl": {
            "title": "File or Google Sheet URL",
            "type": "string",
            "description": "A public link to a CSV, TSV, Excel, JSON or JSON Lines file with one row per article link. A normal Google Sheets link works: share it as 'Anyone with the link can view'. Used when no dataset is given."
          },
          "fileFormat": {
            "title": "File format",
            "enum": [
              "auto",
              "csv",
              "tsv",
              "json",
              "jsonl",
              "xlsx"
            ],
            "type": "string",
            "description": "Leave on 'Detect automatically' unless the link has no file extension and the server reports the wrong content type.",
            "default": "auto"
          },
          "sheetName": {
            "title": "Excel sheet name",
            "type": "string",
            "description": "Which sheet to read from an Excel workbook. Defaults to the first sheet."
          },
          "articleUrls": {
            "title": "Article URLs",
            "type": "array",
            "description": "A plain list of article links for a quick run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns next to the results.",
            "items": {
              "type": "string"
            }
          },
          "data": {
            "title": "Rows",
            "type": "array",
            "description": "Rows as inline JSON, an alternative to a dataset or file. Each object needs a field holding the article link."
          },
          "urlField": {
            "title": "Article URL field",
            "type": "string",
            "description": "The column holding the article link. Left empty it is detected automatically, preferring columns named url, link or articleUrl that hold links with a real path over a column of publisher homepages."
          },
          "textFormat": {
            "title": "Text output",
            "enum": [
              "plain",
              "markdown",
              "html",
              "none"
            ],
            "type": "string",
            "description": "'Plain text' returns the story with paragraph breaks. 'Markdown' adds a markdown column with headings, lists and links kept, the friendliest shape for an LLM or RAG pipeline. 'HTML' adds the cleaned article HTML. 'None' returns metadata only (title, author, date, image, word count).",
            "default": "plain"
          },
          "minWords": {
            "title": "Minimum words to count as an article",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Pages with less article text than this are marked 'too_short' and not charged: video pages, galleries, paywall stubs and app shells. Lower it for very short news briefs.",
            "default": 50
          },
          "maxCharsPerArticle": {
            "title": "Character limit per article",
            "minimum": 500,
            "maximum": 1000000,
            "type": "integer",
            "description": "Cuts the returned text at this many characters so one enormous page cannot produce an unusable row. The row records whether it was cut.",
            "default": 100000
          },
          "keep": {
            "title": "Which rows to keep",
            "enum": [
              "all",
              "extracted",
              "problems"
            ],
            "type": "string",
            "description": "Filtering happens after each link is read. 'Only problems' is the quick way to find dead or blocked links in a large list.",
            "default": "all"
          },
          "keepOriginalFields": {
            "title": "Keep my original columns",
            "type": "boolean",
            "description": "Keep every column from the input row next to the extracted fields, so results line up with your own data. Turn off for article fields only.",
            "default": true
          },
          "onlyNewUrls": {
            "title": "Only new links (skip ones already extracted)",
            "type": "boolean",
            "description": "Remember every link extracted under the name below and skip it on later runs, not charged and not written to the results again (the summary counts them). Made for daily news monitoring: feed the same growing scraper output in every day and pay only for new stories.",
            "default": false
          },
          "stateName": {
            "title": "Memory name for 'only new links'",
            "type": "string",
            "description": "Separate monitors keep separate memories. Use one name per feed or project, for example 'competitor-blogs'. Letters, numbers and dashes.",
            "default": "default"
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages a site's robots.txt asks automated tools not to read (marked 'robots_disallowed', not charged). Rules aimed only at other bots, such as AI crawlers, do not apply. Turn off only for sites you have permission to read.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Off by default and usually not needed. Some sites block by address or by country; Apify residential proxy can help there and adds $0.01 per article that comes back. It does not get past blocks that check the browser itself.",
            "default": {
              "useApifyProxy": false
            }
          },
          "concurrency": {
            "title": "Links at a time",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many links to read in parallel. Never more than two at a time go to any one site, whatever this is set to.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Page timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for one page before giving up. A timed-out page is never charged.",
            "default": 30
          },
          "maxPageMb": {
            "title": "Largest page",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Pages bigger than this are skipped and not charged.",
            "default": 10
          },
          "maxItems": {
            "title": "Maximum links",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "A hard ceiling on how many rows are read from the input, as a safety net on a large dataset."
          },
          "exportFormats": {
            "title": "Export files",
            "type": "array",
            "description": "Also write the results as a downloadable CSV or Excel file, linked from the run's output. $0.01 per file, charged only when the run extracted at least one article. Excel cells are cut at 32,000 characters; the dataset and CSV keep the full text.",
            "items": {
              "type": "string",
              "enum": [
                "csv",
                "xlsx"
              ],
              "enumTitles": [
                "CSV",
                "Excel (xlsx)"
              ]
            },
            "default": []
          },
          "outputDatasetName": {
            "title": "Append to named dataset",
            "type": "string",
            "description": "Also append every kept row to a named dataset that persists across runs, building one growing article archive. Not charged again."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POST the run summary to this URL when the run finishes, for Slack, Zapier, Make, n8n or your own API. Charged only on a confirmed 2xx response."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}