# Fantastic Jobs — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://api.orthogonal.com/v1/run` · [llms.txt](https://orthogonal.com/llms.txt) · [browse all APIs](https://orthogonal.com/discover)

High-volume job postings feed. Indexes new ATS jobs hourly from 54 ATS platforms across 200k+ companies, plus job board listings from LinkedIn, Wellfound, and Y Combinator. Includes 20+ AI enrichments per job and deep company enrichments from LinkedIn, Glassdoor, and Crunchbase.

**Verified:** yes

## Access

**Run API:** `POST https://api.orthogonal.com/v1/run`
**Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY`
Get an API key at https://orthogonal.com/dashboard/settings/api-keys

Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "<usd>", "data": { ... } }`.

## Endpoints

### New Job Board Jobs

Returns new jobs from LinkedIn, Wellfound, and Y Combinator. LinkedIn hourly for English-speaking countries; others every few hours. Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request.

`GET /v1/active-jb`

**Estimated cost:** $0.4

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `time_frame` | string | Yes | Required. Time window: 1h, 24h, 7d, or 6m |
| `limit` | integer | Yes | Results per page (1-1000, default 1000) |
| `offset` | string | No | Pagination offset For later offset pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `cursor` | string | No | Cursor pagination For later cursor pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `title` | string | No | Natural-language title search |
| `location` | string | No | Natural-language location search |
| `description` | string | No | Search on title and description combined |
| `description_format` | string | No | text or html |
| `source` | string | No | linkedin, wellfound, ycombinator |
| `organization` | string | No | Filter by exact org name(s) |
| `organization_slug` | string | No | Filter by LinkedIn org slug(s) |
| `organization_industry` | string | No | Filter by LinkedIn industry |
| `ai_experience_level` | string | No | AI-derived: 0-2, 2-5, 5-10, 10+ |
| `ai_work_arrangement` | string | No | AI-derived: On-site, Hybrid, Remote OK, Remote Solely |
| `ai_employment_type` | string | No | AI-derived: FULL_TIME, PART_TIME, CONTRACTOR, etc. |
| `has_salary` | string | No | Set true for jobs with salary info only |
| `exclude_ats_duplicate` | string | No | Set true to drop LinkedIn jobs matching ATS postings |
| `exclude_recruiter_fields` | string | No | Set true to exclude recruiter fields |
| `seniority` | string | No | LinkedIn seniority: Entry level, Mid-Senior level, Director, etc. |
| `linkedin_id` | string | No | Filter by LinkedIn job posting ID(s) |
| `id` | string | No | Filter by internal Fantastic.jobs ID(s) |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"fantastic-jobs","path":"/v1/active-jb","method":"GET","query":{"time_frame":"<string>","limit":"<integer>","offset":"<string>","cursor":"<string>","title":"<string>","location":"<string>","description":"<string>","description_format":"<string>","source":"<string>","organization":"<string>","organization_slug":"<string>","organization_industry":"<string>","ai_experience_level":"<string>","ai_work_arrangement":"<string>","ai_employment_type":"<string>","has_salary":"<string>","exclude_ats_duplicate":"<string>","exclude_recruiter_fields":"<string>","seniority":"<string>","linkedin_id":"<string>","id":"<string>"}}'
```

### New ATS Jobs

Returns new jobs from 54 ATS platforms (company career pages). Refreshed hourly. Supports 30+ filters including title, location, source, AI experience level, work arrangement, and more. Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request.

`GET /v1/active-ats`

**Estimated cost:** $0.4

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `time_frame` | string | Yes | Required. Time window: 1h, 24h, 7d, or 6m |
| `limit` | integer | Yes | Results per page (1-1000, default 1000) |
| `offset` | string | No | Pagination offset For later offset pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `cursor` | string | No | Cursor pagination. Pass last job id for next page For later cursor pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `title` | string | No | Natural-language title search. Quotes for exact phrase, OR for alternatives |
| `location` | string | No | Natural-language location search. Use full country names |
| `description` | string | No | Search on title and description combined |
| `description_format` | string | No | text or html. Omit to exclude description field |
| `source` | string | No | Comma-separated ATS sources (greenhouse, lever.co, workday, etc.) |
| `organization` | string | No | Filter by exact organization name(s), comma-separated |
| `organization_slug` | string | No | Filter by LinkedIn org slug(s), comma-separated |
| `organization_industry` | string | No | Filter by exact LinkedIn industry name |
| `domain` | string | No | Filter by employer domain(s) |
| `include_basic_organization_details` | string | No | Set true to include inline LinkedIn company fields |
| `ai_experience_level` | string | No | AI-derived: 0-2, 2-5, 5-10, 10+ |
| `ai_work_arrangement` | string | No | AI-derived: On-site, Hybrid, Remote OK, Remote Solely |
| `ai_employment_type` | string | No | AI-derived: FULL_TIME, PART_TIME, CONTRACTOR, INTERN, etc. |
| `ai_taxonomies_a_primary` | string | No | Match primary AI taxonomy only |
| `ai_taxonomies_a` | string | No | Match any assigned AI taxonomy |
| `has_salary` | string | No | Set true for jobs with salary info only |
| `date_posted_gte` | string | No | Jobs posted on or after this date (ISO 8601) |
| `date_posted_lt` | string | No | Jobs posted before this date (ISO 8601) |
| `organization_headcount_gte` | string | No | Min LinkedIn employee count |
| `organization_headcount_lt` | string | No | Max LinkedIn employee count |
| `organization_agency` | string | No | only or exclude recruitment agencies |
| `ai_visa_sponsorship` | string | No | only or exclude visa sponsorship listings |
| `id` | string | No | Filter by internal Fantastic.jobs ID(s) |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"fantastic-jobs","path":"/v1/active-ats","method":"GET","query":{"time_frame":"<string>","limit":"<integer>","offset":"<string>","cursor":"<string>","title":"<string>","location":"<string>","description":"<string>","description_format":"<string>","source":"<string>","organization":"<string>","organization_slug":"<string>","organization_industry":"<string>","domain":"<string>","include_basic_organization_details":"<string>","ai_experience_level":"<string>","ai_work_arrangement":"<string>","ai_employment_type":"<string>","ai_taxonomies_a_primary":"<string>","ai_taxonomies_a":"<string>","has_salary":"<string>","date_posted_gte":"<string>","date_posted_lt":"<string>","organization_headcount_gte":"<string>","organization_headcount_lt":"<string>","organization_agency":"<string>","ai_visa_sponsorship":"<string>","id":"<string>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/fantastic-jobs
