Guaranteed contract vs current behavior
Use this table to separate the parts you can build against with confidence from the observed behavior that may evolve.| Topic | Kind | What it means |
|---|---|---|
| Endpoint, HTTP method, auth headers | Contract | POST /job/search/autocomplete, bearer auth, x-api-version: 2025-11-01. |
| Request body shape | Contract | field and query required, limit optional. No filters or count keys on this scope. |
| Response body shape | Contract | { "suggestions": [ { "value" } ] }. Empty results return {"suggestions": []} with status 200. |
limit bounds and default | Contract | Minimum 1, maximum 100, default 20. |
| Error status codes | Contract | 400 (invalid request), 401 (unauthorized), 500 (internal). |
| Pricing | Contract | Autocomplete does not consume credits. |
| Suggestion ranking | Current behavior | Suggestions are ranked by internal frequency — the ranking signal is not exposed in the response. |
| Empty-query top values | Current behavior | An empty query returns the most common values for the field, ranked. |
| Free-text duplicates | Current behavior | For high-cardinality free-text fields like title, an empty query may return repeated values. |
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
field | string | Yes | Must be an autocomplete-enabled field — see Autocomplete-enabled fields. Unsupported fields return 400. |
query | string | Yes | Partial text to match against indexed values. Pass "" to retrieve the top values for the field by frequency. |
limit | integer | No | Maximum number of suggestions to return. Minimum 1, maximum 100, default 20. |
Unlike Person Autocomplete, Job
Autocomplete does not accept a
filters scope. The request body is just
field, query, and limit.Autocomplete-enabled fields
Thefield in a Job Autocomplete request must come from a fixed
allowlist. Many entries are aliases of one another — for example title,
job_title, and job_details.title all autocomplete job titles, so you can
use whichever spelling matches the filter path you use on
Search Jobs.
- Job
- Company
- Location
| Field | What it discovers |
|---|---|
title · job_title · job_details.title | Job titles |
category · job_category · job_details.category | Job categories |
workplace_type · job_details.workplace_type | Workplace types |
Verify the live list
Call the endpoint with a deliberately invalidfield. The 400 response
lists every currently accepted field in its error message:
Implementation tips for UI builders
Errors
| Status | Meaning |
|---|---|
400 | Invalid request — unsupported field, missing query, or limit out of range. |
401 | Unauthorized — the Authorization header is missing, malformed, or contains an invalid API key. |
500 | Internal server error — retry after a short delay. |
{ "error": { "type", "message", "metadata" } }. A query that matches
nothing is not an error — the endpoint returns {"suggestions": []} with
a 200 status.
API reference summary
| Detail | Value |
|---|---|
| Endpoint | POST /job/search/autocomplete |
| Auth | Bearer token + x-api-version: 2025-11-01 |
| Required params | field, query |
| Optional params | limit (default: 20, max: 100) |
| Response | { "suggestions": [{ "value": "..." }] } |
| Empty result | 200 with "suggestions": [] |
| Pricing | Free — no credits |
| Errors | 400 (unsupported field / bad request), 401 (bad auth), 500 (server error) |

