# Run a job board with listings in a Google Sheet

A job board is a list of openings people filter by role, location, and remote. PasteSheet turns a Google Sheet of listings into a live, cached JSON API with filtering, search, and pagination built in — so you launch a board and post a job by adding a row.

*Last updated: 2026-07-11 · Source: <https://pastesheet.com/use-cases/google-sheets-job-board>*

## Key facts

- The Google Sheets API allows **300 read requests per minute per project** and **60 per minute per user**. Past that it returns `429 RESOURCE_EXHAUSTED`. ([source](https://developers.google.com/workspace/sheets/api/limits))
- A cached endpoint reads the sheet **once per TTL**, not once per request — so 10,000 visitors become one upstream read, and Google's quota stops being your problem.
- The board holds up to **500 openings on Free** and **5,000 on Starter ($9/mo)**; **Pro ($19/mo)** lifts the row cap.
- The endpoint is **read-only**: a candidate can filter and read openings but cannot apply through it. Point each apply link at your ATS or a form tool that owns the writes.

## A job board is a spreadsheet with a search bar

Every job board is the same table underneath: a row per opening with a title, company, location, a remote flag, and a link to apply. Keeping that in a Google Sheet means anyone on your team can post a role — no CMS, no admin dashboard, no engineer in the loop.

PasteSheet serves the sheet as JSON and hands you the querying a board needs: filter by role or location, match a remote flag, full-text search the titles, sort by date, and paginate. Your front end — a static site, a [Next.js app](https://pastesheet.com/use-cases/google-sheets-nextjs-data), or a [Framer site](https://pastesheet.com/use-cases/google-sheets-framer) — renders the openings.

## Launch your board

From a sheet to a live, filterable board in four steps:

1. List one job per row: title, company, location, remote, salary, and an apply link.
2. Paste the sheet's share URL into PasteSheet to get a live endpoint — no Google Cloud project.
3. Fetch the endpoint from your site and wire the filters to URL parameters.
4. Post a new job by adding a row; close one by deleting it or flipping a status cell.

## Filter openings over the API

The role, location, and remote filters your board offers are just URL parameters — combine them with search, sort, and pagination:

```bash
curl "https://pastesheet.com/your-endpoint/Jobs?remote=true&contains[role]=engineer&sort=-posted"

{
  "data": [
    {
      "role": "Senior Backend Engineer",
      "company": "Acme",
      "location": "Remote (US)",
      "remote": true,
      "posted": "2026-07-10",
      "apply_url": "https://acme.com/jobs/be-eng"
    }
  ]
}
```

## Safe to publish, nothing to wire up

Because the endpoint is **read-only by design**, it is safe to expose publicly or hand to a teammate: consumers can read and query the data but can never change the sheet. And there is **no Google Cloud project, OAuth screen, or service account** to set up — you paste a share URL and get a live API.

## What it costs

**Starter — $9/month.** For indie makers shipping a real app.

- Endpoints: 10
- Requests: 50,000 / month
- Rows per endpoint: 5,000
- Tabs per endpoint: 5
- Rate limit: 300 / minute

**MCP is included on the Free plan.** Connect any **public** endpoint over MCP with no Google Cloud project and no credit card. Private endpoints and the account-wide workspace server need a paid plan (from **Starter ($9/mo)**) for the keys and OAuth they authenticate with.

Pro adds full-text search and aggregation (`count`, `sum`, `avg`, `group_by`) that your AI agent can call through `query_rows`.

## Frequently asked questions

### How do candidates filter jobs?

Your front end maps each filter to a URL parameter: ?remote=true for the remote toggle, ?location=Berlin or contains[role]=design for role and location, and search= for a keyword box across the listing. Sort and pagination are parameters too.

### How do employers or I post a new job?

Add a row to the Google Sheet. The new opening appears on the board after the cache refreshes. To close a role, delete the row or flip a status cell — no publishing flow and no deploy.

### Can applicants submit through the board?

Not through PasteSheet — it is read-only, so it serves and filters the listings but takes no writes. Point each apply link at your ATS, an email, or a form tool that owns the application submissions.

### How current are the listings?

Responses are cached for speed. The Free plan refreshes every 5 minutes; paid plans let you set a custom TTL, so a fresh row goes live within your chosen window rather than on a manual rebuild.

## Sources

- [Usage limits — Google Sheets API](https://developers.google.com/workspace/sheets/api/limits) — Google

## Related use cases

- [Build a Directory Website From a Sheet](https://pastesheet.com/use-cases/google-sheets-directory-website) — Turn a Google Sheet into a searchable directory. PasteSheet serves your listings as a filterable, read-only JSON API — no database, no admin panel, no code.
- [Real Estate Listings from Google Sheets](https://pastesheet.com/use-cases/google-sheets-real-estate-listings) — Publish real-estate listings from a Google Sheet and filter by price, beds, or location over a live, read-only JSON API — no backend to build.
- [A No-Code Backend From a Google Sheet](https://pastesheet.com/use-cases/google-sheets-app-backend) — Skip the server. PasteSheet turns a Google Sheet into a live, read-only JSON API your web or mobile app reads from — no database, no backend, no Google setup.
- [Drive a Marketing Site from Google Sheets](https://pastesheet.com/use-cases/google-sheets-content-website) — Run your marketing site's content blocks from a Google Sheet — hero copy, feature lists, section text. PasteSheet publishes it as a live, read-only JSON API.

---

[PasteSheet](https://pastesheet.com) turns any Google Sheet into a live REST API and MCP server for AI agents — no backend, no code. Canonical HTML version of this page: <https://pastesheet.com/use-cases/google-sheets-job-board>
