- Documentation
- Integrations
- Apps
- GitHub integration
GitHub integration
Run issues, pull requests, releases, and Actions workflows across your clients' repositories from any TaskJuice workflow.
What it does
The GitHub integration turns repository activity into automation you run on behalf of your clients. Connect a Personal Access Token once, then read and write issues, pull requests, reviews, labels, milestones, releases, files, and GitHub Actions runs from any workflow step. Thirty-three real-time triggers let you react the moment an issue changes, a pull request moves through review, a build finishes, or a security alert opens, and three polling triggers watch the corners GitHub publishes no webhook for.
Typical uses: open an issue when a support ticket is escalated, post a Slack summary when a pull request is approved, cut a release when a milestone closes, or file a ticket the moment Dependabot reports a high-severity advisory.
GitHub lives under the Developer Tools category. You can also find it by searching for git or gh.
Connect a GitHub account
The connection holds one credential: a Personal Access Token. This integration does not use OAuth, so there is no "Sign in to GitHub" button and no consent screen. Webhook triggers need no secret from you: TaskJuice mints the signing secret when it registers the webhook on publish.
Generate a token in GitHub
Create a fine-grained token at
https://github.com/settings/personal-access-tokens, or a classic token athttps://github.com/settings/tokens. Grant only the permissions your workflows need. For the actions below that is typically read and write on Contents, Issues, Pull requests, and Actions, plus read on Metadata. If you use webhook triggers, also grant Webhooks: Read and write (fine-grained) or theadmin:repo_hookscope (classic), and make sure the account that owns the token is an admin of each repository you pick. Without it, every action works but trigger setup stops with a permission message.Paste it into the connection
In TaskJuice, open the GitHub connection and paste the token into the Personal Access Token field.
Save the connection
TaskJuice stores the token encrypted. It is not shown again after you save, so keep a copy in GitHub if you need to reference it later.
To revoke access, delete the token in GitHub. Because access is scoped to the token, switching the acting account means generating a new token and rotating it into the connection. For credential lifecycle details, see Connections.
Do not put a webhook secret in the connection. When you publish a trigger, TaskJuice registers the GitHub webhook and mints its signing secret for you. See the inbound delivery section below.
Choosing a repository
Every repository-scoped action takes a single Repository dropdown rather than separate owner and name fields. The list contains every repository your token can reach, across your personal account and all of your organizations, shown as owner/name.
To act on a repository the workflow computes instead of one you pick, use the {} toggle on the field and bind an expression. Trigger payloads carry the value directly, so a common binding is:
{{$trigger.repository.full_name}}Dependent dropdowns for Label, Branch, and Workflow populate from whichever repository is selected. Select the repository first, then those fields load.
Triggers
Thirty-three of the thirty-six triggers are real-time webhooks. Each inbound delivery is one event and produces one activation, with no batch or digest collapse. The remaining three poll, because GitHub publishes no webhook for what they watch.
Most events fire across many lifecycle transitions. The specific transition arrives in the action field of the output, so add a Branch or Switch node downstream and filter on it, for example action == "opened". Push, Create, Delete, Fork, and Commit Status carry no action field. Wiki Page carries none either: its created-or-edited verb sits per page at pages[].action, so read that rather than action. See Triggers and actions.
Issues and discussions
| Trigger | Key | Fires when |
|---|---|---|
| Issue Event | github/issue-event | An issue is opened, edited, closed, reopened, assigned, labeled, or otherwise changed. |
| Issue Comment Event | github/issue-comment-event | A comment is created, edited, or deleted on an issue or pull request. |
| Discussion Event | github/discussion-event | A discussion is created, answered, categorized, or otherwise changed. |
| Discussion Comment Event | github/discussion-comment-event | A comment on a discussion is created, edited, or deleted. |
Pull requests
| Trigger | Key | Fires when |
|---|---|---|
| Pull Request Event | github/pull-request-event | A pull request is opened, synchronized, closed, merged, or marked ready for review. |
| Pull Request Review Event | github/pull-request-review-event | A review is submitted, edited, or dismissed. |
| Pull Request Review Comment Event | github/pull-request-review-comment-event | A comment on a pull request diff is created, edited, or deleted. |
| Pull Request Review Thread Event | github/pull-request-review-thread-event | A review conversation is resolved or unresolved. |
Code and releases
| Trigger | Key | Fires when |
|---|---|---|
| Push Event | github/push-event | Commits are pushed to a branch or tag. |
| Branch or Tag Created | github/create-event | A branch or tag is created. Check ref_type to tell them apart. |
| Branch or Tag Deleted | github/delete-event | A branch or tag is deleted. |
| Release Event | github/release-event | A release is published, created, edited, or deleted. |
| Commit Comment Event | github/commit-comment-event | A comment is left on a commit. |
| Commit Status Event | github/commit-status-event | External CI reports a commit status. |
| Wiki Page Event | github/wiki-page-event | A wiki page is created or edited. Read pages[].action. |
Builds and deployments
| Trigger | Key | Fires when |
|---|---|---|
| Workflow Run Event | github/workflow-run-event | An Actions run is requested, is in progress, or completes. |
| Workflow Job Event | github/workflow-job-event | A job in an Actions run is queued, starts, or completes. |
| Check Run Event | github/check-run-event | A check run is created, completes, or is requested again. |
| Check Suite Event | github/check-suite-event | A check suite completes. Use this for an aggregate pass or fail. |
| Deployment Event | github/deployment-event | A deployment is created. |
| Deployment Status Event | github/deployment-status-event | A deployment status is posted. |
Repository administration and security
| Trigger | Key | Fires when |
|---|---|---|
| Label Event | github/label-event | A repository label is created, edited, or deleted. |
| Milestone Event | github/milestone-event | A milestone is created, closed, opened, edited, or deleted. |
| Repository Event | github/repository-event | A repository is created, archived, renamed, or changes visibility. |
| Repository Member Event | github/member-event | A collaborator is added, removed, or has permissions changed. |
| Repository Forked | github/fork-event | Someone forks the repository. |
| Repository Starred | github/star-event | The repository is starred or unstarred. |
| Repository Watched | github/watch-event | Someone starts watching the repository. |
| Dependabot Alert Event | github/dependabot-alert-event | A Dependabot alert is created, dismissed, resolved, or reintroduced. |
| Code Scanning Alert Event | github/code-scanning-alert-event | A code-scanning alert is created, fixed, reopened, or closed by a user. |
| Secret Scanning Alert Event | github/secret-scanning-alert-event | A leaked-secret alert is created, resolved, or reopened. |
| Branch Protection Rule Event | github/branch-protection-rule-event | A branch protection rule is created, edited, or deleted. |
| Repository Ruleset Event | github/repository-ruleset-event | A repository ruleset is created, edited, or deleted. |
Watching outside webhooks
Three triggers poll, because GitHub publishes no repository webhook for what they watch. Each emits one activation per cycle carrying every newly seen record under items, deduplicated by id, and suppresses whatever already existed when you published. Add a Loop node downstream over items to handle records one at a time; leave it off for a digest.
github/new-gist narrows that further: it fires only for gists created after the workflow is first published, judged by the gist's own creation date, so editing a gist that existed before then does not fire it.
| Trigger | Key | Watches |
|---|---|---|
| New Gist | github/new-gist | Gists owned by the connected account. |
| New Notification | github/new-notification | The account's notification inbox, optionally mentions only. |
| New Organization | github/new-organization | Organizations the connected account joins. |
Output shape
Every trigger delivers the raw GitHub webhook body. repository and sender are present on all of them. The event subject arrives under its own key, for example issue, pull_request, release, or workflow_run. organization is present when the repository belongs to an organization, and installation only on GitHub App deliveries, so treat both as optional.
Verifying inbound deliveries
You do not create the webhook yourself. Pick a repository in the trigger's Repository field, publish the workflow, and TaskJuice registers a webhook on that repository, mints the signing secret, and subscribes it to exactly the events your published triggers need. Publishing a second trigger on the same repository widens that one webhook rather than adding another.
Every delivery is then verified against an HMAC-SHA256 signature in the X-Hub-Signature-256 header. GitHub signs the raw request body and sends the hex digest; deliveries whose signature does not match are rejected before the workflow runs. Turning the workflow off removes the subscription, and deleting the webhook in GitHub's own settings stops deliveries until you republish.
If registration does not finish
While TaskJuice registers the webhook, the trigger panel shows "Setting up GitHub…". Most failures keep retrying on their own before a message replaces it. A missing permission and a refused repository are the exceptions: their messages show straight away. The ones worth knowing in advance:
- "GitHub accepted the connection but won't let it manage webhooks…" The token works, but it cannot read or create the repository's webhooks. The message quotes GitHub's own reason when GitHub gives one, for example "Resource not accessible by personal access token". Edit the token in GitHub to grant Webhooks: Read and write (fine-grained) or
admin:repo_hook(classic), make sure its account is an admin of the repository, then republish. You do not need to reconnect: the token stays the same. If you fix the token and do not republish, TaskJuice re-checks once a day and picks the change up on its own. - "GitHub refused webhook setup for…" GitHub refused one of your repositories while the others registered normally. The message names the repository and quotes GitHub's reason, for example "Resource not accessible by personal access token". Triggers on your other repositories keep receiving events, and the refused repository is retried on its own. To fix it, give the token webhook access on that repository: Webhooks: Read and write on it (fine-grained) or admin rights on it (classic). If every repository you use is refused, you see the "won't let it manage webhooks" message above instead, or, when GitHub answers that the repository does not exist for the token, the "Automatic setup for GitHub stopped" message below.
- "GitHub rejected the connection. Reconnect your GitHub account, then republish." The token was revoked or has expired. Generate a new one, rotate it into the connection, and republish.
- "Automatic setup for GitHub stopped after repeated failures, and its triggers may not be firing. Contact support." Something has kept failing long enough that waiting is no longer the answer. Assume your GitHub triggers may not be receiving events until it clears.
Actions
All actions authenticate with the token from your connection. Reads accept page and per_page so you control how much comes back on each call. GitHub caps per_page at 100.
Issues
| Action | Key | What it does |
|---|---|---|
| List Issues | github/list-issues | List issues, filtered by state, labels, assignee, creator, or milestone. |
| Get Issue | github/get-issue | Fetch a single issue by number. |
| Create Issue | github/create-issue | Open a new issue. |
| Update Issue | github/update-issue | Change title, body, labels, assignees, or milestone. |
| Close Issue | github/close-issue | Close an issue, optionally recording why. |
| Reopen Issue | github/reopen-issue | Reopen a closed issue. |
| Lock Issue | github/lock-issue | Lock the conversation so only collaborators can comment. |
| Unlock Issue | github/unlock-issue | Unlock the conversation. |
| Add Labels to Issue | github/add-labels-to-issue | Add labels without disturbing the ones already applied. |
| Remove Label from Issue | github/remove-label-from-issue | Remove one label. |
| Add Assignees to Issue | github/add-assignees-to-issue | Assign users. |
| Remove Assignees from Issue | github/remove-assignees-from-issue | Unassign users. |
| List Issue Comments | github/list-issue-comments | List comments on an issue or pull request. |
| Create Issue Comment | github/create-issue-comment | Comment on an issue or pull request. |
| Update Issue Comment | github/update-issue-comment | Edit an existing comment. |
| Delete Issue Comment | github/delete-issue-comment | Permanently delete a comment. |
List Issues returns pull requests alongside issues, which is how the GitHub API behaves. To exclude them, filter downstream on the pull_request key: it is present only on rows that are pull requests.
Use Close Issue and Reopen Issue rather than setting state through Update Issue. Keeping state changes in their own actions means an update that only edits a title cannot accidentally reopen a closed issue.
Pull requests
| Action | Key | What it does |
|---|---|---|
| List Pull Requests | github/list-pull-requests | List pull requests by state, head, or base branch. |
| Get Pull Request | github/get-pull-request | Fetch one, including mergeability and diff statistics. |
| Create Pull Request | github/create-pull-request | Open a pull request from a head branch into a base branch. |
| Update Pull Request | github/update-pull-request | Change title, body, or base branch. |
| Merge Pull Request | github/merge-pull-request | Merge, squash, or rebase. |
| List Pull Request Files | github/list-pull-request-files | List changed files with per-file diff statistics. |
| List Pull Request Commits | github/list-pull-request-commits | List the commits on a pull request. |
| List Pull Request Reviews | github/list-pull-request-reviews | List the reviews left on a pull request. |
| Create Pull Request Review | github/create-pull-request-review | Approve, request changes, or comment. |
| Request Pull Request Reviewers | github/request-pull-request-reviewers | Request reviews from users or teams. |
| Create Pull Request Review Comment | github/create-pull-request-review-comment | Comment on a specific line of the diff. |
Merge Pull Request accepts an expected head SHA. Supply it when the workflow read the pull request earlier in the run and you want the merge to fail rather than land on top of newer commits. GitHub answers 409 when the head has moved.
Repositories, branches, and commits
| Action | Key | What it does |
|---|---|---|
| List Repositories | github/list-repositories | List repositories the token can access. |
| Get Repository | github/get-repository | Fetch one repository. |
| Create Repository | github/create-repository | Create a repository owned by the connected account. |
| Update Repository | github/update-repository | Change description, homepage, visibility, or default branch. |
| List Branches | github/list-branches | List branches, optionally only protected ones. |
| Get Branch | github/get-branch | Fetch one branch and its protection state. |
| List Commits | github/list-commits | List commits by branch, path, author, or date range. |
| Get Commit | github/get-commit | Fetch one commit with its file list. |
| List Collaborators | github/list-collaborators | List users with access. |
| List Organizations | github/list-organizations | List organizations the account belongs to. |
| List Organization Repositories | github/list-organization-repositories | List repositories owned by an organization. |
| Get Authenticated User | github/get-authenticated-user | Fetch the account the connection authenticates as. |
Branches and refs
| Action | Key | What it does |
|---|---|---|
| Create Branch | github/create-branch | Create a ref from a commit SHA. Takes the FULLY QUALIFIED ref, for example refs/heads/release-2-1. |
| Delete Branch | github/delete-branch | Delete a branch by name. Names containing / are handled correctly. |
Create Branch takes the whole ref rather than a bare branch name, which is what GitHub's endpoint documents and what lets the same action create tags (refs/tags/v2.1.0). A bare name is rejected.
Files
| Action | Key | What it does |
|---|---|---|
| Get File Contents | github/get-file-contents | Read a file at a branch, tag, or commit. |
| Create or Update File | github/create-or-update-file | Commit a file. |
| Delete File | github/delete-file | Delete a file. |
File contents travel base64-encoded in both directions. Get File Contents returns the body in content with encoding: "base64", and Create or Update File expects base64 in its Content field. To replace an existing file you must supply its current sha, which Get File Contents returns. Omit the sha to create a new file.
Reviews
| Action | Key | What it does |
|---|---|---|
| Get Pull Request Review | github/get-pull-request-review | Fetch one review on a pull request. |
| Update Pull Request Review | github/update-pull-request-review | Edit the body of a review you submitted. |
| Get Pull Request Diff | github/get-pull-request-diff | Fetch the pull request as a unified diff. Returns raw text. |
| Get Pull Request Patch | github/get-pull-request-patch | Fetch the pull request as a mailbox patch series. Returns text. |
Get Pull Request Diff and Get Pull Request Patch are the only two actions that do not return JSON. Their output is the diff or patch as a single string, so reference it directly rather than indexing into fields.
Labels, milestones, and releases
| Action | Key | What it does |
|---|---|---|
| List Labels | github/list-labels | List every label in the repository. |
| Get Label | github/get-label | Fetch one label. |
| Create Label | github/create-label | Create a label. |
| Update Label | github/update-label | Rename a label or change its color. |
| Delete Label | github/delete-label | Delete a label and remove it from every issue. |
| List Milestones | github/list-milestones | List milestones by state. |
| Get Milestone | github/get-milestone | Fetch one milestone. |
| Create Milestone | github/create-milestone | Create a milestone. |
| Update Milestone | github/update-milestone | Change title, description, due date, or state. |
| Delete Milestone | github/delete-milestone | Delete a milestone. Its issues are not deleted. |
| List Releases | github/list-releases | List releases, newest first. |
| Get Release | github/get-release | Fetch one release by id. |
| Get Latest Release | github/get-latest-release | Fetch the most recent published release. |
| Create Release | github/create-release | Publish a release against a tag. |
| Update Release | github/update-release | Change name, notes, or draft and pre-release flags. |
| Delete Release | github/delete-release | Delete a release. The git tag is left in place. |
Create Release can write the notes for you. Turn on Generate notes and GitHub composes them from the pull requests merged since the previous tag.
GitHub's release list is eventually consistent. A release created earlier in the same run can
still be missing from List Releases seconds later, while Get Release and Get Latest Release
already return it. If a workflow creates a release and then needs to read it back, use Get Release with the id from the create step rather than listing.
Actions and workflows
| Action | Key | What it does |
|---|---|---|
| List Workflows | github/list-workflows | List the workflows defined in the repository. |
| Run Workflow | github/dispatch-workflow | Trigger a workflow_dispatch run against a ref. |
| List Workflow Runs | github/list-workflow-runs | List runs by branch, event, status, or actor. |
| Get Workflow Run | github/get-workflow-run | Fetch one run and its conclusion. |
| Cancel Workflow Run | github/cancel-workflow-run | Cancel an in-progress run. |
| Re-run Workflow Run | github/rerun-workflow-run | Re-run a completed run. |
| List Workflow Run Jobs | github/list-workflow-run-jobs | List a run's jobs with each step and its conclusion. |
| Create Repository Dispatch | github/create-repository-dispatch | Send a repository_dispatch event with a custom payload. |
Run Workflow targets a workflow that already declares a workflow_dispatch trigger in its YAML. If it does not, GitHub answers 404. Create Repository Dispatch is the alternative when you want to trigger work without naming a specific workflow: any workflow listening for repository_dispatch picks it up, and your JSON arrives as github.event.client_payload.
List Workflows, List Workflow Runs, and List Workflow Run Jobs return their items nested under workflows, workflow_runs, and jobs respectively, not as a bare list. Reference them accordingly downstream, for example {{$steps.list_runs.data.workflow_runs}}.
| Action | Key | What it does |
|---|---|---|
| Enable Workflow | github/enable-workflow | Re-enable a disabled workflow so it runs on its triggers again. |
| Disable Workflow | github/disable-workflow | Stop a workflow running on its triggers, without deleting it. |
| Get Workflow Usage | github/get-workflow-usage | Read billable Actions minutes for a workflow, broken down by runner OS. |
Get Workflow Usage returns an empty billable object for a workflow that has consumed no billable minutes. That is a success, not an error.
Search
| Action | Key | What it does |
|---|---|---|
| Search Repositories | github/search-repositories | Search repositories with GitHub's query syntax. |
| Search Issues and Pull Requests | github/search-issues | Search issues and pull requests across repositories. |
| Search Users | github/search-users | Search user and organization accounts. |
| Search Code | github/search-code | Search file contents. |
| Search Commits | github/search-commits | Search commit messages and metadata. |
Search endpoints carry their own, tighter rate limit than the rest of the API and return results under items.
Gists
| Action | Key | What it does |
|---|---|---|
| List Gists | github/list-gists | List the connected account's gists. |
| Get Gist | github/get-gist | Fetch one gist and its files. |
| Create Gist | github/create-gist | Create a gist from one or more files, public or secret. |
Users and organizations
| Action | Key | What it does |
|---|---|---|
| Get User | github/get-user | Fetch any user's public profile by login. |
| Get Organization | github/get-organization | Fetch an organization's profile and settings. |
| Check Organization Membership | github/check-organization-membership | Check whether a user belongs to an organization. |
| Invite User to Organization | github/create-organization-invitation | Invite someone to an organization by email or user id. |
| Set Profile Status | github/set-profile-status | Set the connected account's profile status message and emoji. |
Check Organization Membership succeeds only when the user IS a member. GitHub answers 404 for a non-member, which surfaces as NOT_FOUND rather than a false result, so branch on the step failing rather than on its output.
Repository insights
| Action | Key | What it does |
|---|---|---|
| Get Traffic Views | github/get-traffic-views | Page views for the last 14 days. |
| Get Traffic Clones | github/get-traffic-clones | Clone counts for the last 14 days. |
| List Top Referral Paths | github/list-top-referral-paths | The most visited paths in the repository. |
| List Top Referral Sources | github/list-top-referral-sources | The sites sending the most traffic. |
| Get Community Profile | github/get-community-profile | Community health files and their completeness. |
| Get Repository License | github/get-repository-license | The detected license and its text. |
The four traffic actions require push access to the repository. A read-only token gets 403.
GraphQL
| Action | Key | What it does |
|---|---|---|
| Execute GraphQL Query | github/execute-graphql-query | Run any query or mutation against GitHub's v4 API. |
GitHub answers a rejected GraphQL query with HTTP 200 and an errors array rather than an error status. This action treats a response carrying errors as a failure and surfaces GitHub's own message, so a bad query fails the step instead of passing null downstream.
Errors
When a request fails, the step's top-level error code is UPSTREAM_REQUEST_FAILED. GitHub's HTTP status maps to a specific TaskJuice error code:
| HTTP | TaskJuice error code | Retryable | What it means |
|---|---|---|---|
| 400 | INVALID_INPUT | No | The request was malformed. |
| 401 | AUTH_EXPIRED | No | The token was revoked or expired. Rotate it to restore the connection. |
| 403 | FORBIDDEN | No | The token lacks permission for this operation, or a rate limit was exhausted. |
| 404 | NOT_FOUND | No | The resource does not exist, or the token cannot see it. |
| 409 | CONFLICT | No | The state moved underneath you, for example a merge whose head advanced. |
| 422 | VALIDATION_ERROR | No | The request was well formed but rejected, for example a label that does not exist. |
| 429 | RATE_LIMITED | Yes | A rate limit was hit. TaskJuice retries with backoff. |
| 500 | PROVIDER_ERROR | Yes | GitHub returned a server error. TaskJuice retries. |
A 404 on a repository you know exists almost always means the token cannot see it. Check the token's repository access before assuming the name is wrong.
For how a paused or failed run recovers, see Run and step statuses and Reconnect an integration.
Known limitations
- Authentication is a Personal Access Token, not OAuth. Access is limited to the permissions you granted the token. Switching the acting account means generating a new token and rotating the connection.
- Tokens expire. Fine-grained and classic tokens can carry an expiry. When one lapses, requests return
401. Rotate the token to restore the connection. - Rate limits apply per token. GitHub publishes per-token quotas for authenticated REST requests. Every step records the remaining quota, and a
429is retried with backoff. - Reads return one page per step. Set
pageandper_pageand iterate with a Loop node when you need more than one page. This keeps a single step from exhausting your quota on a large repository. - The repository dropdown lists up to 1000 repositories. Beyond that, bind the field with the
{}toggle instead of picking from the list. - Webhooks are registered for you. Publishing a trigger creates or widens a single webhook on the chosen repository and mints its signing secret. Deleting that webhook in GitHub's settings silently stops deliveries until you republish the workflow.
- Organization-level events are not available.
organization,team,membership, andorg_blockare delivered only by organization webhooks, and this integration registers repository webhooks. - github.com only. The connection targets
api.github.com. There is no host field, so GitHub Enterprise Server is not supported. If you manage projects on a self-managed host, see the GitLab integration. - Projects v2 has no dedicated actions. GitHub exposes Projects v2 only through its GraphQL API. Reach it with
Execute GraphQL Queryrather than a purpose-built action. - Release assets cannot be uploaded. Releases can be created, updated, and deleted, but binary asset upload uses a separate upload host and is not available.
- Webhook triggers are real-time and single-event. Each delivery is one activation, with no batching or digest mode. The three polling triggers are the exception: each emits one activation per cycle wrapping every newly seen record in
items.