GitHub Issues, PRs, Discussions & Releases Exporter
Pricing
from $1.00 / 1,000 item exporteds
GitHub Issues, PRs, Discussions & Releases Exporter
Export issues, pull requests, discussions and releases from public GitHub repos as clean records or as Markdown wiki notes with YAML front matter. Optional comments, label/state/date filters, token support for higher rate limits. Pay per item.
Pricing
from $1.00 / 1,000 item exporteds
Rating
0.0
(0)
Developer
Vellum Kasane
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Export the knowledge locked in a GitHub repository's issues, pull requests, discussions and releases as clean, Markdown-ready records, through the official GitHub API. One record per item with title, state, author, labels, assignees, milestone, reactions, timestamps, the body as GitHub-flavoured Markdown, and (optionally) the comment thread. Choose the wiki-notes format and you additionally get one Markdown file per item with YAML front matter (type, title, status, updated, source_url), shaped like the source pages of an LLM wiki, plus an INDEX.md.
Built for:
- LLM wikis and agent memory: feed a "decisions behind the codebase" wiki (Obsidian, Claude Code, Karpathy-style LLM wiki) with the discussions and issues where the decisions were actually made. The notes drop straight into a
raw/orsources/folder. - RAG over a project's history: bodies and comments are Markdown already; no HTML cleaning.
- Release notes and changelog pipelines: releases with tag, prerelease flag, assets and body.
- Support and community analytics: label, reaction and comment counts per issue across many repositories.
- AI agents and MCP clients that need "what did people say about X in repo Y" (call it from the Apify MCP server, read the dataset).
How it works
- List the repositories (
owner/nameorhttps://github.com/owner/name). - Pick what to export: issues, pull requests, discussions, releases. Filter by state, labels and "updated in the last N days"; cap with
maxItems(per repository and type). - The Actor pages through the GitHub REST API (
/issues,/pulls,/releases, comments) - and the GraphQL Discussions API when you provide a token - and writes one record per item. - In
wiki-notesformat each record is also written to the key-value store asnote-<owner>--<repo>--<type>-<number>.md, andINDEX.mdlists them all.
Without a token GitHub allows 60 requests per hour per IP address; with a personal access token (no scopes needed for public repositories) 5,000 per hour. Each list page (100 items) is one request; each item with comments costs one more request. The Actor reads the x-ratelimit-* headers, tells you in the log how many requests remain and when the window resets, and when the limit is hit it stops with the items exported so far (remaining items are still exported without comments) instead of failing. Turn on waitForRateLimitReset to sleep until the window resets and continue.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
repos | string[] | required | owner/name or GitHub URLs. Private repositories are not supported. |
types | string[] | all four | Any of issues, pulls, discussions, releases. |
state | string | all | all, open, closed (issues, PRs, discussions). |
labels | string[] | [] | Items must carry all listed labels. |
sinceDays | integer | 0 | Only items updated (releases: published) in the last N days. 0 = no limit. |
maxItems | integer | 200 | Cap per repository and per type. |
includeComments | boolean | true | Fetch comments (issues, PRs, discussions). |
maxCommentsPerItem | integer | 50 | Up to 100, oldest first. |
githubToken | secret string | - | Personal access token; raises the limit to 5,000 requests/hour and enables the GraphQL Discussions API. |
waitForRateLimitReset | boolean | false | Sleep until the rate-limit window resets (max 60 min) instead of stopping with partial results. |
outputFormat | string | records | records or wiki-notes (records + one .md per item + INDEX.md). |
Example input:
{"repos": ["apify/apify-sdk-js", "apify/crawlee"],"types": ["issues", "discussions", "releases"],"state": "closed","labels": ["bug"],"sinceDays": 90,"maxItems": 100,"includeComments": true,"maxCommentsPerItem": 30,"githubToken": "github_pat_...","outputFormat": "wiki-notes"}
Output
One dataset item per issue, pull request, discussion or release (download as JSON, CSV, Excel or HTML):
{"repo": "apify/apify-sdk-js","type": "issue","number": 566,"id": 3123456789,"title": "Actor.pushData charges twice when eventName is set and the dataset is full","state": "closed","state_reason": "completed","author": "someuser","author_association": "NONE","labels": ["bug", "t-tooling"],"assignees": ["B4nan"],"milestone": null,"category": null,"answered": null,"draft": null,"merged_at": null,"base_ref": null,"head_ref": null,"tag_name": null,"prerelease": null,"assets": [],"created_at": "2026-06-02T09:11:40Z","updated_at": "2026-06-05T12:40:03Z","closed_at": "2026-06-05T12:40:03Z","published_at": null,"url": "https://github.com/apify/apify-sdk-js/issues/566","body_markdown": "### Which package is this bug report for?\n\napify\n\n### Issue description\n\nWhen `Actor.pushData(item, 'my-event')` ...","reactions": {"total": 2,"plus_one": 2,"minus_one": 0,"laugh": 0,"hooray": 0,"confused": 0,"heart": 0,"rocket": 0,"eyes": 0},"comments_count": 3,"comments": [{"id": 2987654321,"author": "B4nan","author_association": "MEMBER","created_at": "2026-06-02T10:02:11Z","updated_at": "2026-06-02T10:02:11Z","url": "https://github.com/apify/apify-sdk-js/issues/566#issuecomment-2987654321","body_markdown": "Thanks, reproduced. The charge happens in ...","reactions": {"total": 0,"plus_one": 0,"minus_one": 0,"laugh": 0,"hooray": 0,"confused": 0,"heart": 0,"rocket": 0,"eyes": 0},"is_answer": null,"replies_count": null}],"comments_truncated": false,"markdown_file_key": "note-apify--apify-sdk-js--issue-566.md","exported_at": "2026-09-22T15:08:01.412Z"}
| Field | Meaning |
|---|---|
type | issue, pull, discussion, release. |
state | issue: open / closed; pull: open / draft / merged / closed; discussion: open / closed; release: published / prerelease. |
state_reason | GitHub's reason (completed, not_planned, reopened, duplicate, resolved, outdated) when present. |
category, answered | Discussions only: category name and whether an answer was chosen. Discussion comments carry is_answer and replies_count. |
draft, merged_at, base_ref, head_ref | Pull requests only. |
tag_name, prerelease, assets, published_at | Releases only. Assets: { name, size, download_count, url }. |
comments_count / comments / comments_truncated | Total on GitHub, the stored comments (up to maxCommentsPerItem), and whether more exist (cap or rate limit). For pull requests the total is known when the PR appeared in the most recent issues pages; otherwise comments are fetched directly. |
body_markdown | Exactly what the author wrote (GitHub-flavoured Markdown), no conversion needed. |
wiki-notes format
Every record is also stored as a Markdown file, for example note-apify--apify-sdk-js--issue-566.md:
---type: 'source'title: 'Actor.pushData charges twice when eventName is set and the dataset is full'status: 'closed'updated: '2026-06-05'source_url: 'https://github.com/apify/apify-sdk-js/issues/566'source_kind: 'github-issue'repo: 'apify/apify-sdk-js'number: 566author: 'someuser'labels: ['bug', 't-tooling']created: '2026-06-02'closed: '2026-06-05'exported: '2026-09-22T15:08:01.412Z'---# Actor.pushData charges twice when eventName is set and the dataset is full**Source:** https://github.com/apify/apify-sdk-js/issues/566 · **Repo:** apify/apify-sdk-js · **Kind:** issue #566 · **State:** closed (completed) · **Author:** someuser · **Labels:** bug, t-tooling · **Created:** 2026-06-02 · **Updated:** 2026-06-05 · **Closed:** 2026-06-05 · **Reactions:** 2## Body### Which package is this bug report for?...## Comments (3)### B4nan — 2026-06-02Thanks, reproduced. The charge happens in ...Source: https://github.com/apify/apify-sdk-js/issues/566#issuecomment-2987654321
The front matter keys type: source, title, status, updated and source_url follow the LLM-wiki source-page convention, so an agent can ingest the notes into wiki/sources/ and cite them from decision pages. INDEX.md groups all notes by repository and type with one line per note (link, state, last update, GitHub URL). SUMMARY.json holds per-repository counts, the discussions source used (graphql or rest), the number of API requests made and the rate-limit state at the end.
Pricing
This Actor uses pay-per-event pricing:
| Event | Price | When |
|---|---|---|
item-exported | $0.001 per item ($1 per 1,000) | Once per issue, pull request, discussion or release written to the dataset. |
comment-exported | $0.0002 per comment ($0.20 per 1,000) | Once per comment stored on a record. Comments are only fetched when they can still be billed within your budget. |
| Actor start | $0.005 per run | Apify's standard start event; covers the first seconds of compute. |
Exporting 500 issues with on average 4 comments each costs $0.50 + $0.40 = about $0.90. Set Max total charge per run to hard-cap spend; the Actor stops gracefully before exceeding it.
Data sources and limits
| Data | Endpoint | Documentation |
|---|---|---|
| Issues | GET /repos/{owner}/{repo}/issues (state, labels, since, sort=updated); pull requests returned by this endpoint are skipped | https://docs.github.com/en/rest/issues/issues |
| Pull requests | GET /repos/{owner}/{repo}/pulls (state, sort=updated); comment counts and reactions are taken from the issues listing when available | https://docs.github.com/en/rest/pulls/pulls |
| Issue / PR comments | GET /repos/{owner}/{repo}/issues/{number}/comments | https://docs.github.com/en/rest/issues/comments |
| Releases | GET /repos/{owner}/{repo}/releases (drafts skipped) | https://docs.github.com/en/rest/releases/releases |
| Discussions (with token) | GraphQL repository.discussions ordered by UPDATED_AT, comments inline | https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions |
| Discussions (no token) | GET /repos/{owner}/{repo}/discussions and .../discussions/{number}/comments | Responds live (verified 2026-09-22) but is not part of GitHub's published REST API description (https://github.com/github/rest-api-description); GitHub documents Discussions for GraphQL only, and GraphQL is unavailable without a token (0 requests/hour). The Actor logs a warning when it uses this path. |
| Rate limits | x-ratelimit-* headers, retry-after | https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api |
Limits:
- Public repositories only (the token is used for rate limits, not for private access).
- The unauthenticated quota is shared by every process behind the same IP address. On the Apify platform that can include other Actors, so the sample run may see a smaller quota than 60; add a token for anything beyond a quick look.
sinceDaysusesupdated_atfor issues, PRs and discussions andpublished_atfor releases. Pull-request and discussion listings are ordered by update time and stop at the first older item.- Comment threads are capped at 100 per item (one page). Review comments on PR diffs are not exported, only the conversation comments.
- Reactions on discussions are exported in both modes; discussion
state_reasonandclosed_atare only available through GraphQL.
Tips
- Feed an LLM wiki:
outputFormat: "wiki-notes",types: ["issues", "discussions"],state: "closed",sinceDays: 30, schedule weekly, then download thenote-*.mdfiles from the key-value store intoraw/and let the wiki agent ingest them. - Only the decisions: use
labels: ["decision"](oradr,rfc) if the project labels them. - Big repositories: set
maxItemsandsinceDaysfirst; an unauthenticated run on a repository with thousands of issues stops at the rate limit with partial results. - Token: create a fine-grained PAT with no repository access (public data only). It is stored encrypted on Apify and never written to the dataset or logs.
Verified
Local run on 2026-09-22 with apify run --purge (Apify CLI 1.10.0, Apify SDK 3.7.2, Node 24), prefill input (apify/apify-sdk-js, types: issues, pulls, releases, maxItems: 20, includeComments: false, outputFormat: wiki-notes), unauthenticated:
- 60 items exported (20 issues, 20 pull requests, 20 releases), 60
note-*.mdfiles +INDEX.md+SUMMARY.jsonwritten; 4 counted API requests (issues page, pulls page, releases page, plus the free/rate_limitcheck), runtime about 5 seconds. Every pull request had its comment count and reactions resolved from the issues listing (no extra requests). - Comments and discussions checked with
types: ["issues", "discussions"], maxItems: 4, includeComments: true, maxCommentsPerItem: 3(still unauthenticated): 4 issues + 1 discussion exported, 4 comments stored (1 issue comment, 3 discussion comments from the REST discussions endpoint,discussionsSource: "rest"inSUMMARY.json, warning logged as documented), 5 requests. Notes spot-checked: front matter, meta line, body, comment sections with source links. - Pay-per-event path tested with
ACTOR_TEST_PAY_PER_EVENT=1(local test price $1 per event): withACTOR_MAX_TOTAL_CHARGE_USD=6the run charged 5item-exported+ 1comment-exportedand stopped with "Run budget reached"; with a $4 cap it charged 4 items + 0 comments. Charges never exceeded the cap; comments that no longer fit the budget stay stored but unbilled. - The GraphQL discussions path (used when
githubTokenis set) is covered by unit tests against a fixture only; it was not run live because this verification used no credentials. - Unit tests:
npm test(19 tests: repository parsing, all normalisers on real API fixtures, wiki notes and index rendering, rate-limit header parsing, 403/429 handling,retry-after, wait-for-reset, pagination, GraphQL rate-limit mapping).
Support
Open an issue on the Actor's Issues tab. Issues are answered within one business day; bug fixes ship as new builds without changing the input schema.
Made by Vellum Labs.