_ registry / mcp http-sse · checked 1h ago

fairquery-company-jobs-feed

https://mcp.getfairquery.com

Registry code: a76106ae3165d6fc

api record

Company Jobs Feed (jobs_* only): live openings from the public Greenhouse, Lever and Ashby APIs, plus Personio's documented XML feed, Pinpoint's documented postings.json, and a named Gem job board when you already know the account. Free tools: jobs_get_board, jobs_get_job, jobs_find_board, jobs_check_open, jobs_list_seed_boards, jobs_search_by_location. Paid: jobs_search_companies (Actor fairquery/company-jobs-feed). SmartRecruiters, LinkedIn, Workday, Workable, Recruitee and Rippling are not supported and are never contacted. This is Fairquery's hosted Company Jobs Feed MCP (stateless…

endpoint
https://mcp.getfairquery.com/jobs/mcp
protocol
http-sse ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is fairquery-company-jobs-feed live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is fairquery-company-jobs-feed free to use?
Yes — the hub reached it with no key and no payment.
What tools does fairquery-company-jobs-feed have?
7 tools: jobs_get_board, jobs_find_board, jobs_search_by_location, jobs_search_companies, jobs_check_open, jobs_get_job, jobs_list_seed_boards.
Is fairquery-company-jobs-feed safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
278ms

last good check

priced tools
0

of 7 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 7 tools
1 open 6 never probed 1 of 7 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • jobs_list_seed_boards open 1h ago

    WHAT: List the bundled starter list of company job boards that Fairquery verified on their official ATS APIs (company, domain, ats, slug, verified_at, jobs_at_verification). WHEN: To pick companies to scan, or to know which names jobs_find_board resolves instantly. WHEN NOT: Live jobs on one board (jobs_get_board), a place search across this list (jobs_search_by_location), or companies not in the list (jobs_find_board). The list is a starting point, not a global index of employers. BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. No further network call: it reads a static list compiled into this Worker. jobs_at_verification is a snapshot from verified_at and goes stale. COST: No APIFY_TOKEN, no billing. RETURNS: Paged "seed_board" rows in the fixed bundled order (original boards stay first, so earlier offsets stay put). 135 Greenhouse, Lever and Ashby boards. PARAMETERS: ats narrows the list; omit it for the whole starter list (Greenhouse, Lever, Ashby). Personio, Pinpoint and Gem are not in the starter list (named accounts only). meta.by_ats always counts the whole list per ATS and ignores ats, so take paging totals from total. Feed ats + slug of any item straight into jobs_get_board. EXAMPLE: {"ats":"lever"} -> Palantir, Spotify, Zoox, Ro, then more Lever boards.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "ats": {
          "enum": [
            "greenhouse",
            "lever",
            "ashby",
            "personio",
            "pinpoint",
            "gem"
          ],
          "type": "string",
          "description": "Optional filter: \"greenhouse\" | \"lever\" | \"ashby\" | \"personio\" | \"pinpoint\" | \"gem\"; default all. The starter list has no Personio, Pinpoint or Gem boards"
        },
        "limit": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "Optional page size, integer 1-500, default 100"
        },
        "offset": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "Optional items to skip, integer >= 0, default 0; pass nextOffset from the previous response"
        }
      }
    }
    arguments 30 lines
  • jobs_get_board unknown never probed

    WHAT: Fetch every job currently published on ONE company board from its official public ATS API (Greenhouse, Lever or Ashby), from Personio's documented XML feed, from Pinpoint's documented postings.json, or from a named Gem job board, normalize it and filter it on this Worker. WHEN: You know the board (ats + slug), e.g. from jobs_find_board or a careers-page link, and want its live openings now. For Personio, Pinpoint and Gem you already know the company account, subdomain or vanity. WHEN NOT: One known job's full detail (jobs_get_job). Jobs in a place or by role across the starter list, without a company name (jobs_search_by_location). Do not ask the user for a company and do not call this tool or jobs_find_board first for that ask. Many companies at once, history (new/closed/reposted since last run), or careers-page discovery at scale: use jobs_search_companies (paid). Unknown Greenhouse/Lever/Ashby board: use jobs_find_board first. Personio, Pinpoint and Gem are never discovered. SmartRecruiters, LinkedIn, Workday, Workable, Recruitee and Rippling are not supported and never contacted. BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. The slug is sent to the public ATS host in the requests below. Greenhouse, Lever and Ashby: one GET to the documented API host only (very large Greenhouse boards: a second, lighter GET). Personio: robots.txt, then GET https://{account}.jobs.personio.de/xml only; all Personio accounts share one lane, one at a time, at least 1.5 s apart. Pinpoint: that tenant's robots.txt, then GET https://{subdomain}.pinpointhq.com/postings.json only (not jobs.json, not /api/v1); each subdomain is its own lane, one at a time, at least 1 s apart. Gem: GET https://api.gem.com/job_board/v0/{vanity}/job_posts/ only (no API key, no POST /applications); every vanity shares one lane, one at a time, at least 1 s apart. Pinpoint and Gem description_text stay empty (link out; the ad body is not copied). Gem job_url points at jobs.gem.com. Pinpoint job_url is the tenant listing link. Emails and phones are not kept from a Pinpoint posting. Nothing stored, no history: first_seen_at = now and change = null. Any HTTP 403/429 stops that host for the session (kill switch, HOST_BLOCKED error). A blocked Personio or Pinpoint host does not block other companies. A blocked Gem response stops api.gem.com for the session. Lever requests are spaced 1 s apart (its robots.txt Crawl-delay). COST: No APIFY_TOKEN, no billing. RETURNS: Paged "job" rows. compensation only when the ATS publishes it; posted_at is the ATS date or null (never guessed); age_basis says how age_days was derived. PARAMETERS: All filters are AND-ed; values inside one filter are OR-ed. titleIncludes/titleExcludes match whole words ("engineer" does not match "Engineering"). countries uses the ATS's structured country where present (Lever, Ashby) and a place-name list otherwise; rows without any country are dropped when countries is set. postedWithinDays drops rows with posted_at = null. Paging re-fetches the board, so pages from different calls can shift if the employer edits the board in between. EXAMPLE: {"ats":"ashby","slug":"ramp","titleIncludes":["engineer"],"remote":"only"} -> remote engineering roles at Ramp with salary ranges.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "ats",
        "slug"
      ],
      "properties": {
        "ats": {
          "enum": [
            "greenhouse",
            "lever",
            "ashby",
            "personio",
            "pinpoint",
            "gem"
          ],
          "type": "string",
          "description": "Required. The applicant-tracking system hosting the board: \"greenhouse\" | \"lever\" | \"ashby\" | \"personio\" | \"pinpoint\" | \"gem\". Personio, Pinpoint and Gem are the account, subdomain or vanity you name, not a discovered board. Example: \"ashby\""
        },
        "slug": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$",
          "description": "Required. Board slug as it appears in the public board URL (case-insensitive): boards.greenhouse.io/{slug}, jobs.lever.co/{slug}, jobs.ashbyhq.com/{slug}, the Personio account in {account}.jobs.personio.de, the Pinpoint subdomain in {subdomain}.pinpointhq.com, or the Gem vanity in jobs.gem.com/{vanity}. Named feeds reject a dot. 1-100 chars. Example: \"ramp\" or \"acme\""
        },
        "limit": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "Optional page size, integer 1-500, default 50"
        },
        "offset": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "Optional items to skip, integer >= 0, default 0; pass nextOffset from the previous response"
        },
        "remote": {
          "enum": [
            "any",
            "only",
            "exclude"
          ],
          "type": "string",
          "description": "Optional, \"any\" | \"only\" | \"exclude\", default \"any\""
        },
        "countries": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$"
          },
          "maxItems": 50,
          "description": "Optional ISO-3166 alpha-2 codes, any-of, case-insensitive. Example: [\"US\",\"DE\"]"
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Substring match on location text. US state names and codes match both ways (FL and Florida); NYC, SF, LA, DC, Tampa Bay and other US metro aliases match. \"remote\" also matches ATS remote flags. Example: [\"new york\",\"berlin\"]"
        },
        "longOpenDays": {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1,
          "description": "Optional integer, default 60: rows older than this get long_open = true (a heuristic, not proof of a ghost job)"
        },
        "titleExcludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Drop titles containing any of these. Example: [\"intern\",\"manager\"]"
        },
        "titleIncludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Keep titles containing any of these whole words/phrases, case-insensitive. Example: [\"engineer\",\"data scientist\"]"
        },
        "postedWithinDays": {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1,
          "description": "Optional integer 1-3650: keep jobs whose ATS publish date is at most this many days old. Example: 14"
        },
        "includeDescription": {
          "type": "boolean",
          "description": "Optional boolean, default false. true adds description_text (plain text, <= 20,000 chars, e-mails/phones removed)"
        }
      }
    }
    arguments 103 lines
  • jobs_find_board unknown never probed

    WHAT: Resolve a company name, domain or careers/board URL to its public job board(s) on Greenhouse, Lever or Ashby. A Personio, Pinpoint or Gem URL (or personio:account, pinpoint:subdomain, gem:vanity) you already know is parsed on this Worker and not looked up. WHEN: Before jobs_get_board when you only know the company ("Ramp", "sentry.io", "https://stripe.com/jobs") or you have a Personio, Pinpoint or Gem career URL. WHEN NOT: The user asked for jobs in a place or by role and did not name a company. Call jobs_search_by_location. Do not ask them for a company and do not call this tool first. You already have ats + slug (call jobs_get_board). For many companies plus history use jobs_search_companies (paid). It cannot find Workday, Workable, Recruitee, Rippling or LinkedIn pages, and it does not discover Personio, Pinpoint or Gem boards. BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. Parts of the input are sent to public ATS hosts or the company site, as the steps below describe. Order: board-URL parsing (including personio:{account}, pinpoint:{subdomain}, gem:{vanity} and their public board URLs, no network) -> verified starter list -> the company's own website (only for a domain/URL input; robots.txt respected, <= 3 pages, private/internal IPs refused; Personio, Pinpoint and Gem hosts are not crawled) -> at most 6 GETs against the Greenhouse, Lever and Ashby APIs with slug guesses. Personio, Pinpoint and Gem are never probed and a careers-page link to them is ignored. Stops at the first hit. Nothing is cached or stored. Rate limits: max 2 parallel requests per host, Lever spaced 1 s apart, 15 s timeout per GET; ATS API network errors and HTTP 5xx are retried at most twice with backoff (0.5-1.6 s). Any HTTP 403/429 (or an HTML block page from an ATS API) stops that host for the session (kill switch, never retried, also for the other free tools): the call does not fail but adds a HOST_BLOCKED note to meta.notes, stops the careers-page step when the company site is blocked, and skips later slug probes on a stopped ATS host without sending them. COST: No APIFY_TOKEN and no billing; worst case about 4 website requests (robots.txt + 3 pages) and 6 ATS API GETs per call. RETURNS: "board" rows, or one NO_BOARD_FOUND error row. via (board_url | seed_list | careers_page | slug_probe) says how the board was found; confidence is "high" except for slug_probe hits ("medium": the slug exists but may belong to a different company with the same name, so check the jobs or pass the URL from the careers page). PARAMETERS: company accepts three forms with different behavior: a board URL (including a Personio, Pinpoint or Gem URL, or personio:account / pinpoint:subdomain / gem:vanity) is parsed with no network call; a domain or https URL enables the careers-page step; a plain name only uses the starter list and slug probes. Slug guesses for a name drop legal suffixes and "the" (Inc, LLC, Ltd, GmbH, Corp, Co, PLC, AG, SA, BV) and try the joined words, the hyphenated words and the first word; probes run Greenhouse, Lever, Ashby in that order (never Personio, Pinpoint or Gem) and the first hit wins, so an ambiguous name returns at most one medium-confidence board. A starter-list match can return several boards (all high). EXAMPLE: {"company":"ramp.com"} -> [{"ats":"ashby","slug":"ramp","via":"seed_list","confidence":"high"}].

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "company"
      ],
      "properties": {
        "company": {
          "type": "string",
          "maxLength": 300,
          "minLength": 2,
          "description": "Required. Company name, domain or URL, 2-300 chars. Examples: \"Ramp\", \"sentry.io\", \"https://jobs.lever.co/palantir\""
        }
      }
    }
    arguments 15 lines
  • jobs_search_by_location unknown never probed

    WHAT: Free search across every company on the bundled starter list. No company name. Live jobs from each board's official public Greenhouse, Lever or Ashby API. Same normalized "job" rows as jobs_get_board. WHEN: The user asks for jobs by place and/or role and does not name a company. Call THIS tool immediately. Do not ask the user for a company. Do not call jobs_get_board or jobs_find_board first. Examples: "avionics jobs in Baltimore MD", "remote RN jobs in PA", "nursing jobs in Maryland". Put the place in locations (Baltimore, Baltimore MD, MD, Maryland, BWI, PA) or countries, or set remote to "only". Put a skill or role that may not be the job title in descriptionIncludes (avionics, nurse), not in titleIncludes. WHEN NOT: The user already named one company or board (jobs_find_board, then jobs_get_board). They want history, closed jobs, reposts, or employers outside this starter list (jobs_search_companies, paid). The starter list is not every employer. BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. Each starter-list board slug is sent to its public ATS host. Requires a place signal or it returns INVALID_INPUT and does not fetch: a non-empty locations list, a non-empty countries list, or remote "only". Fetches every starter board with the same client, kill switch and rate limits as the other free tools (at most 2 requests in flight per host, Lever spaced 1 s apart, up to 6 boards at a time). Greenhouse is read from the list without job bodies. descriptionIncludes and includeDescription send a second request to that same Greenhouse host only for boards that already have a job in the place. Lever and Ashby descriptions are in the one list response. Each board is read in 8 KB slices, one job at a time. Description fields are not copied unless descriptionIncludes or includeDescription needs them. A text field longer than 20,000 characters is cut before matching and named in meta.notes. A board that is still too large (3 MB) is cut off and the scan continues with the other boards. A missing board (BOARD_NOT_FOUND) is skipped. A board error is skipped and named in meta.notes. HOST_BLOCKED stops that host for the session; other hosts continue. The scan stops early on a 25s wall-clock budget or an 8s synchronous CPU budget and returns the jobs already matched (meta.partial true, meta.stop_reason "time_budget" or "cpu_budget"); it does not invent jobs. Nothing is stored. Paging re-fetches, so pages from different calls can shift if an employer edits a board. COST: No APIFY_TOKEN, no billing. meta.cost_usd is 0. RETURNS: Paged "job" rows. meta.boards_total, meta.boards_scanned (boards that finished), meta.boards_ok, meta.boards_failed, meta.boards_skipped, meta.jobs_matched, meta.partial, meta.notes and meta.cost_usd. meta.stop_reason is "time_budget" or "cpu_budget" when partial is true. When jobs_matched is 0 after at least one board answered, meta.suggestions lists the title and description tokens tried, place aliases that had open roles, a sample of open titles in the requested place with the keyword removed, and a note that this list is not every employer and which ATS are covered. Suggestions are not job listings. PARAMETERS: At least one of locations, countries or remote "only" is required. There is no company parameter. titleIncludes and titleExcludes are whole words on the title only. descriptionIncludes is whole-word on the title or the scrubbed description, so "avionics" matches Electrical Technician when the body says avionics. Do not put the same word in both titleIncludes and descriptionIncludes. "RN" matches RN, not "Registered Nurse". titleRegex is optional. postedWithinDays drops rows with no ATS date. includeDescription adds scrubbed plain text to the rows; descriptionIncludes still matches when it is false and does not add that text. Location terms expand US state names and codes both ways (MD and Maryland, PA and Pennsylvania) and metro aliases (NYC, SF, LA, DC, Tampa Bay, Baltimore / Baltimore MD / BWI). Two-letter codes match as whole tokens. countries stays ISO-2. EXAMPLE: {"locations":["Baltimore MD"],"descriptionIncludes":["avionics"]} -> starter-list jobs in Baltimore (or BWI) whose title or description says avionics. No company.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "Optional page size, integer 1-500, default 50"
        },
        "offset": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "Optional items to skip, integer >= 0, default 0; pass nextOffset from the previous response"
        },
        "remote": {
          "enum": [
            "any",
            "only",
            "exclude"
          ],
          "type": "string",
          "description": "Optional, \"any\" | \"only\" | \"exclude\", default \"any\". \"only\" is a place signal and keeps remote jobs. \"exclude\" alone does not start a scan."
        },
        "countries": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$"
          },
          "maxItems": 50,
          "description": "Optional ISO-3166 alpha-2 codes, any-of, case-insensitive. Counts as a place signal. Example: [\"US\"]"
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Place names, any-of. US state names and codes match both ways (Baltimore MD, MD, Maryland, FL, Florida). Metro aliases include NYC, SF, LA, DC, Tampa Bay, and Baltimore / BWI. \"remote\" also matches ATS remote flags. At least one of locations, countries or remote \"only\" is required. This tool has no company parameter. Example: [\"Tampa\"]"
        },
        "titleRegex": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Optional case-insensitive regular expression the title must match (max 200 characters, no nested quantifiers). Example: \"^senior\\\\b\""
        },
        "longOpenDays": {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1,
          "description": "Optional integer, default 60: rows older than this get long_open = true (a heuristic, not proof of a ghost job)"
        },
        "titleExcludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Drop titles containing any of these. Example: [\"intern\"]"
        },
        "titleIncludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Keep titles containing any of these whole words/phrases, case-insensitive. Title only. For a skill that may appear only in the posting, use descriptionIncludes instead. Example: [\"engineer\"]"
        },
        "postedWithinDays": {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1,
          "description": "Optional integer 1-3650: keep jobs whose ATS publish date is at most this many days old. Example: 14"
        },
        "includeDescription": {
          "type": "boolean",
          "description": "Optional boolean, default false. true adds description_text (plain text, <= 20,000 chars, e-mails/phones removed)"
        },
        "descriptionIncludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Whole words matched against the title OR the scrubbed description, case-insensitive, any-of. Use this for a role or skill that may not be the job title (\"avionics\" matches Electrical Technician when the body says avionics). Do not also put the same word in titleIncludes. \"RN\" does not match \"Registered Nurse\". Reads the description from the same board request. The row includes description_text only when includeDescription is true. Example: [\"avionics\"]"
        }
      }
    }
    arguments 98 lines
  • jobs_search_companies unknown never probed

    WHAT: Run the Fairquery Apify Actor fairquery/company-jobs-feed over many companies or boards: board discovery for Greenhouse, Lever and Ashby, a Personio, Pinpoint or Gem feed when you name it, search filters, per-board history (first_seen/last_seen, new/updated/closed, repost detection), optional per-job re-checks and descriptions. WHEN: Monitoring a company list ("what is new since yesterday?"), searching the verified starter list, or anything that needs history, closed/repost signals or more than a few boards. WHEN NOT: One board right now (jobs_get_board). A place or role search of the starter list with no company name and no history (jobs_search_by_location — call that first; do not ask for a company). One job's full detail (jobs_get_job), or one open/closed re-check (jobs_check_open). BEHAVIOR: Read-only on job sites; requires APIFY_TOKEN. Called from this Fairquery-hosted Worker, which forwards your input and token to Apify and waits 20 s (APIFY_TIMEOUT if the run has not finished). The Actor runs in YOUR Apify account; history is kept in a named key-value store there. This Worker's code is designed not to store the input or token. Same politeness rules as the free jobs tools: documented ATS APIs only, Personio only at https://{account}.jobs.personio.de/xml after robots.txt, Pinpoint only at https://{subdomain}.pinpointhq.com/postings.json after robots.txt, Gem only at https://api.gem.com/job_board/v0/{vanity}/job_posts/ with no API key, 403/429 kill switch, robots.txt on careers pages. Personio, Pinpoint and Gem are not discovered. Pinpoint and Gem rows link out and do not copy the ad body. Output is that run's rows, not a public jobs directory. COST: Paid, pay-per-event, billed to your Apify account: $0.99 per 1,000 jobs + $0.50 per 1,000 boards, plus optional $0.29 per 1,000 re-checks (confirmOpen) and $1.90 per 1,000 discovered companies; no start fee. Error, closed and merged rows are free. Example: 3 boards, 300 jobs = about $0.30. RETURNS: Paged dataset rows: "job" rows (as jobs_get_board plus first_seen_at, last_seen_at, change, reposted, repost_of, stale_signal, duplicate_of), one "board" row per board (jobs_total, new, updated, closed), "company" rows for discovery, "error" rows (code, message, retryable). PARAMETERS: companies, boards and useSeedList: at least one is required although the schema marks all optional (none -> INPUT_EMPTY, not billed). onlyNew implies history and compares with the last run that used the same stateStoreName, so use one name per saved search; the first run returns everything as new. limit/offset page the returned rows on this Worker; every call starts a new billed run, so fetch the pages you need from one result instead of re-calling. EXAMPLE: {"companies":["stripe.com","ramp.com"],"titleIncludes":["engineer"],"countries":["US"],"onlyNew":true}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "Optional page size, integer 1-500, default 50"
        },
        "boards": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "ats",
              "slug"
            ],
            "properties": {
              "ats": {
                "enum": [
                  "greenhouse",
                  "lever",
                  "ashby",
                  "personio",
                  "pinpoint",
                  "gem"
                ],
                "type": "string",
                "description": "Required. The applicant-tracking system hosting the board: \"greenhouse\" | \"lever\" | \"ashby\" | \"personio\" | \"pinpoint\" | \"gem\". Personio, Pinpoint and Gem are the account, subdomain or vanity you name, not a discovered board. Example: \"ashby\""
              },
              "slug": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$",
                "description": "Required. Board slug as it appears in the public board URL (case-insensitive): boards.greenhouse.io/{slug}, jobs.lever.co/{slug}, jobs.ashbyhq.com/{slug}, the Personio account in {account}.jobs.personio.de, the Pinpoint subdomain in {subdomain}.pinpointhq.com, or the Gem vanity in jobs.gem.com/{vanity}. Named feeds reject a dot. 1-100 chars. Example: \"ramp\" or \"acme\""
              },
              "company": {
                "type": "string",
                "maxLength": 200,
                "description": "Optional display name"
              }
            }
          },
          "maxItems": 500,
          "description": "Optional. 0-500 exact boards. Example: [{\"ats\":\"lever\",\"slug\":\"palantir\"}]"
        },
        "offset": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "Optional items to skip, integer >= 0, default 0; pass nextOffset from the previous response"
        },
        "remote": {
          "enum": [
            "any",
            "only",
            "exclude"
          ],
          "type": "string",
          "description": "Optional, \"any\" | \"only\" | \"exclude\", default \"any\" (no remote filter). \"only\" keeps job rows with remote = true (an ATS remote flag, or remote wording such as \"Remote\" or \"Anywhere\" in the location or title; see remote_basis); \"exclude\" drops those rows and keeps rows where remote is false or unknown (null)"
        },
        "maxJobs": {
          "type": "integer",
          "maximum": 50000,
          "minimum": 1,
          "description": "Optional integer 1-50000, default 5000: spend cap on billed job rows"
        },
        "onlyNew": {
          "type": "boolean",
          "description": "Optional boolean, default false: only new/changed jobs since the last tracked run (plus free closed rows)"
        },
        "companies": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 300,
            "minLength": 2
          },
          "maxItems": 200,
          "description": "Optional (see PARAMETERS). 0-200 names, domains or board URLs. Example: [\"stripe.com\",\"Ramp\",\"https://jobs.lever.co/palantir\"]"
        },
        "countries": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$"
          },
          "maxItems": 50,
          "description": "Optional ISO-2 codes, any-of. Example: [\"US\",\"GB\"]"
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Location substring match. US state names and codes match both ways; NYC, SF, LA, DC and Tampa Bay metro aliases match. Example: [\"london\"]"
        },
        "confirmOpen": {
          "type": "boolean",
          "description": "Optional boolean, default false: re-check each emitted job on its detail endpoint ($0.29 per 1,000 re-checks, max 200 per run)"
        },
        "departments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Department/team substring match. Example: [\"engineering\"]"
        },
        "useSeedList": {
          "type": "boolean",
          "description": "Optional boolean, default false: also scan all verified starter boards (each billed as a board)"
        },
        "excludeStale": {
          "type": "boolean",
          "description": "Optional boolean, default false. true drops job rows with long_open = true (age_days > 60, counted from posted_at, or from first_seen_at when the ATS gives no date) or reposted = true (a new job id matching a job that closed on the same board within 90 days, from the history in stateStoreName, so never on a board's first tracked run). Free closed rows are not filtered by it"
        },
        "titleExcludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Whole-word title exclusion. Example: [\"intern\"]"
        },
        "titleIncludes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Optional, 0-50 strings, any-of. Whole-word title match. Example: [\"engineer\"]"
        },
        "stateStoreName": {
          "type": "string",
          "pattern": "^[a-zA-Z0-9-]{3,63}$",
          "description": "Optional, default \"fairquery-jobs-feed-state\": named key-value store for history in your Apify account"
        },
        "postedWithinDays": {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1,
          "description": "Optional integer 1-3650, default off: keep only job rows whose ATS publish date (posted_at) is at most this many whole days old; rows without an ATS publish date (posted_at = null) are dropped. Free closed rows are not filtered by it. Example: 7"
        },
        "includeDescription": {
          "type": "boolean",
          "description": "Optional boolean, default false: add plain-text descriptions (PII-scrubbed)"
        }
      }
    }
    arguments 159 lines
  • jobs_check_open unknown 1h ago

    WHAT: Re-check ONE job on the employer's ATS right now and report open or closed. WHEN: Before applying, alerting or contacting about a specific job you got earlier (job_key or ats + slug + jobId), when you only need open or closed. WHEN NOT: One job's full detail (jobs_get_job). Listing a board (jobs_get_board). Checking many jobs at once (jobs_search_companies with confirmOpen, paid). BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. The job id and board slug are sent to the public ATS host in the requests below. Greenhouse, Lever: one GET to the documented per-job endpoint; HTTP 404 = closed. Ashby, Personio, Pinpoint and Gem have no per-job read here, so the documented board feed is fetched once and searched for the id (method "board_listing"). Personio is robots.txt then /xml. Pinpoint is robots.txt then /postings.json. Gem is GET /job_posts/ only. No apply URL is requested. "open" means currently published by the employer; it does not prove the role is still being filled. COST: No APIFY_TOKEN, no billing. RETURNS: One "open_check" row (job = the full "job" row when includeDescription=true and the job is open, else null), or a tool error: INVALID_INPUT, BOARD_NOT_FOUND, HOST_BLOCKED or NETWORK_ERROR (the last two retryable). PARAMETERS: A malformed jobKey, or neither jobKey nor a complete ats + slug + jobId, returns INVALID_INPUT without a request. An Ashby, Personio, Pinpoint or Gem id costs one full board download; on Greenhouse and Lever a 404 triggers one extra board request so a closed job (status closed) is told apart from a missing board (BOARD_NOT_FOUND). includeDescription adds no request on Greenhouse and Lever and makes the Ashby or Personio board download include descriptions. Pinpoint and Gem description_text stay empty (the row links out). description_text is plain text, <= 20,000 chars, e-mails/phones removed, exactly as in jobs_get_board. EXAMPLE: {"jobKey":"greenhouse:stripe:8172503"} -> {"status":"open","method":"detail_endpoint"}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "ats": {
          "enum": [
            "greenhouse",
            "lever",
            "ashby",
            "personio",
            "pinpoint",
            "gem"
          ],
          "type": "string",
          "description": "Required unless jobKey is given. The applicant-tracking system hosting the board: \"greenhouse\" | \"lever\" | \"ashby\" | \"personio\" | \"pinpoint\" | \"gem\" (the first part of job_key). Example: \"greenhouse\""
        },
        "slug": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$",
          "description": "Required unless jobKey is given. Board slug from the public board URL (boards.greenhouse.io/{slug}, jobs.lever.co/{slug}, jobs.ashbyhq.com/{slug}, or the Personio account, Pinpoint subdomain or Gem vanity; the middle part of job_key), case-insensitive, 1-100 chars: a letter or digit, then letters, digits, \".\", \"_\" or \"-\". A Personio account, Pinpoint subdomain or Gem vanity cannot contain a dot. Example: \"stripe\""
        },
        "jobId": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "description": "Required unless jobKey is given. The ATS job id (job_id field, the last part of job_key), 1-100 chars: numeric on Greenhouse and Personio, a UUID on Lever and Ashby, the posting id on Pinpoint, the job post id on Gem. Example: \"8172503\""
        },
        "jobKey": {
          "type": "string",
          "maxLength": 250,
          "description": "Optional if ats + slug + jobId are given; wins when both are given. The job_key field of a job row, format \"{ats}:{slug}:{job_id}\" with ats in lowercase (greenhouse | lever | ashby | personio | pinpoint | gem); any other shape returns INVALID_INPUT. Examples: \"greenhouse:stripe:8172503\", \"personio:acme:4103\", \"gem:acme:am9icG9zdA\""
        },
        "includeDescription": {
          "type": "boolean",
          "description": "Optional boolean, default false. true adds job: the full job row (title, location, compensation, posted_at, description_text, ...) when the job is open. On Pinpoint and Gem, description_text stays empty. Example: true"
        }
      }
    }
    arguments 38 lines
  • jobs_get_job unknown 1h ago

    WHAT: Fetch the full detail of ONE job that is currently published on its official public ATS API (Greenhouse, Lever or Ashby), a Personio or Pinpoint feed, or a named Gem job board, normalized the same way as a board listing. WHEN: You already have a job_key, or ats + slug + jobId, from jobs_get_board or a board link and need that single job's text, location, compensation and dates. On Gem the row links to jobs.gem.com and does not include the ad body. WHEN NOT: Open or closed only (jobs_check_open). Every opening on a board (jobs_get_board). Many companies, history or repost signals (jobs_search_companies, paid). SmartRecruiters, LinkedIn, Workday, Workable, Recruitee and Rippling are not supported and never contacted. BEHAVIOR: Runs on this Fairquery-hosted Worker (Cloudflare), not on the caller's machine; inputs leave the client. This Worker's code is designed not to store inputs or results. The job id and board slug are sent to the public ATS host in the requests below. Greenhouse and Lever: one GET to the documented per-job endpoint (the description is in that response). Ashby, Personio, Pinpoint and Gem have no per-job read here: the documented board feed is fetched once and the id is looked up. Personio is robots.txt then /xml. Pinpoint is robots.txt then /postings.json. Gem is GET /job_posts/ only. Pinpoint and Gem description_text stay empty. No apply URL is requested. HTTP 404/410 on Greenhouse or Lever, when the board itself exists, or an id missing from an Ashby, Personio, Pinpoint or Gem board, is JOB_CLOSED (closed or unknown id) with no partial row. Nothing is stored. Any HTTP 403/429 stops that host for the session (kill switch, HOST_BLOCKED). Lever requests are spaced 1 s apart. Personio accounts share one lane, at least 1.5 s apart. Each Pinpoint subdomain is at least 1 s apart. Gem vanities share one lane, at least 1 s apart. COST: No APIFY_TOKEN, no billing. RETURNS: One "job" row, or a tool error: INVALID_INPUT, BOARD_NOT_FOUND, JOB_CLOSED, HOST_BLOCKED or NETWORK_ERROR (the last two retryable). A non-JSON body or other HTTP failure uses the ATS client code (ATS_BAD_RESPONSE, ATS_HTTP_ERROR). PARAMETERS: A malformed jobKey, or neither jobKey nor a complete ats + slug + jobId, returns INVALID_INPUT with no request. An Ashby or Personio id downloads the whole board with descriptions. A Pinpoint or Gem id downloads the board list and still leaves description_text empty. Greenhouse and Lever use the per-job endpoint; a 404 or 410 triggers one extra board request so JOB_CLOSED is told apart from a missing board (BOARD_NOT_FOUND). Where a description is included it is plain text, at most 20,000 characters, with e-mail addresses and phone numbers removed. EXAMPLE: {"jobKey":"greenhouse:stripe:8172503"} -> that Stripe job's row.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "ats": {
          "enum": [
            "greenhouse",
            "lever",
            "ashby",
            "personio",
            "pinpoint",
            "gem"
          ],
          "type": "string",
          "description": "Required unless jobKey is given. The applicant-tracking system hosting the board: \"greenhouse\" | \"lever\" | \"ashby\" | \"personio\" | \"pinpoint\" | \"gem\" (the first part of job_key). Example: \"greenhouse\""
        },
        "slug": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$",
          "description": "Required unless jobKey is given. Board slug from the public board URL (boards.greenhouse.io/{slug}, jobs.lever.co/{slug}, jobs.ashbyhq.com/{slug}, or the Personio account, Pinpoint subdomain or Gem vanity; the middle part of job_key), case-insensitive, 1-100 chars: a letter or digit, then letters, digits, \".\", \"_\" or \"-\". A named Personio, Pinpoint or Gem slug cannot contain a dot. Example: \"stripe\""
        },
        "jobId": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "description": "Required unless jobKey is given. The ATS job id (job_id field, the last part of job_key), 1-100 chars: numeric on Greenhouse and Personio, a UUID on Lever and Ashby, the posting id on Pinpoint, the job post id on Gem. Example: \"8172503\""
        },
        "jobKey": {
          "type": "string",
          "maxLength": 250,
          "description": "Optional if ats + slug + jobId are given; wins when both are given. The job_key field of a job row, format \"{ats}:{slug}:{job_id}\" with ats in lowercase (greenhouse | lever | ashby | personio | pinpoint | gem); any other shape returns INVALID_INPUT. Examples: \"greenhouse:stripe:8172503\", \"pinpoint:acme:118475\""
        }
      }
    }
    arguments 34 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id a76106ae3165d6fc.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/a76106ae3165d6fc/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/a76106ae3165d6fc/badge.svg)](https://brick.blue/agent/a76106ae3165d6fc?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.