GitHub Issues, PRs, Discussions & Releases Exporter
Pricing
from $1.00 / 1,000 item exporteds
GitHub Issues, PRs, Discussions & Releases Exporter
Export or monitor issues, pull requests, discussions and releases from public GitHub repos as clean records or Markdown notes. Watch mode returns only new and updated items since the last run, with only new comments. Label/state/date filters, token support. 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
8 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.
Watch mode (stateKey): schedule it daily and each run returns and bills only the issues, PRs, discussions and releases that are new or changed since the previous run, with only the new comments. A GitHub issue monitor / repository activity feed for a few cents a day.
Built for:
-
Monitoring repositories on a schedule: a daily feed of new issues, new comments, merged PRs and new releases in your dependencies or competitors' repos, for Slack, a triage bot or an agent (watch mode).
-
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.
Watch mode: only new and updated issues on a schedule
Set stateKey (any name, e.g. crawlee-watch) and run the Actor on a schedule.
| Run | What you get (and pay for) |
|---|---|
| First run | A baseline: the usual export (newest maxItems per repository and type, or everything updated in the last sinceDays). |
| Every later run | Only items created or updated since the previous run (new comment, label or state change, edit, merge; releases: newly published). Unchanged items are skipped and not billed. A run with no changes exports 0 items and only pays the start fee. |
- Each record has
watch_change:new(first time under this key) orupdated(changed since its previous export). - An
updatedissue, PR or discussion carries only the comments added or edited since its previous export (comments_sincetells you from when), so you never pay twice for the same comment. watchChanges: "new-only"exports each item once, the first time it appears: a feed of new issues, PRs, discussions and releases, ignoring later activity.- If more than
maxItemsitems changed between two runs, the run exports the newestmaxItemsand the next run continues with the rest (nothing is skipped). - The state (a key-value store named after
stateKeyin your account) is saved even when you abort a run or the platform migrates it, so items already billed are not billed again. Use a different key per schedule or filter set; delete the store to start over.
Example: a daily feed of everything that changed in two repositories, with new comments.
{"repos": ["apify/crawlee", "apify/apify-sdk-js"],"types": ["issues", "pulls", "releases"],"stateKey": "crawlee-watch","includeComments": true,"githubToken": "github_pat_..."}
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). |
stateKey | string | - | Watch mode: only new or updated items since the previous run with the same key. |
watchChanges | string | new-and-updated | new-and-updated or new-only (watch mode). |
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. In watch mode a daily run on a busy repository with 20 changed items and 30 new comments costs $0.005 + $0.02 + $0.006 = about $0.03 per day; a quiet day costs only the start fee. 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. - Watch mode: an edited release (same
published_at) is not re-exported. Reactions alone do not change GitHub'supdated_at, so a reaction-only change is not reported. Discussion comments in anupdateditem are filtered after fetching (up to the per-item cap, oldest first), so on a discussion with more than 100 comments the newest ones can be missing; issue and PR comments are fetched with GitHub'ssincefilter and are not affected.
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.