# Pinpoint Jobs API

> Query jobs from Pinpoint boards through one API — and how its postings.json feed delivers a whole board with no posting date at all.

Source: https://hyperjobs.io/ats/pinpoint

Pinpoint is an ATS built for in-house talent acquisition teams, with boards at
`<slug>.pinpointhq.com`. Its public feed is one of the most generous in this pool:
a single unauthenticated GET returns the whole board with full descriptions,
structured compensation, benefits and responsibilities broken out as separate
fields. It also doesn't tell you when anything was posted.

## Try it

```bash
curl -G https://api.hyperjobs.io/v1/jobs \
  -H "Authorization: Bearer $HYPERJOBS_KEY" \
  --data-urlencode "source=pinpoint" \
  --data-urlencode "limit=2"
```

```json title="Illustrative — the shape, not a live response"
{
  "data": [
    {
      "id": "pinpoint:88213",
      "title": "Finance Business Partner",
      "company": {
        "slug": "harborview-group",
        "name": "Harborview Group",
        "domain": "harborviewgroup.co.uk",
        "website": "https://harborviewgroup.co.uk",
        "logo": "https://media.licdn.com/dms/image/…",
        "industry": "Financial Services",
        "employee_count": 400
      },
      "location": {
        "remote": false,
        "countries": ["United Kingdom"],
        "cities": ["Newcastle"],
        "regions": ["Tyne and Wear"],
        "raw": ["Newcastle, Tyne and Wear"]
      },
      "employment_type": ["FULL_TIME"],
      "work_arrangement": "Hybrid",
      "salary": {
        "min": 55000,
        "max": 65000,
        "currency": "GBP",
        "unit": "YEAR",
        "annual_min": 55000,
        "annual_max": 65000,
        "summary": "£55,000 – £65,000 depending on experience"
      },
      "skills": ["forecasting", "budgeting", "excel"],
      "taxonomies": ["Finance & Accounting"],
      "core_responsibilities": "Partner with department heads on budget cycles…",
      "benefits": "Private healthcare, 27 days holiday, pension matching…",
      "apply_url": "https://harborview.pinpointhq.com/en/postings/88213",
      "url": "https://harborview.pinpointhq.com/en/postings/88213",
      "source": "pinpoint",
      "posted_at": null,
      "expires_at": "2026-08-01T00:00:00.000Z",
      "updated_at": "2026-07-13T12:04:19.000Z"
    }
  ],
  "total": 2,
  "limit": 2,
  "offset": 0
}
```

<Warning title="`posted_at` can be null on this source, and `time_frame` filters on it">
  Pinpoint's feed publishes **no posting date**. There is no `created_at`, no
  `published_at`, nothing. So a `?time_frame=7d` filter — which measures against
  `posted_at` — behaves differently here than on
  [Greenhouse](/ats/greenhouse) or [Ashby](/ats/ashby), where every posting has a
  real date.

  That's why the curl above doesn't use one. If you're building a "new jobs this
  week" view across [sources](/docs/reference/sources), this is the source that
  will quietly under-report.
</Warning>

## How Pinpoint boards actually work

One GET. No auth, no pagination, no detail calls, whole board with bodies:

```bash
curl "https://<slug>.pinpointhq.com/postings.json"
```

`<slug>` is the subdomain. Response is `{ "data": [...] }`.

Per posting you get `id`, `title`, `description`, `url`, `employment_type_text`,
`workplace_type_text` (a clean `Remote` / `Hybrid` / `On-site`), `location`, and
structured compensation as four separate fields: `compensation_minimum`,
`compensation_maximum`, `compensation_currency`, `compensation_frequency`, plus a
free-text `compensation` summary alongside them. Real numbers *and* the prose,
which is unusual — most platforms make you choose.

### Fields most platforms don't have

Pinpoint breaks the job ad into parts on the way out:

| Field | Fill |
| --- | --- |
| `skills_knowledge_expertise` | An HTML list — near 100% |
| `key_responsibilities` | HTML — near 100% |
| `benefits` | An HTML list — around 65% |

Those map more or less directly onto
[`core_responsibilities` and `benefits`](/docs/objects/job), which most sources
have to derive. Requisition id, department and division are nested one level down
under a `job` object rather than sitting at the top level.

`deadline_at` is an ISO application deadline — and it's the platform's **only**
date signal, which is a strange place to end up: Pinpoint tells you when a job
closes but not when it opened.

## What bites you

**Roughly 42% of the "skills" bullets are sentences.** `skills_knowledge_expertise`
is an HTML list, but employers write requirements into it, not tags. Harvest every
`<li>` and your skills index fills with whole sentences. A real skill is a term or
short phrase — we keep bullets that are short in both characters and words and
drop the rest, and let the enrichment pass derive skills from the description for
those postings instead.

**`location.name` is a bare, ambiguous city.** `Newcastle` — which one? The
structured `city` and `province` fields disambiguate it, and Pinpoint's API
carries **no country at all**, so `province` is the best hint available for
inferring one. Prefer the structured pair over the display name.

**`compensation_frequency` is lowercase prose.** `year`, `hour` — not an enum you
can pass straight through.

## Or use ours

Pinpoint is genuinely easy. One call, no auth, no pagination, no N+1. If you have
a handful of Pinpoint boards, use the endpoint — this page is most of what you'd
need to know.

What we add is narrower here than elsewhere, and it'd be dishonest to inflate it.
We track 350 Pinpoint boards, which is the reach you'd otherwise assemble by hand.
The skill bullets are filtered so sentences don't become tags. The structured
city/province is preferred over the ambiguous display name. And Pinpoint's rows
sit in the same [`salary`](/docs/objects/job) and location shape as every other
source, so a GBP annual band from Pinpoint compares to an hourly USD one from
[BambooHR](/ats/bamboohr) without you writing the normalisation.

The date gap is real and we can't fill it: `posted_at` is null because Pinpoint
never published one. We'd rather say that than derive a plausible date and let you
build a freshness chart on it.

Pinpoint is in the fast refresh tier, attempted every cycle — see
[coverage](/docs/reference/coverage).

[Quickstart](/docs/quickstart) · [Pricing](/pricing)
