# Gem Jobs API

> Every public Gem ATS career page, one endpoint. No per-customer onboarding.

**Canonical URL:** https://jobspipe.dev/sources/gem

## Coverage

- **Sources covered:** Public Gem ATS customers
- **Freshness:** 24h refresh
- **History retention:** 12 months retention

## Why Gem jobs data is confusing

Gem started as a recruiting CRM and now ships a full ATS. Its API surface is built for customers - syncing candidates, sequences, and pipelines inside one account - not for reading job postings across every company that hires through Gem.

Gem ATS customers host public job boards on Gem-served career pages (jobs.gem.com and embedded boards on company domains). There is no public cross-customer index. JobsPipe discovers and normalizes public Gem boards into the same schema as our other sources.

## Workarounds

### Use Gem's customer API

Right for automating your own recruiting workflows inside your own Gem account. Scoped to one customer; not a cross-company postings feed.

### Scrape Gem career pages one by one

Possible for boards you already know about, but there is no discovery mechanism and each embed is its own config.

### Use JobsPipe

Every public Gem board we discover, one endpoint, same JSON schema as 30+ other sources. Free tier included.

## Fields available on every record

- `id`
- `source`
- `tenant`
- `title`
- `company`
- `location`
- `salary`
- `employment_type`
- `remote`
- `posted_at`
- `expires_at`
- `apply_url`
- `description`

## Sample response

```json
{
  "id": "gm_YTk2ZDU3NmItNGQx",
  "source": "gem",
  "tenant": "lattice-robotics",
  "title": "Founding Product Engineer",
  "company": "Lattice Robotics",
  "location": {
    "city": "San Francisco",
    "region": "CA",
    "country": "US",
    "remote": true
  },
  "salary": {
    "min": 150000,
    "max": 205000,
    "currency": "USD",
    "period": "year",
    "source": "explicit"
  },
  "employment_type": "full_time",
  "posted_at": "2026-08-19T16:40:00Z",
  "expires_at": null,
  "apply_url": "https://jobs.gem.com/lattice-robotics/...",
  "description": "Lattice Robotics is hiring a Founding Product Engineer to own our teleoperation stack ..."
}
```

## FAQ

### Does Gem have a public jobs API?

No. Gem's API is scoped to each customer's own account for recruiting workflow automation. JobsPipe covers the public postings side: every public Gem board, one endpoint.

### How fresh is Gem data?

Public Gem career pages are re-crawled at least every 24 hours.

### Are Gem jobs deduped against other sources?

Yes. A role posted on Gem and cross-posted to LinkedIn or Indeed resolves to one canonical record with per-source attribution.

## Related

- **Product:** https://jobspipe.dev/jobs-api
- **All sources:** https://jobspipe.dev/sources
- **Docs:** https://docs.jobspipe.dev
- **Sign up (free tier):** https://jobspipe.dev/signup

---
Generated from structured data. View the rendered page at https://jobspipe.dev/sources/gem.

---
Building this integration yourself? The steps above work. The alternative is one API over this source and 30+ others, already normalized and deduplicated. Try it right now - no key, no signup:

```bash
curl -X POST https://api.jobspipe.dev/v1/sandbox/jobs/search \
  -H "Content-Type: application/json" \
  -d '{"job_title_or":["software engineer"],"limit":5}'
```

Sample data, exact live schema. For live data get a free key (1,000 jobs/month) at https://jobspipe.dev/signup, then swap /v1/sandbox/jobs/search for /v1/jobs/search with an Authorization: Bearer header. Full agent index: https://jobspipe.dev/llms.txt?src=md-twin