GitHub Issues & Pull Requests Scraper
Pricing
from $0.02 / 1,000 github issue or pull requests
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
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
8
Monthly active users
10 hours ago
Last modified
Categories
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
- Add a repository such as
microsoft/vscode. - Choose the state and whether to include issues, pull requests, or both.
- Start with a small
maxItemsvalue, 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:
- Track Apify SDK for JavaScript issues — Export open issues from
apify/apify-sdk-jsfor SDK support triage. - Track dependency update pull requests — Find open pull requests mentioning dependency updates.
- Track API rate limit problems — Research public issue reports mentioning API rate limits.
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 key | Default | Behavior |
|---|---|---|
Repositories / repositories | Form prefill: microsoft/vscode | Up to 100 public owner/name values or GitHub repository URLs. |
Search queries / searchQueries | Empty | Up to 100 GitHub issue-search queries; combined with repository searches. |
State / state | open | open, closed, or all. A contradictory state in a query fails; all adds no state filter and leaves any query state qualifier intact. |
Include issues / includeIssues | true | Save issue records. At least one include option must be enabled. |
Include pull requests / includePullRequests | true | Save pull request records. These options also filter returned records when a query specifies its own type. |
Maximum records / maxItems | 20 | Total saved-row limit across all sources, from 1 to 10,000. Each search can yield at most 1,000 matches. |
Labels / labels | Empty | Up to 50 label filters appended to searches. |
Updated since / since | Unset | A 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 / githubToken | Unset | Optional 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}
| Field | Meaning |
|---|---|
repository, number, type | Repository, record number, and issue or pull_request. |
title, bodyExcerpt | Title and whitespace-normalized body excerpt, limited to 1,000 characters; missing body is null. |
state, url, apiUrl | Open/closed state, public record URL and API record URL. |
authorLogin, authorProfileUrl | Author username and profile link when available. |
labels, assignees, milestone | Label names, assigned usernames and milestone title. |
commentsCount, reactions | Comment count and reaction counts, not comment text. Reactions include total, plusOne, minusOne, laugh, hooray, confused, heart, rocket and eyes. |
createdAt, updatedAt, closedAt, mergedAt | Available timestamps. mergedAt is populated only when supplied in the search response; it may be null even for a merged pull request. |
sourceQuery, sourceRepository, scrapedAt | Effective 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
maxItemsdoes not remove those limits. - Run summary: the
RUN_SUMMARYrecord in the default key-value store includessaved,queryCount,incompleteQueries,cappedQueriesand 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:
sincehelps 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 osfrom apify_client import ApifyClientclient = 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.
Related Actors
- GitHub Profile Scraper — Enrich public author profiles.
- GitHub Repositories Search Scraper — Discover repositories before collecting their issues.
- GitHub Trending Scraper — Find projects with current public interest.
- GitHub Contributor Email Scraper — Research publicly listed contributor contacts.
- Stack Exchange Questions Scraper — Explore adjacent public developer questions.
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. ♥