# Remote OK API

> Remote OK returns remote job listings and salary details as a workflow and API.

Remote OK searches recent public job listings by role or skill and returns matching jobs, newest first. Search jobs requires keywords and optionally accepts a work region, maximum results, and minimum annual salary in USD.

- Page: https://fous.com/workflows/remote-ok
- Handle: `@remote-ok`
- Category: [Jobs](https://fous.com/workflows/category/jobs)
- Source website: https://remoteok.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with Remote OK.

## Methods

### Search jobs

Operation `search_jobs`, version 1. 1 credit per call.

Search Remote OK jobs by role or skill, optionally narrowing by listed work region and minimum annual USD salary. Search covers the recent public listings and a matching skill feed when available; region filtering excludes jobs whose listed location cannot establish eligibility. Jobs without a stated salary do not match a salary minimum. Remote OK is the source; each result links to its Remote OK job page.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `region` | string | no | `"north_america"` | Location eligibility, for example europe; any does not restrict locations. |
| `keywords` | string | yes | `"python"` | Role or skill to search, for example python or customer support. |
| `max_results` | integer | no | `10` | Maximum jobs to return, for example 25. |
| `minimum_salary_usd` | integer | no | `100000` | Minimum stated annual salary in USD, for example 100000. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "keywords"
  ],
  "properties": {
    "region": {
      "enum": [
        "any",
        "worldwide",
        "north_america",
        "europe",
        "latin_america",
        "asia",
        "oceania",
        "africa"
      ],
      "type": "string",
      "default": "any",
      "description": "Location eligibility, for example europe; any does not restrict locations.",
      "examples": [
        "north_america",
        "europe"
      ]
    },
    "keywords": {
      "type": "string",
      "minLength": 1,
      "description": "Role or skill to search, for example python or customer support.",
      "examples": [
        "python",
        "customer support",
        "nonexistentxqvpzskill"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 25,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum jobs to return, for example 25.",
      "x-fous-developer": true,
      "examples": [
        10
      ]
    },
    "minimum_salary_usd": {
      "type": "integer",
      "minimum": 0,
      "description": "Minimum stated annual salary in USD, for example 100000.",
      "examples": [
        100000
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "keywords": "python"
    },
    {
      "region": "north_america",
      "keywords": "customer support",
      "max_results": 10
    },
    {
      "keywords": "python",
      "max_results": 10,
      "minimum_salary_usd": 100000
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `jobs` | array |  | Matching jobs, newest first. |
| `jobs[].tags` | array |  | Job tags. |
| `jobs[].title` | string | `"Customer Success Manager Mexico"` | Job title. |
| `jobs[].company` | string | `"JumpCloud"` | Hiring company. |
| `jobs[].job_url` | string | `"https://remoteOK.com/remote-jobs/remote-customer-success-manager-mexico-jumpcloud-1137406"` | Remote OK page for this job. |
| `jobs[].posted_date` | string or null | `"2026-09-19"` | Date posted (YYYY-MM-DD), or null if missing. |
| `jobs[].salary_max_usd` | integer or null | `220000` | Maximum stated annual salary in USD, or null if not supplied. |
| `jobs[].salary_min_usd` | integer or null | `190000` | Minimum stated annual salary in USD, or null if not supplied. |
| `jobs[].company_logo_url` | string or null |  | Company logo link, or null if unavailable. |
| `jobs[].location_restrictions` | string or null | `"Mexico City, Mexico - Remote"` | Listed work location or eligibility, or null if not stated. |

**Example input**

```json
{
  "region": "north_america",
  "keywords": "customer support",
  "max_results": 10
}
```

**Example output**

```json
{
  "jobs": [
    {
      "tags": [
        "customer support",
        "exec",
        "saas"
      ],
      "title": "Customer Success Manager Mexico",
      "company": "JumpCloud",
      "job_url": "https://remoteOK.com/remote-jobs/remote-customer-success-manager-mexico-jumpcloud-1137406",
      "posted_date": "2026-09-19",
      "salary_max_usd": null,
      "salary_min_usd": null,
      "company_logo_url": null,
      "location_restrictions": "Mexico City, Mexico - Remote"
    },
    {
      "tags": [
        "exec",
        "design",
        "sys admin"
      ],
      "title": "Engineering Manager TLM Platform",
      "company": "Harper",
      "job_url": "https://remoteOK.com/remote-jobs/remote-engineering-manager-tlm-platform-harper-1137380",
      "posted_date": "2026-09-11",
      "salary_max_usd": null,
      "salary_min_usd": null,
      "company_logo_url": null,
      "location_restrictions": "San Francisco"
    },
    {
      "tags": [
        "design",
        "game dev",
        "designer"
      ],
      "title": "Senior Level Designer",
      "company": "Blackbird Interactive",
      "job_url": "https://remoteOK.com/remote-jobs/remote-senior-level-designer-blackbird-interactive-1137156",
      "posted_date": "2026-08-27",
      "salary_max_usd": null,
      "salary_min_usd": null,
      "company_logo_url": null,
      "location_restrictions": "Vancouver, BC, Canada"
    }
  ]
}
```

## Quick start

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@remote-ok",
  "visibility": "public",
  "operation": "search_jobs",
  "version": 1,
  "input": {
    "keywords": "python"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

body = json.loads("{\n  \"api\": \"@remote-ok\",\n  \"visibility\": \"public\",\n  \"operation\": \"search_jobs\",\n  \"version\": 1,\n  \"input\": {\n    \"keywords\": \"python\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_000),
  body: JSON.stringify({
  "api": "@remote-ok",
  "visibility": "public",
  "operation": "search_jobs",
  "version": 1,
  "input": {
    "keywords": "python"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

Or describe the data in plain language: send `{"api":"@remote-ok","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## Use cases

- Find jobs matching a role or skill
- Filter listings by work region
- Find jobs meeting a salary minimum
- Review hiring companies and job titles
- Track job posting dates

## FAQ

### Is Fous affiliated with Remote OK?

No. Fous is not affiliated with Remote OK. This workflow reads the public remoteok.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. With pay-as-you-go, a credit costs 1¢; monthly plans cost less per credit.

### Do I need a Remote OK account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from remoteok.com when you run it; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check on Sep 29, 2026.

### What jobs match a role or skill?

Search jobs finds listings that match the required keywords and returns jobs newest first.

### Can I filter jobs by location?

Search jobs accepts a region; jobs whose listed location cannot establish eligibility are excluded when region filtering is used.

### Which jobs meet a minimum salary?

Search jobs accepts a minimum annual salary in USD and returns matching listings.

## Related

- [Indeed API](https://fous.com/workflows/indeed.md): Indeed returns public first-page listings and details for available, unexpired jobs, company employee ratings and CEO approval when available, and typical pay from public salary pages.
- [ZipRecruiter API](https://fous.com/workflows/ziprecruiter.md): ZipRecruiter returns up to 100 public job listings per search and U.S. job-title pay ranges and top-paying cities where public salary pages exist.
- [LinkedIn API](https://fous.com/workflows/linkedin.md): LinkedIn returns publicly visible company information, recent company posts, open job listings and details, and similar midsized robotics companies; closed jobs, hidden details, and exhaustive company matches are unavailable.
- [USAJOBS API](https://fous.com/workflows/usajobs.md): Federal government job listings and announcements.
- [Google Search API](https://fous.com/workflows/google-search.md): Google Search returns public web, image, job, event, related-question, and autocomplete results in Google’s order, with answers and details when available; results may be fewer, omit information, or be empty.
- [SEEK API](https://fous.com/workflows/seek.md): Search open jobs across Australia on SEEK.
- [Lever API](https://fous.com/workflows/lever.md): Public job boards for companies hiring through Lever.
- [Levels.fyi API](https://fous.com/workflows/levels-fyi.md): Levels.fyi returns published per-level median annual pay, rankings of up to 50 companies by role/location median total pay, and cross-company pay comparisons for 2–10 companies.
- [All Jobs workflows](https://fous.com/workflows/category/jobs)
