# Support

> How to get help, what to include, and answers to the questions that come up most.

Source: https://hyperjobs.io/docs/support

## Getting help

| Topic | Contact |
| --- | --- |
| Technical questions, bugs, wrong data | [support@hyperjobs.io](mailto:support@hyperjobs.io) |
| Plans, billing, custom limits, flat-file delivery | [hello@hyperjobs.io](mailto:hello@hyperjobs.io) |
| Security disclosure | [security@hyperjobs.io](mailto:security@hyperjobs.io) |
| Data protection / GDPR | [dpo@hyperjobs.io](mailto:dpo@hyperjobs.io) |

## What to include

A good report is one we can reproduce. Send:

- **The full request URL**, with your API key redacted.
- **The response** — status code and body. For a `500`, the `message` field is
  the server's own exception text and usually identifies the problem outright.
- **What you expected** versus what you got.
- **A job or company id** if the issue is about specific data.

<Danger title="Never send us your API key">
  Support will never ask for it, and there's nothing we could do with it that we
  can't do from your account. If you've pasted a key anywhere it shouldn't be —
  a ticket, a screenshot, a repo — [revoke it](/docs/authentication#rotating)
  and create a new one.
</Danger>

## Common questions

<AccordionGroup>
  <Accordion title="My filter returns zero results and I'm sure it shouldn't">
    First: did you get a `200`? Invalid parameters and enum values
    [return a `400`](/docs/errors) naming the parameter, so a typo can't hide.
    On a genuine `200` with zero rows, the usual suspects:

    - **`skill` commas mean AND.** `skill=python,aws` needs *both* — it's the
      one filter where comma isn't OR.
    - **A displayed skill fed back as a filter.** `skill=Machine Learning` → 0
      rows. It's `machinelearning`.
    - **An over-tight combination.** Every *parameter* still ANDs with the
      others; drop them one at a time and watch `total` (or use
      [`/v1/jobs/count`](/docs/api-reference/jobs-count)).

    The [filtering guide](/docs/guides/filtering) has the full procedure.
  </Accordion>

  <Accordion title="Where's the description field?">
    Omitted by default — the key is **absent**, not null. Add
    `description_format=text` or `description_format=html`. It's opt-in because
    descriptions are multi-kilobyte and most callers don't want 200 of them per
    page. See [the Job object](/docs/objects/job).
  </Accordion>

  <Accordion title="I'm getting 401 with a key I know is correct">
    If it's from browser JavaScript, it's the CORS preflight: an `Authorization`
    header makes the request non-simple, and there's no `OPTIONS` handler. Use
    `?api_key=` from browsers — but see
    [why you shouldn't call the API from a browser at all](/docs/authentication#calling-from-a-browser).

    Otherwise: the key may be revoked, or you may be sending a key from a
    different account. `401` covers missing, malformed, unknown, and revoked
    without distinguishing.
  </Accordion>

  <Accordion title="A job I fetched yesterday now 404s">
    Expected. Postings are reaped when they disappear from the employer's board,
    and `/v1/jobs` excludes anything expired. It may also have been marked as a
    duplicate of an equivalent posting from another source. See
    [duplicates](/docs/guides/deduplication).

    If you keep a local mirror, treat a `404` on a previously-seen id as a
    delete. [Syncing the feed](/docs/guides/feed-sync) covers this.
  </Accordion>

  <Accordion title="The counts from /v1/health and /v1/meta don't match">
    Both are correct. `/v1/health` counts every row including duplicates and
    expired postings; `/v1/meta` counts only live, non-duplicate ones. `/v1/meta`
    is the number you want. See [coverage](/docs/reference/coverage).
  </Accordion>

  <Accordion title="Requests are slow">
    Usually `description=`, which scans every description in the dataset. Pair it
    with a narrower filter. Also check you're not fetching descriptions you don't
    read — see [coverage](/docs/reference/coverage) on query cost.
  </Accordion>

  <Accordion title="I'm hitting 429 constantly">
    Pace the client rather than retry-looping. Limits are per **account**, not per
    key, so multiple workers share one budget and have to divide it.
    [Rate limits](/docs/rate-limits) has a token-bucket example.

    Also check you're using `limit=200`: fifty pages of 20 costs ten times what
    five pages of 200 costs, for identical data.
  </Accordion>

  <Accordion title="Can I get the whole dataset as a file?">
    Not through the API — there's no bulk jobs export. For flat-file delivery,
    [talk to us](mailto:hello@hyperjobs.io). For keeping a live mirror,
    [sync the feed](/docs/guides/feed-sync).
  </Accordion>

  <Accordion title="Do you have webhooks?">
    No. Sync is pull-based via [`/v1/jobs/feed`](/docs/api-reference/jobs-feed) —
    one request returns everything since your cutoff. See
    [syncing the feed](/docs/guides/feed-sync).
  </Accordion>

  <Accordion title="Is the data accurate?">
    It's scraped from employers' own ATS boards, so `apply_url` points at the
    real application form and postings track the source board within a few hours.
    Enriched fields — `skills`, `seniority`, `taxonomies`, `salary` — are derived
    by classifiers and are not perfect. Coverage varies by field; see
    [coverage](/docs/reference/coverage).

    If you find data that's wrong, send the job id. That's the most useful bug
    report we get.
  </Accordion>
</AccordionGroup>

## Reporting bad data

Send the `id` and what's wrong with it. Enrichment errors — a mis-parsed salary,
a wrong seniority, a missing skill — are fixable, and a concrete example is worth
far more than a general report.

## Status

The [dashboard](/dashboard) shows your usage and key activity. For API
availability, [`/v1/health`](/docs/api-reference/health) is unauthenticated and
free to poll.
