- 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. Twenty-eight 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.
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. The webhook signing secret for triggers is configured separately, per trigger, when you publish a workflow.
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.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 gives you a signing secret to paste into the GitHub webhook's Secret field. 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
Every trigger is a real-time webhook. Each inbound delivery is one event and produces one activation. There is no polling and no batch or digest collapse.
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. 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. |
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. |
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. |
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
Each trigger verifies every delivery against an HMAC-SHA256 signature in the X-Hub-Signature-256 header. When you publish a trigger, TaskJuice gives you a signing secret. Paste it into the GitHub webhook's configuration under Secret. GitHub signs the raw request body and sends the hex digest in that header. Deliveries whose signature does not match are rejected before the workflow runs.
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. |
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.
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}}.
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. - A webhook signing secret is required for every trigger. Deliveries without a valid
X-Hub-Signature-256signature are rejected. - 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 is not covered. GitHub exposes Projects v2 only through its GraphQL API, which this integration does not use.
- 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.
- Triggers are real-time and single-event. Each webhook delivery is one activation. There is no polling, batching, or digest mode.