# 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/tools/remote-ok
- Handle: `@remote-ok`
- Category: [Jobs](https://fous.com/tools/category/jobs)
- Source website: https://remoteok.com
- Last verified: Sep 29, 2026

## Methods

### Search jobs

Operation `search_jobs`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

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 | `"Sr Solutions Architect"` | Job title. |
| `jobs[].company` | string | `"ExtraHop"` | Hiring company. |
| `jobs[].job_url` | string | `"https://remoteOK.com/remote-jobs/remote-sr-solutions-architect-extrahop-1137394"` | Remote OK page for this job. |
| `jobs[].posted_date` | string or null | `"2026-09-15"` | 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 | `"Remote"` | Listed work location or eligibility, or null if not stated. |

**Example input**

```json
{
  "keywords": "python"
}
```

**Example output**

```json
{
  "jobs": [
    {
      "tags": [
        "architecture",
        "design",
        "infosec"
      ],
      "title": "Sr Solutions Architect",
      "company": "ExtraHop",
      "job_url": "https://remoteOK.com/remote-jobs/remote-sr-solutions-architect-extrahop-1137394",
      "posted_date": "2026-09-15",
      "salary_max_usd": null,
      "salary_min_usd": null,
      "company_logo_url": null,
      "location_restrictions": "Remote"
    },
    {
      "tags": [
        "full stack",
        "front end",
        "python"
      ],
      "title": "DESARROLLADOR FULL STACK",
      "company": "Kruger NearShore LLC - Rekluti",
      "job_url": "https://remoteOK.com/remote-jobs/remote-desarrollador-full-stack-kruger-nearshore-llc-rekluti-1137062",
      "posted_date": "2026-08-22",
      "salary_max_usd": null,
      "salary_min_usd": null,
      "company_logo_url": null,
      "location_restrictions": null
    },
    {
      "tags": [
        "dev",
        "front end",
        "python"
      ],
      "title": "Senior Software Engineer Case Execution",
      "company": "Pivotal Health",
      "job_url": "https://remoteOK.com/remote-jobs/remote-senior-software-engineer-case-execution-pivotal-health-1136795",
      "posted_date": "2026-08-16",
      "salary_max_usd": 220000,
      "salary_min_usd": 190000,
      "company_logo_url": null,
      "location_restrictions": "New York City"
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_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.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

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=180) 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.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_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);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/remote-ok`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `search_jobs`: Search jobs. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-remote-ok https://api.fous.com/mcp/tools/remote-ok --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## 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

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this Remote OK tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. 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. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified 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/tools/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/tools/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/tools/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/tools/usajobs.md): Federal government job listings and announcements.
- [Google Search API](https://fous.com/tools/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.
- [Naukri API](https://fous.com/tools/naukri.md): Search public job listings in India.
- [SEEK API](https://fous.com/tools/seek.md): Search open jobs across Australia on SEEK.
- [Lever API](https://fous.com/tools/lever.md): Public job boards for companies hiring through Lever.
- [All Jobs tools](https://fous.com/tools/category/jobs)
