Title: GitHub Actions limits: jobs, time and API rate limits
URL: https://codemany.com/articles/github-actions-limits
Description: GitHub Actions limits cap job time, concurrent jobs, queue time and API calls. See each limit, what hits it first, and what changes on your own runners.
All pages as Markdown: https://codemany.com/llms.txt

---

[Home](https://codemany.com/) › [Articles](https://codemany.com/articles)

# GitHub Actions limits, in one place

GitHub Actions limits cap how long a job runs, how many jobs run at once, how long a job waits in the queue and how many API calls a workflow makes. Some limits change on your own runners, and some do not.

## The limits that matter most

Most teams only ever hit a few of these. Here they are as of November 2026, from [GitHub's Actions limits page](https://docs.github.com/en/actions/reference/limits). GitHub changes them, so check that page before you plan around a number.

| Limit | GitHub-hosted | Self-hosted |
| --- | --- | --- |
| Time per job | 6 hours | 5 days |
| Time per workflow run | 35 days | 35 days |
| Time in the queue | Not listed | 24 hours, then cancelled |
| Jobs per matrix | 256 | 256 |
| Jobs at once | Set by your plan | As many runners as you have |
| GITHUB\_TOKEN API calls | 1,000 an hour per repo | 1,000 an hour per repo |

## Job and workflow time limits

A job on a GitHub-hosted runner can run for up to 6 hours. That is also the default when you don't set `timeout-minutes`. A job on your own runner can run for up to 5 days.

A whole workflow run can last 35 days. That includes time spent waiting for approval.

You should set your own, much shorter, timeout. A stuck job wastes time and money. Read [GitHub Actions timeout-minutes](https://codemany.com/articles/github-actions-timeout-minutes) to set one.

## Concurrent job limits by plan

GitHub-hosted runners run only so many jobs at once. As of November 2026, standard runners allow:

- **Free:** 20 jobs at once
- **Pro:** 40
- **Team:** 60
- **Enterprise:** 500

macOS jobs have a smaller cap: 5 at once on Free, Pro and Team, and 50 on Enterprise. Extra jobs wait in the queue until a slot frees up.

Minutes are a separate limit. Each plan includes some free minutes, then you pay per minute. If you run out each month, read [GitHub Actions minutes running out](https://codemany.com/problems/github-actions-minutes-running-out).

On your own runners, the matrix and plan limits matter less. What sets your pace is how many runners your machines can hold at once.

## GitHub API rate limits and secondary limits

Workflows often call the GitHub API. They post comments, add labels or read releases. Those calls count against GitHub API rate limits.

- **GITHUB\_TOKEN:** 1,000 requests an hour per repo. Enterprise Cloud repos get more.
- **Other tokens:** a personal token or a GitHub App has its own hourly budget. Check GitHub's REST API docs for today's numbers.
- **Secondary rate limit:** GitHub also limits bursts. Too many calls at once, or too fast, get a 403 or 429 error even when you have budget left.

To avoid the GitHub secondary rate limit, slow down. Make calls one at a time. When you get an error, wait for the time in the `retry-after` header before you try again.

## Which limits change on self-hosted runners

On a [self-hosted runner](https://codemany.com/docs/guides/self-hosted-runner), some GitHub Actions limitations go away. Others stay.

- **Changes:** jobs at once. Your machines run as many jobs as you have runners. There is no per-minute bill from GitHub for the runner itself.
- **Changes:** time per job goes from 6 hours to 5 days.
- **Stays:** the matrix cap, the workflow run cap and API rate limits. GitHub still runs the queue.
- **New:** a job waits at most 24 hours for a runner, then GitHub cancels it.

With Codemany, each job gets a fresh, single-use runner that registers with GitHub just in time. Each runner budgets about 4 GB of memory, 2 CPU cores and 15 GB of disk. An 8 GB Mac runs 1 job at a time, and a 16 GB Mac runs 3. To run more, add machines. GitHub errors and rate limits never stop a job that is already running.

Your own runners still need care. A machine that is off or out of disk takes no jobs, and the queue grows. Watch the 24-hour queue limit: a job that waits that long is cancelled, not run.

## How to stay under them

- **Set timeouts.** Use `timeout-minutes` on every job.
- **Cancel old runs.** Use `concurrency` so a new push stops the old run.
- **Cut the matrix.** Use `exclude` to drop combos you don't need.
- **Batch API calls.** One call that does a lot beats many small ones.
- **Move heavy jobs.** Run macOS and long jobs on your own machines. See [cut GitHub Actions costs](https://codemany.com/docs/guides/actions-cost).

```
concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true
```

More answers are in the [Codemany FAQ](https://codemany.com/docs/faq).

## Questions

### How many jobs can run at once?

It depends on your plan for GitHub-hosted runners. Your own machines run as many jobs as you allow.

### Do self-hosted runners hit API rate limits?

Runner registration uses the API. Codemany registers a just-in-time runner for each job, and GitHub errors and rate limits never stop a running job.

### Is there a limit on self-hosted job time?

Yes. GitHub still ends a job after its maximum run time, which is 5 days on self-hosted runners as of November 2026.

## Related

Read next: [timeout-minutes](https://codemany.com/articles/github-actions-timeout-minutes), [minutes running out](https://codemany.com/problems/github-actions-minutes-running-out), [self-hosted runners](https://codemany.com/docs/guides/self-hosted-runner), [GitHub Actions costs](https://codemany.com/docs/guides/actions-cost) and the [FAQ](https://codemany.com/docs/faq).

[Start a 14-day trial](https://codemany.com/docs/get-started) No card needed. $20 a month for 2 machines after that.
