GitHub Issues & Pull Requests Scraper avatar

GitHub Issues & Pull Requests Scraper

Pricing

from $0.02 / 1,000 github issue or pull requests

Go to Apify Store
GitHub Issues & Pull Requests Scraper

GitHub Issues & Pull Requests Scraper

Export public GitHub issues and pull requests from repositories or search queries, with body excerpts, labels, authors, comment counts and timestamps.

Pricing

from $0.02 / 1,000 github issue or pull requests

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

8

Monthly active users

10 hours ago

Last modified

Share

Extract public GitHub issues and pull requests from repository names, repository URLs, or GitHub search queries. Export titles, body excerpts, labels, authors, comment counts, reactions and timestamps to CSV, Excel or JSON for support triage, product research and engineering analysis.

This GitHub issues and pull requests scraper collects public metadata, not full comment threads or code-review discussions. Small searches work without a GitHub token; GitHub rate limits and its 1,000-match limit per search still apply.

Quick start

  1. Add a repository such as microsoft/vscode.
  2. Choose the state and whether to include issues, pull requests, or both.
  3. Start with a small maxItems value, then export the dataset.
{
"repositories": ["microsoft/vscode"],
"state": "open",
"includeIssues": true,
"includePullRequests": false,
"maxItems": 20
}

Repository inputs are processed first, followed by search queries, until the shared row limit is reached. Results within each search are requested by most recently updated first; the combined dataset is not globally sorted across sources. Duplicate issue URLs are saved only once within the run.

Apify platform walkthrough: set up and run an Actor. The example uses a different Actor.

Ready-to-run examples

Choose an existing public example with a small, preconfigured input:

What can you do with the data?

  • Support and DevRel: group recurring bugs, questions and feature requests from public repositories.
  • Product research: compare requested features and integration problems across projects.
  • Engineering analysis: review recent issue and pull request activity with your own reporting tools.
  • AI workflows: classify titles and excerpts or build a searchable public issue dataset. Analysis is performed by your downstream tools, not by this Actor.

Input settings

Use repository inputs, search queries, or both. Neither list is globally required: if both resolve to empty lists, the Actor uses microsoft/vscode. Clear the form's repository prefill if you want a query-only run.

Setting / JSON keyDefaultBehavior
Repositories / repositoriesForm prefill: microsoft/vscodeUp to 100 public owner/name values or GitHub repository URLs.
Search queries / searchQueriesEmptyUp to 100 GitHub issue-search queries; combined with repository searches.
State / stateopenopen, closed, or all. A contradictory state in a query fails; all adds no state filter and leaves any query state qualifier intact.
Include issues / includeIssuestrueSave issue records. At least one include option must be enabled.
Include pull requests / includePullRequeststrueSave pull request records. These options also filter returned records when a query specifies its own type.
Maximum records / maxItems20Total saved-row limit across all sources, from 1 to 10,000. Each search can yield at most 1,000 matches.
Labels / labelsEmptyUp to 50 label filters appended to searches.
Updated since / sinceUnsetA date or ISO timestamp converted to a UTC calendar date. Adds an inclusive updated-date filter only if the query contains neither updated: nor created:.
GitHub token / githubTokenUnsetOptional secret token for higher API rate limits. Use it only for public-data searches; do not post tokens in support requests.

Example inputs

For a query-only search of public bug reports:

{
"repositories": [],
"searchQueries": ["repo:facebook/react is:issue label:bug"],
"state": "open",
"includeIssues": true,
"includePullRequests": false,
"maxItems": 20
}

For closed pull requests across two repositories:

{
"repositories": ["nodejs/node", "apify/apify-sdk-js"],
"state": "closed",
"includeIssues": false,
"includePullRequests": true,
"maxItems": 20
}

Input-field help describes filter interactions in more detail. A narrower query is usually more useful than a large result limit.

Output fields

Each row represents one public issue or pull request. The following is an illustrative field shape, not a record from a real run:

{
"repository": "owner/repository",
"type": "issue",
"number": 1,
"title": "Illustrative issue title",
"bodyExcerpt": null,
"state": "open",
"url": "https://github.com/owner/repository/issues/1",
"authorLogin": null,
"labels": [],
"commentsCount": 0,
"mergedAt": null
}
FieldMeaning
repository, number, typeRepository, record number, and issue or pull_request.
title, bodyExcerptTitle and whitespace-normalized body excerpt, limited to 1,000 characters; missing body is null.
state, url, apiUrlOpen/closed state, public record URL and API record URL.
authorLogin, authorProfileUrlAuthor username and profile link when available.
labels, assignees, milestoneLabel names, assigned usernames and milestone title.
commentsCount, reactionsComment count and reaction counts, not comment text. Reactions include total, plusOne, minusOne, laugh, hooray, confused, heart, rocket and eyes.
createdAt, updatedAt, closedAt, mergedAtAvailable timestamps. mergedAt is populated only when supplied in the search response; it may be null even for a merged pull request.
sourceQuery, sourceRepository, scrapedAtEffective search, originating repository input (null for raw searches), and collection timestamp.

Unavailable optional values remain null or empty arrays. Use url to read the full thread on GitHub.

Pricing and limits

This Actor uses pay-per-event pricing: start is a one-time run charge, and item is charged for each public GitHub issue or pull request saved to the dataset. The start charge can apply even if the search finds no records or a later request fails. There are no separate paid error/status dataset rows.

See the live Pricing tab for current rates and applicable discounts. Keep maxItems small and use specific repositories or queries to bound the result count.

  • Public scope: this product is for public repositories. Do not rely on a token to turn it into a private-repository exporter.
  • Search completeness: GitHub limits each search to 1,000 matches and can report incomplete results. A large maxItems does not remove those limits.
  • Run summary: the RUN_SUMMARY record in the default key-value store includes saved, queryCount, incompleteQueries, cappedQueries and completion status. A cap flag indicates a possibly capped search, not a promise of exhaustive coverage.
  • Partial results: runs can preserve saved records when they stop near their time limit. Review run status and the summary; an error after earlier sources can leave useful rows but still fail the run.
  • No matches: a completed valid search can succeed with an empty dataset. Invalid queries, authentication/rate-limit errors and unexpected responses are not evidence of no matches.
  • Rate limits: unauthenticated GitHub requests have lower limits. Wait for reset, narrow the search, or supply the optional token. Persistent rate-limit responses fail with guidance.
  • Repeated exports: since helps narrow later searches but is not a cross-run deduplication or notification service.

API usage

Use fetch_cat/github-issues-pull-requests-scraper with the Apify API. These examples run a bounded search and retrieve its dataset.

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/github-issues-pull-requests-scraper').call({
repositories: ['microsoft/vscode'],
state: 'open',
maxItems: 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/github-issues-pull-requests-scraper').call(run_input={
'repositories': ['microsoft/vscode'],
'state': 'open',
'maxItems': 20,
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item)

cURL

curl -X POST \
'https://api.apify.com/v2/acts/fetch_cat~github-issues-pull-requests-scraper/run-sync-get-dataset-items' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"repositories":["microsoft/vscode"],"state":"open","maxItems":20}'

For longer jobs, start an asynchronous run and read the dataset after it finishes. Keep API tokens in environment variables or your secret manager.

MCP and AI agents

Use the official Apify MCP server, not a separate server operated by this Actor. The general hosted server can discover and run Actors; a focused server URL exposes this Actor:

https://mcp.apify.com/?tools=fetch_cat/github-issues-pull-requests-scraper

For clients using an MCP bridge:

{
"mcpServers": {
"apify-github-issues": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.apify.com/?tools=fetch_cat/github-issues-pull-requests-scraper"]
}
}
}

Follow the official setup guide for authentication. Ask an agent: “Collect up to 20 open issues from microsoft/vscode, read the saved dataset, and group titles by topic. Include the source URLs.” The Actor returns records; summarization or sending messages requires your agent's other tools.

FAQ

Can I export GitHub issues and pull requests without a token?

Yes, for small public searches within GitHub's unauthenticated rate limits. A token is optional and does not guarantee unlimited requests.

Does this return full comments or review discussions?

No. It returns body excerpts, comment counts and reaction counts. It does not fetch comment threads, diffs or review discussions.

Why are my results empty or fewer than expected?

Check the query in GitHub search, the state, both include options, labels and date filters. Search caps, inaccessible targets or incomplete GitHub results can reduce coverage. Inaccessibility alone does not establish whether a repository is private or deleted.

Can I monitor changes or export to a spreadsheet?

Export datasets as CSV, Excel or JSON, or connect them to your own workflow. Repeated monitoring requires an independently configured Apify schedule or integration; the Actor itself does not send alerts or remember all prior exports.

Is this an official GitHub API or a replacement for full GitHub access?

No. It is an independent public-metadata export tool built around GitHub search. Use GitHub's own tools or APIs for private data, full discussions or capabilities outside this contract.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run ID, a non-sensitive input example and what you expected.

Made with care for curious people, AI agents and the possibilities in data. ♥