{"id":"02ddee1e-4ce6-4ffd-a088-518fc9e9ce8a","entityType":"agent","slug":"clawhub-crawlora-org-job-market-research","name":"job-market-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-job-market-research","canonicalPath":"/agent/clawhub-crawlora-org-job-market-research","generatedAt":"2026-10-11T17:45:57.250Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":null},"description":"Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:job-market-research","sourceUrl":"https://clawhub.ai/crawlora-org/job-market-research","homepage":"https://clawhub.ai/crawlora-org/skills/job-market-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/job-market-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/job-market-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"job-market-research technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":null},"stars":null,"forks":null,"downloads":1047,"packageName":null,"latestVersion":"1.0.18","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:44:13.829Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T14:44:13.899Z","lastCrawledAt":"2026-10-11T14:44:13.829Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T14:44:13.829Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.18","createdAt":"2026-09-21T01:36:55.467Z","changelog":"Sync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805","fileCount":5,"zipByteSize":16808},{"version":"1.0.17","createdAt":"2026-09-17T10:20:07.979Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":16034},{"version":"1.0.16","createdAt":"2026-09-14T01:52:33.975Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":16431},{"version":"1.0.15","createdAt":"2026-09-10T12:33:22.643Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":16105},{"version":"1.0.14","createdAt":"2026-09-10T12:15:41.612Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":16138},{"version":"1.0.13","createdAt":"2026-09-10T12:06:19.510Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":16102},{"version":"1.0.12","createdAt":"2026-09-10T11:53:43.016Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":15742},{"version":"1.0.11","createdAt":"2026-09-10T11:41:58.426Z","changelog":"Scope helper routes and remove secret-shaped key examples","fileCount":5,"zipByteSize":15779}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:job-market-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:job-market-research` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/crawlora-org/job-market-research before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T17:45:57.245Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-job-market-research/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":null},"readme":"Skill: job-market-research\n\nOwner: crawlora-org\n\nSummary: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.\n\nTags: latest:1.0.18\n\nVersion history:\n\nv1.0.18 | 2026-09-21T01:36:55.467Z | user\n\nSync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805\n\nv1.0.17 | 2026-09-17T10:20:07.979Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.16 | 2026-09-14T01:52:33.975Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.15 | 2026-09-10T12:33:22.643Z | user\n\nValidate API keys before curl config\n\nv1.0.14 | 2026-09-10T12:15:41.612Z | user\n\nKeep API keys out of process arguments\n\nv1.0.13 | 2026-09-10T12:06:19.510Z | user\n\nReject curl local-file query syntax\n\nv1.0.12 | 2026-09-10T11:53:43.016Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.11 | 2026-09-10T11:41:58.426Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.10 | 2026-09-10T06:49:39.686Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.9 | 2026-09-08T04:32:35.191Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.8 | 2026-09-07T13:43:27.876Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.7 | 2026-09-07T08:25:44.317Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T06:49:20.140Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-08-24T07:33:45.981Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T06:44:04.725Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T05:21:29.350Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-14T18:42:05.556Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-10T18:27:33.454Z | user\n\nSet categories\n\nv1.0.0 | 2026-08-10T18:01:58.326Z | auto\n\n- Initial release of the job-market-research skill.\n- Provides JSON-based search and aggregation of job postings, hiring signals, and freelance gigs via the Crawlora API.\n- Supports major boards (Indeed, Google/Amazon/Apple/Meta/Tesla careers) and nearly all major ATS providers (Greenhouse, Lever, Workday, etc.).\n- Enables quick research on what any company is hiring for, their hiring velocity, and available freelance gigs on Upwork and Fiverr.\n- Requires only a free Crawlora API key; results are normalized and paginated.\n\nArchive index:\n\nArchive v1.0.18: 5 files, 16808 bytes\n\nFiles: reference/endpoints.md (41958b), scripts/crawlora.sh (5865b), skill-card.md (2360b), SKILL.md (5408b), _meta.json (139b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: job-market-research\ndescription: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.\n---\n\n# Job market & hiring research\n\nSearch job postings, pull a company's live openings straight from its ATS,\nand research freelance gigs — all as normalized JSON from the Crawlora API,\nno scraping job boards or ATS pages by hand.\n\n## When to use this skill\n\n- \"Search for <role> jobs in <location>.\" (Indeed, Google/Amazon/Apple/Meta/Tesla careers)\n- \"What is <company> currently hiring for?\" — pull their ATS board directly.\n- \"Which ATS does <company> use?\" / \"find any company's job board.\"\n- \"Is <company> hiring aggressively?\" — aggregate hiring-signal analysis.\n- \"Find freelancers / gigs for <skill>\" (Upwork, Fiverr).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Job boards & search engines** — `/indeed/search` (keyword + location),\n   `/google-jobs/search` (careers.google.com), and the dedicated\n   `/amazon-jobs/search`, `/apple-jobs/search`, `/meta-jobs/search`,\n   `/tesla-jobs/list` for those employers. Each has a matching `.../job`\n   (or `/list`/`/board`) detail endpoint for one posting.\n2. **Any company's ATS board** — first resolve which system they use:\n   `/jobs/company-search` probes Greenhouse, Lever, Ashby, SmartRecruiters,\n   Workday, and more for a company slug. Then list postings via the matching\n   endpoint: `/jobs/greenhouse/board` (param `token`), `/jobs/lever/postings`,\n   `/jobs/workday/board`, `/jobs/smartrecruiters/postings`,\n   `/jobs/ashby/board` (param `org`), `/jobs/recruitee/offers`, `/jobs/workable/postings`,\n   `/jobs/rippling/board`, `/jobs/icims/board`, `/jobs/oracle/board`,\n   `/jobs/ukg/board`, `/jobs/personio/feed`, `/jobs/pinpoint/board`,\n   `/jobs/teamtailor/jobs`, `/jobs/eightfold/board`, `/jobs/gem/board` — one\n   endpoint per ATS, each with a matching single-posting detail endpoint.\n   Each ATS uses its own slug param name (`token`, `company`, `org`,\n   `tenant`+`datacenter`+`site`, or `domain`) — see `reference/endpoints.md`.\n3. **Hiring signals** — `/jobs/hiring-signals` aggregates a company's ATS\n   board into a hiring-velocity summary (headcount growth proxy) in one\n   call. Pass `provider` (the ATS name) plus that provider's slug param\n   (e.g. `provider=greenhouse` + `token=<slug>`, or `provider=ashby` + `org=<slug>`).\n4. **Freelance** — `/upwork/search` / `/fiverr/search` for gigs and jobs;\n   `/upwork/job/{id}`, `/fiverr/gig/{username}/{slug}` for detail;\n   `/upwork/freelancer/{id}`, `/fiverr/seller/{username}` for profiles.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Indeed,\nGoogle/Amazon/Apple/Meta/Tesla Jobs, ATS (`Jobs` group), Upwork, and Fiverr\nendpoint this skill uses.\n\n## Examples\n\n- **\"Is company X scaling?\"** — `/jobs/company-search` to find their board,\n  `/jobs/hiring-signals` for a velocity summary, then the raw board endpoint\n  to see which teams/roles are open.\n- **Cross-source role search:** `/indeed/search` + `/google-jobs/search` for\n  the same title/location, dedupe by company + title.\n- **Competitor hiring watch:** pull the ATS boards of 3-4 competitors on a\n  schedule and diff new postings between runs.\n- **Freelance rate-check:** `/upwork/search` for a skill, collect budgets\n  across postings to estimate a market rate.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public postings/boards; respect each source's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **ATS boards need the company's board slug**, not their public brand name —\n  use `/jobs/company-search` first if you don't already know it.\n- Results are paginated on most `search`/board-list endpoints — pass `page`\n  to walk the full list.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"job-market-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789954615467\n}\n\nFile v1.0.18:reference/endpoints.md\n\n# job-market-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**59 endpoints across 10 platform group(s).**\n\n## Indeed (3)\n\n### `indeed_job`\n\n- **HTTP:** `GET /indeed/job`\n- **What:** Indeed job detail. Returns one Indeed job posting by its job key (the `job_key` field returned by search). Primary transport is Indeed's own credential-free GraphQL API; falls back to the original web-page transport if that fails.\n- **Params:** `jk` (string, **required**) — Indeed job key (16-character hex)\n\n### `indeed_locations_suggest`\n\n- **HTTP:** `GET /indeed/locations/suggest`\n- **What:** Indeed location suggestions. Returns Indeed's own location-search autocomplete suggestions for a partial location string -- the same suggestions the app's search bar offers -- for building a valid `l` value for search. Credential-free GraphQL only; there is no page-based fallback for this endpoint.\n- **Params:** `limit` (integer, optional) — Max suggestions to return, defaults to 10, maxes at 25; `q` (string, **required**) — Partial location text\n\n### `indeed_search`\n\n- **HTTP:** `GET /indeed/search`\n- **What:** Indeed job search. Searches Indeed job postings by keyword and location. Primary transport is Indeed's own credential-free GraphQL API; a page 1, unfiltered-by-date request uses it directly. Requesting page 2+ or the `fromage` filter (not yet expressible over the primary transport) uses the original web-page transport instead, with the same normalized response shape either way. `sort` enum: `relevance` (default), `date`.\n- **Params:** `fromage` (integer, optional) — Only jobs posted within this many days; `l` (string, optional) — Location (city, state, or zip); `page` (integer, optional) — Page number, 1-based, defaults to 1; `q` (string, **required**) — Search keywords; `radius` (integer, optional) — Search radius in miles; `sort` (string, optional) — Sort order: relevance, date\n\n## Google Jobs (2)\n\n### `google_jobs_job`\n\n- **HTTP:** `GET /google-jobs/job`\n- **What:** Google Jobs single posting. Returns one Google Careers posting by its numeric job id (the `id` field returned by search). Parsed from careers.google.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Numeric Google job id\n\n### `google_jobs_search`\n\n- **HTTP:** `GET /google-jobs/search`\n- **What:** Google Jobs search. Searches Google's public careers site (careers.google.com) via its server-rendered search page's embedded job data. Each result includes the description, responsibilities, and qualifications inline. Page size is fixed by Google at 20 results.\n- **Params:** `location` (string, optional) — Location filter (free text); `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Amazon Jobs (3)\n\n### `amazon_jobs_categories`\n\n- **HTTP:** `GET /amazon-jobs/categories`\n- **What:** Amazon Jobs category discovery. Lists every value amazon-jobs/search's `category` parameter accepts, each with its current live job count. Live-queries amazon.jobs's own search category facet rather than a static list, so counts and coverage stay current.\n- **Params:** _none_\n\n### `amazon_jobs_job`\n\n- **HTTP:** `GET /amazon-jobs/job`\n- **What:** Amazon Jobs single posting. Returns one Amazon.jobs posting by its numeric job id (the `id` field returned by search). Parsed from amazon.jobs's stable server-rendered job detail page — there is no separate JSON detail endpoint upstream.\n- **Params:** `id` (string, **required**) — Numeric Amazon job id\n\n### `amazon_jobs_search`\n\n- **HTTP:** `GET /amazon-jobs/search`\n- **What:** Amazon Jobs search. Searches Amazon's public careers site (amazon.jobs) via its credential-free search JSON. Each result includes the full description and qualifications inline. `sort` accepts `relevant` (default, upstream relevance ranking) or `recent` (newest posted first). Either `q` or `category` (or both) must be given -- `category` filters by Amazon's own job-category taxonomy and works with no text query at all. See `amazon-jobs-categories` for the full, live-verified list of accepted `category` values.\n- **Params:** `category` (string, optional) — Amazon's own job-category taxonomy slug, case-insensitive. Either q or category is required; `country` (string, optional) — ISO 3166-1 alpha-3 country code filter; `limit` (integer, optional) — Results per page, max 100 (default 20); `page` (integer, optional) — Page number, 1-based; `q` (string, optional) — Search query. Either q or category is required; `sort` (string, optional) — Sort order\n\n## Apple Jobs (3)\n\n### `apple_jobs_job`\n\n- **HTTP:** `GET /apple-jobs/job`\n- **What:** Apple Jobs single posting. Returns one Apple Careers posting by its job id (the `id` field returned by search, e.g. `200674676-0836` for a specific requisition or `PIPE-200314122` for an evergreen/pipeline retail role). Parsed from jobs.apple.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Apple job id\n\n### `apple_jobs_locations`\n\n- **HTTP:** `GET /apple-jobs/locations`\n- **What:** Apple Jobs location discovery. Discovery endpoint for apple-jobs-search's `location` parameter, whose accepted values are a closed set Apple itself defines (its own `<slug>-<CODE>` location ids -- free-text location names are rejected by the search backend). Apple exposes no bulk \"list everything\" API for this; its only source is its own location-filter typeahead, a fuzzy search capped at 10 results per call covering four granularities (country, state/province, metro area, city) with no empty-input listing mode. With no `q`, this returns the full country-level value space (206 values, live-verified) as a static list -- the granularity apple-jobs-search's own examples use and nearly every caller needs, with no live upstream call required. With `q` supplied, this instead live-proxies Apple's own typeahead so callers can discover state/metro/city-level values for finer filtering; results at those deeper levels may include more than one candidate and are ranked by Apple's own relevance, not alphabetically.\n- **Params:** `q` (string, optional) — Optional free-text location search. Omit to get the full country-level list; supply to live-search state/metro/city-level values too (e.g. a city name).\n\n### `apple_jobs_search`\n\n- **HTTP:** `GET /apple-jobs/search`\n- **What:** Apple Jobs search. Searches Apple's public careers site (jobs.apple.com) via its server-rendered search page's embedded job data. Page size is fixed by Apple at 20 results. Search results carry identity/location/team metadata only — call the job endpoint for the full description and qualifications.\n- **Params:** `location` (string, optional) — Location filter in Apple's own slug format, e.g. united-states-USA or singapore-SGP. Free-text location names are not accepted -- call apple-jobs-locations to discover valid values.; `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Meta Jobs (3)\n\n### `meta_jobs_job`\n\n- **HTTP:** `GET /meta-jobs/job`\n- **What:** Meta Jobs single posting. Returns one Meta Careers posting by its numeric job id (the `id` field returned by search or list). Parsed from metacareers.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Meta job id\n\n### `meta_jobs_list`\n\n- **HTTP:** `GET /meta-jobs/list`\n- **What:** Meta Jobs catalog listing. Returns a page of Meta's own public job sitemap -- every open requisition's id, canonical URL, and last-modified timestamp, with no team/location/keyword filtering. Use this for full-catalog enumeration or change tracking via last_modified; use search when you need to filter by team, technology, location, employment type, or keyword.\n- **Params:** `page` (integer, optional) — Page number, 1-based, defaults to 1; `page_size` (integer, optional) — Page size, defaults to 50, maxes at 200\n\n### `meta_jobs_search`\n\n- **HTTP:** `GET /meta-jobs/search`\n- **What:** Meta Jobs search. Searches Meta's public careers site (metacareers.com) via its own anonymous jobsearch GraphQL endpoint, with the same team/technology/location/employment-type/keyword/remote/sort filters the live search page offers. All filters are optional and combine with AND semantics; an empty request returns Meta's entire open-requisition catalog in one response. `q` matches team, technology, location, or ref/req-code names -- it is NOT a free-text search over job titles or descriptions. `teams` enum (org teams + technologies, both use the same field): `Advertising Technology`, `AR/VR`, `Artificial Intelligence`, `Business Development & Partnerships`, `Communications & Public Policy`, `Creative`, `Data & Analytics`, `Data Center`, `Design & User Experience`, `Enterprise Engineering`, `Global Operations`, `Infrastructure`, `Internship - Business`, `Internship - Engineering, Tech & Design`, `Internship - PhD`, `Legal, Finance, Facilities & Admin`, `People & Recruiting`, `Product Management`, `Research`, `Sales & Marketing`, `Security`, `Software Engineering`, `Technical Program Management`, `University Grad - Business`, `University Grad - Engineering, Tech & Design`, `University Grad - PhD & Postdoc`, `Facebook`, `Messenger`, `Instagram`, `WhatsApp`, `Meta Quest`. `roles` enum: `Full time employment`, `Internship`, `Short term employment`. `results_per_page` enum: `all`, `five`, `ten`.\n- **Params:** `is_remote_only` (boolean, optional) — Restrict to remote-only postings; `offices` (array, optional) — Repeatable location-id filter (OR) in Meta's own id format, e.g. menlo-park, london -- not a closed enum; `q` (string, optional) — Facet-name keyword: matches team, technology, location, or ref/req-code -- not a title/description search; `results_per_page` (string, optional) — Response size cap: all, five, ten; `roles` (array, optional) — Repeatable employment-type filter (OR); see roles enum above; `sort_by_new` (boolean, optional) — Sort newest-first instead of relevance; `teams` (array, optional) — Repeatable team-or-technology filter (OR); see teams enum above\n\n## Tesla Jobs (2)\n\n### `tesla_jobs_job`\n\n- **HTTP:** `GET /tesla-jobs/job`\n- **What:** Tesla Jobs single posting. Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint). Parsed from tesla.com's own job detail JSON endpoint.\n- **Params:** `id` (string, **required**) — Tesla job id\n\n### `tesla_jobs_list`\n\n- **HTTP:** `GET /tesla-jobs/list`\n- **What:** Tesla Jobs listing. Searches Tesla's public careers site (tesla.com/careers) via its own careers-state JSON endpoint. Tesla's own endpoint always returns its entire global job dataset regardless of query parameters; this filters and paginates that snapshot server-side. Listings carry identity/department/location metadata only — call the job endpoint for the full description, responsibilities, and requirements.\n- **Params:** `location` (string, optional) — Filter by location, case-insensitive substring match; `page` (integer, optional) — Page number, 1-based; `page_size` (integer, optional) — Results per page, up to 100; `query` (string, optional) — Filter by title or department, case-insensitive substring match\n\n## Jobs (30)\n\n### `jobs_ashby_board`\n\n- **HTTP:** `GET /jobs/ashby/board`\n- **What:** List an organization's Ashby job board. Lists an organization's public Ashby board postings with inline detail (description, compensation when include_compensation=true). The org is the Ashby slug from its careers URL. An unknown org returns an empty board (Ashby does not 404). Credential-free public ATS JSON.\n- **Params:** `include_compensation` (boolean, optional) — Include compensation summary; `org` (string, **required**) — Ashby org slug (careers URL)\n\n### `jobs_company_search`\n\n- **HTTP:** `GET /jobs/company-search`\n- **What:** Find which ATS a company uses by slug. Probes Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Rippling, Teamtailor, and Pinpoint in parallel for a slug and reports the providers where it resolves to a non-empty board (with the open-role count and board URL). Workday is excluded (its board needs tenant + datacenter + site). Credential-free public ATS JSON.\n- **Params:** `slug` (string, **required**) — Company careers slug to probe\n\n### `jobs_eightfold_board`\n\n- **HTTP:** `GET /jobs/eightfold/board`\n- **What:** List an Eightfold tenant's job board. Lists a company's public Eightfold AI job board, paged via limit/offset. tenant is the {tenant}.eightfold.ai subdomain from the careers URL; domain is the hiring organization's own domain (e.g. microsoft.com), also visible on the tenant's careers page. Tries the newer PCSX search first, falling back to the legacy SmartApply generation when PCSX is not enabled for the tenant. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `limit` (integer, optional) — Page size, default 10, max 10 (upstream caps results per page regardless of a larger value); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `query` (string, optional) — Free-text search; `tenant` (string, **required**) — Eightfold tenant subdomain (careers URL)\n\n### `jobs_eightfold_job`\n\n- **HTTP:** `GET /jobs/eightfold/job`\n- **What:** Get a single Eightfold position. Returns a single Eightfold position with its full HTML/text description. id is the position id from a board listing; tenant/domain as in the board endpoint. Tries the newer PCSX detail first, falling back to the legacy SmartApply detail generation. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `id` (string, **required**) — Eightfold position id from a board listing; `tenant` (string, **required**) — Eightfold tenant subdomain\n\n### `jobs_gem_board`\n\n- **HTTP:** `GET /jobs/gem/board`\n- **What:** List a company's Gem job board. Lists a company's public Gem (gem.com) board postings with inline detail (full HTML description, and compensation when the company publishes a pay range). The company is the Gem vanity URL slug from its careers URL. Credential-free public GraphQL.\n- **Params:** `company` (string, **required**) — Gem vanity URL slug (careers URL)\n\n### `jobs_greenhouse_board`\n\n- **HTTP:** `GET /jobs/greenhouse/board`\n- **What:** List a company's Greenhouse job board. Lists a company's public Greenhouse board postings, normalized to the shared Job shape. Set content=true to include each job's full HTML description in one call. The token is the company's Greenhouse board slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `content` (boolean, optional) — Include full HTML description per job; `token` (string, **required**) — Greenhouse board token (careers URL slug)\n\n### `jobs_greenhouse_job`\n\n- **HTTP:** `GET /jobs/greenhouse/job`\n- **What:** Get a single Greenhouse job. Returns a single Greenhouse job with its full HTML/text description, department, and offices. Credential-free public ATS JSON.\n- **Params:** `id` (string, **required**) — Greenhouse job id; `token` (string, **required**) — Greenhouse board token\n\n### `jobs_hiring_signals`\n\n- **HTTP:** `GET /jobs/hiring-signals`\n- **What:** Aggregate hiring signals for a company's board. Aggregates a company's ATS board into a hiring snapshot: total open roles, breakdowns by department/location/title, remote share, and how many roles are new in the last 7/30 days — a leading indicator of company growth. Supply provider plus that provider's slug params (token / company / org / tenant+datacenter+site / domain). Breakdowns are computed over the fetched postings. Credential-free public ATS JSON.\n- **Params:** `board` (string, optional) — ukg job-board UUID; `company` (string, optional) — lever / smartrecruiters / workable / recruitee / rippling / personio / teamtailor / gem / pinpoint company slug; `datacenter` (string, optional) — workday datacenter shard; `domain` (string, optional) — icims careers domain / eightfold organization domain; `host` (string, optional) — oracle cloud host (*.oraclecloud.com); `org` (string, optional) — ashby org slug; `provider` (string, **required**) — ATS provider; `site` (string, optional) — workday / oracle career site; `tenant` (string, optional) — workday / eightfold tenant; `token` (string, optional) — greenhouse board token\n\n### `jobs_icims_board`\n\n- **HTTP:** `GET /jobs/icims/board`\n- **What:** List an iCIMS tenant's job board. Lists a company's public iCIMS job board (served through the tenant's white-labeled careers domain, e.g. careers.costco.com — not the bare {company}.icims.com subdomain, which is an OAuth-gated employee portal), paged via page/limit, with the full description inline per job. domain is the tenant's careers domain from its careers URL. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size, default 20, max 50; `location` (string, optional) — Filter: location contains; `page` (integer, optional) — Page number, default 1\n\n### `jobs_icims_job`\n\n- **HTTP:** `GET /jobs/icims/job`\n- **What:** Get a single iCIMS job. Returns a single iCIMS job with its full HTML/text description, department, and benefits. id is the req_id/slug from a board listing; lang defaults to en-us. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain; `id` (string, **required**) — iCIMS job req_id/slug from a board listing; `lang` (string, optional) — Language code, default en-us\n\n### `jobs_lever_posting`\n\n- **HTTP:** `GET /jobs/lever/posting`\n- **What:** Get a single Lever posting. Returns a single Lever posting with its full HTML/text description. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug; `id` (string, **required**) — Lever posting id\n\n### `jobs_lever_postings`\n\n- **HTTP:** `GET /jobs/lever/postings`\n- **What:** List a company's Lever postings. Lists a company's public Lever postings (detail is inline), optionally filtered by department, location, or remote. The company is the Lever slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_oracle_board`\n\n- **HTTP:** `GET /jobs/oracle/board`\n- **What:** List an Oracle Recruiting (ORC) tenant's job board. Lists an Oracle Recruiting Cloud tenant's public requisitions, paged via limit/offset. host and site both come from the careers URL https://{host}/hcmUI/CandidateExperience/en/sites/{site}/ (host must be an *.oraclecloud.com hostname; site looks like CX_1). The listing carries a short description; use the single-job endpoint for full detail. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (careers URL, *.oraclecloud.com); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `site` (string, **required**) — Oracle career site number\n\n### `jobs_oracle_job`\n\n- **HTTP:** `GET /jobs/oracle/job`\n- **What:** Get a single Oracle Recruiting (ORC) requisition. Returns a single Oracle Recruiting requisition with its full HTML/text description (description, responsibilities, qualifications). id is the requisition Id from a board listing; host/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (*.oraclecloud.com); `id` (string, **required**) — Oracle requisition Id from a board listing; `site` (string, **required**) — Oracle career site number\n\n### `jobs_personio_feed`\n\n- **HTTP:** `GET /jobs/personio/feed`\n- **What:** List a company's Personio job board. Lists a company's public Personio board feed (XML), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Personio subdomain from its careers URL https://{company}.jobs.personio.de/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Personio subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_phenom_board`\n\n- **HTTP:** `GET /jobs/phenom/board`\n- **What:** Search a Phenom People tenant's job board. Searches a company's public Phenom People career site (a white-labeled domain such as careers.whataburger.com or jobs.cvshealth.com — Phenom serves the search-results page as server-rendered HTML with the job data embedded inline, not a JSON API, but this is still credential-free public data with no auth, cookie, or session required). domain is the tenant's careers domain from its careers URL. Paged via offset/limit; limit is a best-effort page-size hint some tenants ignore, so count always reflects what actually came back.\n- **Params:** `category` (string, optional) — Filter: category contains; `domain` (string, **required**) — Phenom tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size hint, default 10, max 100 (some tenants ignore this and return their own configured page size regardless); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `sort` (string, optional) — Sort order, default relevant\n\n### `jobs_phenom_job`\n\n- **HTTP:** `GET /jobs/phenom/job`\n- **What:** Get a single Phenom People job. Returns a single Phenom People job with its full HTML/text description, category, and apply URL. domain is the tenant's careers domain (as in the board endpoint); id is the jobId/reqId from a board listing (e.g. JR10002958).\n- **Params:** `domain` (string, **required**) — Phenom tenant careers domain; `id` (string, **required**) — Phenom job id from a board listing\n\n### `jobs_pinpoint_board`\n\n- **HTTP:** `GET /jobs/pinpoint/board`\n- **What:** List a tenant's Pinpoint job board. Lists a tenant's public Pinpoint (pinpointhq.com) board postings with inline detail (full HTML description, key responsibilities, skills, and benefits, plus structured compensation when the tenant publishes a pay range). The company is the tenant subdomain from its careers URL https://{company}.pinpointhq.com/. Credential-free public JSON.\n- **Params:** `company` (string, **required**) — Pinpoint tenant subdomain (careers URL)\n\n### `jobs_recruitee_offer`\n\n- **HTTP:** `GET /jobs/recruitee/offer`\n- **What:** Get a single Recruitee offer. Returns a single Recruitee offer with its full HTML/text description and structured compensation when the board exposes it. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain; `id` (string, **required**) — Recruitee offer id\n\n### `jobs_recruitee_offers`\n\n- **HTTP:** `GET /jobs/recruitee/offers`\n- **What:** List a company's Recruitee offers. Lists a company's public Recruitee offers (detail is inline), optionally filtered by department, location, or remote. The company is the Recruitee subdomain from its careers URL https://{company}.recruitee.com/. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_board`\n\n- **HTTP:** `GET /jobs/rippling/board`\n- **What:** List a company's Rippling job board. Lists a company's public Rippling board postings (thin listing — title, department, work location). The company is the Rippling board slug from its careers URL https://ats.rippling.com/{company}/jobs. Detail (full description, employment type) is fetched per job via the single-job endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_job`\n\n- **HTTP:** `GET /jobs/rippling/job`\n- **What:** Get a single Rippling job. Returns a single Rippling job with its full HTML/text description, employment type, and work locations. The id is the job uuid from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug; `id` (string, **required**) — Rippling job uuid\n\n### `jobs_smartrecruiters_posting`\n\n- **HTTP:** `GET /jobs/smartrecruiters/posting`\n- **What:** Get a single SmartRecruiters posting. Returns a single SmartRecruiters posting with its jobAd description. Recruiter personal data is intentionally omitted. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id; `id` (string, **required**) — SmartRecruiters posting id\n\n### `jobs_smartrecruiters_postings`\n\n- **HTTP:** `GET /jobs/smartrecruiters/postings`\n- **What:** List a company's SmartRecruiters postings. Lists a company's public SmartRecruiters postings, paged via limit/offset. The company is the SmartRecruiters identifier from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id (careers URL); `limit` (integer, optional) — Page size, default 100, max 100; `offset` (integer, optional) — Page offset, default 0\n\n### `jobs_teamtailor_jobs`\n\n- **HTTP:** `GET /jobs/teamtailor/jobs`\n- **What:** List a company's Teamtailor job board. Lists a company's public Teamtailor board feed (JSON Feed), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Teamtailor subdomain from its careers URL https://{company}.teamtailor.com/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Teamtailor subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_ukg_board`\n\n- **HTTP:** `GET /jobs/ukg/board`\n- **What:** List a UKG Pro Recruiting tenant's job board. Lists a UKG Pro Recruiting (formerly UltiPro) tenant's public opportunities, paged via limit/offset. tenant and board both come from the careers URL https://recruiting.ultipro.com/{tenant}/JobBoard/{board}. Each posting carries a brief description inline (UKG's full detail page is HTML, not JSON). Credential-free public ATS JSON.\n- **Params:** `board` (string, **required**) — UKG job-board UUID (careers URL); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `tenant` (string, **required**) — UKG tenant code (careers URL)\n\n### `jobs_workable_posting`\n\n- **HTTP:** `GET /jobs/workable/posting`\n- **What:** Get a single Workable posting. Returns a single Workable posting with its full HTML/text description. The id is the posting shortcode from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug; `id` (string, **required**) — Workable posting shortcode\n\n### `jobs_workable_postings`\n\n- **HTTP:** `GET /jobs/workable/postings`\n- **What:** List a company's Workable postings. Lists a company's public Workable postings, normalized to the shared Job shape, optionally filtered by department, location, or remote. The company is the Workable account slug from its careers URL https://apply.workable.com/{company}/. Detail (full description) is fetched per job via the single-posting endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false); `search` (string, optional) — Free-text search\n\n### `jobs_workday_board`\n\n- **HTTP:** `GET /jobs/workday/board`\n- **What:** List a Workday tenant's job board. Lists a company's public Workday (CXS) postings, paged via limit/offset. tenant, datacenter (wd1/wd3/wd5/...), and site all come from the careers URL https://{tenant}.wd5.myworkdayjobs.com/{site}. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard (wd1, wd3, wd5, ...); `limit` (integer, optional) — Page size, default 20, max 20; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text search; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n### `jobs_workday_job`\n\n- **HTTP:** `GET /jobs/workday/job`\n- **What:** Get a single Workday job. Returns a single Workday posting's full detail (description, location, req id). path is the externalPath from a board listing. tenant/datacenter/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard; `path` (string, **required**) — Job externalPath from a board listing; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n## Tes (7)\n\n### `tes_job_detail`\n\n- **HTTP:** `GET /tes/jobs/detail`\n- **What:** Get a Tes teaching job. Returns normalized detail for one job posting by its numeric id (the id field returned by tes-job-search): employer, location, salary, contract terms/types, dates, and application contact/URL, plus a short excerpt of the listing description rather than the full long-form HTML copy.\n- **Params:** `id` (string, **required**) — Tes job id\n\n### `tes_job_employer`\n\n- **HTTP:** `GET /tes/jobs/employer`\n- **What:** Get a Tes jobs employer profile. Returns normalized detail for one jobs employer profile by its numeric id (the trailing id in tes-job-detail's employer_url field, e.g. .../jobs/employer/epsom-college-1039424 -- the 1039424): name, location, school type/phase/funding status/gender/age range, an about description, its postal address, and every currently-open position listed on the employer's own profile page (id, title, url -- call tes-job-detail with each id for the full posting).\n- **Params:** `id` (string, **required**) — Tes employer id\n\n### `tes_job_search`\n\n- **HTTP:** `GET /tes/jobs/search`\n- **What:** Search Tes teaching jobs. Searches Tes's (tes.com) teaching-jobs board. Returns normalized listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates via Tes's own location-autocomplete endpoint; omit for Tes's own default market, \"United Kingdom\". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated passthrough filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.\n- **Params:** `contract_term` (string, optional) — Contract term; `contract_type` (string, optional) — Contract type; `keywords` (string, optional) — Job title or keyword; `location` (string, optional) — Free-text place name resolved via Tes's own location autocomplete; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `position` (string, optional) — Comma-separated position category label(s) -- see the endpoint markdown; `radius_miles` (integer, optional) — Search radius around location, in miles; `salary_min` (integer, optional) — Minimum advertised salary, in the searched market's local currency; `sort` (string, optional) — Sort order; `subject` (string, optional) — Comma-separated subject label(s) -- see the endpoint markdown; `workplace` (string, optional) — Comma-separated workplace/organisation-type label(s) -- see the endpoint markdown\n\n### `tes_resource_detail`\n\n- **HTTP:** `GET /tes/resources/detail`\n- **What:** Get a Tes teaching resource. Returns normalized detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself, which robots.txt already disallows scraping regardless.\n- **Params:** `country` (string, optional) — Storefront market for pricing/currency; `id` (string, **required**) — Tes resource id\n\n### `tes_resource_search`\n\n- **HTTP:** `GET /tes/resources/search`\n- **What:** Search Tes teaching resources. Searches Tes's (tes.com) teaching-resources marketplace. Returns normalized listing facts (title, author, price, rating, downloads) -- not full listing descriptions -- out of respect for Tes's general reproduction/republication restriction. query is optional: omit it (alone, or combined with key_stage/subject/on_sale) for pure filter-driven or fully unfiltered browsing, matching Tes's own search API. sort mirrors the real search page's own Sort by dropdown; key_stage and subject mirror its left-hand Refine by filters (both closed, validated enums taken from Tes's own facet taxonomy, and always resolved against Tes's own single GB-taxonomy regardless of country). country controls result currency/localisation only (confirmed live for all seven values); it does not change which key_stage/subject values are valid.\n- **Params:** `country` (string, optional) — Storefront market; `key_stage` (string, optional) — Filter by age range; `on_sale` (boolean, optional) — Filter to discounted resources only; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, optional) — Search keywords -- omit for filter-driven or unfiltered browsing; `sort` (string, optional) — Sort order; `subject` (string, optional) — Filter by subject -- one of Tes's own top-level subject facet labels; see the endpoint markdown for the full list (two of the 29 values contain a comma, which is why this parameter is not expressed as a Swagger Enums() list)\n\n### `tes_resource_shop`\n\n- **HTTP:** `GET /tes/resources/shop`\n- **What:** Get a Tes teaching-resources author shop. Returns normalized detail for one teaching-resources author/seller shop by its username (from tes-resource-search/tes-resource-detail's author field, or the trailing path segment of author_url): display name, average rating, upload/view/download counts, a bio, and a page of that author's resource listing (id, title, price, thumbnail -- call tes-resource-detail with each id for subject/age-range/resource-type/rating/description). subject narrows the listing to one of the subject tabs shown on the shop's own page; these vary per author and are not a curated enum.\n- **Params:** `page` (integer, optional) — One-based page; `subject` (string, optional) — Subject tab to filter the listing to -- see the shop's own page for the current set; `username` (string, **required**) — Tes author username\n\n### `tes_school_search`\n\n- **HTTP:** `GET /tes/schools/search`\n- **What:** Search the Tes Schools Directory. Searches Tes's (tes.com) public Schools Directory by school name or location. Returns normalized listing facts (name, logo, a short description, address) for each matching school/employer. Each result's id is the same employer id tes-job-employer accepts, so a caller can go straight from a name/location search to a full employer profile (school type/phase/funding status/gender/age range, and its currently-open positions) without first needing a job posting to discover the id.\n- **Params:** `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, **required**) — School name or location\n\n## Upwork (3)\n\n### `upwork_freelancer`\n\n- **HTTP:** `GET /upwork/freelancer/{id}`\n- **What:** Get Upwork freelancer profile. Returns a normalized Upwork freelancer profile: name, title, verification badge, overview, hourly rate, rating and review count, Job Success Score, location and local time, total jobs/hours worked, and recent client feedback (title, comment, date, client name, rating). Public data sourced from Upwork's own server-rendered profile pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork freelancer id, the value after \\\n\n### `upwork_job`\n\n- **HTTP:** `GET /upwork/job/{id}`\n- **What:** Get Upwork job posting detail. Returns a normalized Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size). Public data sourced from Upwork's own server-rendered job pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork job id, e.g. from a search result's id field\n\n### `upwork_search`\n\n- **HTTP:** `GET /upwork/search`\n- **What:** Search Upwork job postings. Searches Upwork's public job listings by free-text keyword, returning normalized job summaries (title, budget, experience level, duration, posted date, description snippet, skill tags). Public data sourced from Upwork's own server-rendered search pages via a real browser-rendering backend.\n- **Params:** `page` (integer, optional) — 1-based result page. Defaults to 1.; `q` (string, **required**) — Free-text job search keyword\n\n## Fiverr (3)\n\n### `fiverr_gig`\n\n- **HTTP:** `GET /fiverr/gig/{username}/{slug}`\n- **What:** Get Fiverr gig detail. Returns a normalized Fiverr gig detail page: title, description, category, pricing packages (basic/standard/premium tiers with price and delivery time), rating, review count, orders in queue, tags, gallery images, and a seller summary (level, rating, response time, languages). Public data sourced from Fiverr's own server-rendered gig pages via a real browser-rendering backend. Seller level uses the same values on the search, seller and gig endpoints: level_one_seller, level_two_seller, top_rated_seller, or new_seller.\n- **Params:** `slug` (string, **required**) — Fiverr gig URL slug, the trailing path segment after the username in a gig URL; `username` (string, **required**) — Fiverr seller username, e.g. from a search result's seller_username field\n\n### `fiverr_search`\n\n- **HTTP:** `GET /fiverr/search`\n- **What:** Search Fiverr gigs. Searches Fiverr's public gig listings by free-text keyword, returning normalized gig summaries (title, seller username, seller level, rating, review count, starting price, category, thumbnail image). Public data sourced from Fiverr's own server-rendered search pages via a real browser-rendering backend. Seller level uses the same values on the search, seller and gig endpoints: level_one_seller, level_two_seller, top_rated_seller, or new_seller.\n- **Params:** `page` (integer, optional) — 1-based result page. Defaults to 1.; `q` (string, **required**) — Free-text gig search keyword\n\n### `fiverr_seller`\n\n- **HTTP:** `GET /fiverr/seller/{username}`\n- **What:** Get Fiverr seller profile. Returns a normalized Fiverr seller profile: display name, one-liner title, description, country, seller level, verification status, hourly rate, spoken languages, join date, and the seller's gig ids. Public data sourced from Fiverr's own server-rendered seller profile pages via a real browser-rendering backend. Seller level uses the same values on the search, seller and gig endpoints: level_one_seller, level_two_seller, top_rated_seller, or new_seller.\n- **Params:** `username` (string, **required**) — Fiverr seller username, e.g. from a search result's seller_username field\n\nFile v1.0.18:skill-card.md\n\n## Description:\n\nResearches job postings, hiring signals, and freelance gigs via the Crawlora API across job boards, employer career sites, ATS boards, Upwork, and Fiverr, returning clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to search public job postings, inspect company hiring activity, resolve ATS boards, aggregate hiring signals, and research freelance gigs through Crawlora API calls.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends the Crawlora API key and job or freelance search parameters to Crawlora.\n\nMitigation: Use only an intended Crawlora API key and avoid sensitive personal or confidential business information in search terms unless sharing it with Crawlora is acceptable.\n\nRisk: Job, ATS, and freelance marketplace results are external public data and may be incomplete, stale, or subject to source terms.\n\nMitigation: Validate important hiring or market conclusions against the source postings and respect the applicable terms for each data source.\n\nRisk: The helper performs API calls through a shell script and requires local environment setup.\n\nMitigation: Set CRAWLORA_API_KEY in the environment, keep it out of files and command arguments, and review generated shell commands before execution.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [Crawlora account and API key](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/job-market-research)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, JSON, Guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and uses GET requests against documented Crawlora routes.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.17: 5 files, 16034 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (5769b), skill-card.md (2232b), SKILL.md (5408b), _meta.json (139b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: job-market-research\ndescription: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.\n---\n\n# Job market & hiring research\n\nSearch job postings, pull a company's live openings straight from its ATS,\nand research freelance gigs — all as normalized JSON from the Crawlora API,\nno scraping job boards or ATS pages by hand.\n\n## When to use this skill\n\n- \"Search for <role> jobs in <location>.\" (Indeed, Google/Amazon/Apple/Meta/Tesla careers)\n- \"What is <company> currently hiring for?\" — pull their ATS board directly.\n- \"Which ATS does <company> use?\" / \"find any company's job board.\"\n- \"Is <company> hiring aggressively?\" — aggregate hiring-signal analysis.\n- \"Find freelancers / gigs for <skill>\" (Upwork, Fiverr).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Job boards & search engines** — `/indeed/search` (keyword + location),\n   `/google-jobs/search` (careers.google.com), and the dedicated\n   `/amazon-jobs/search`, `/apple-jobs/search`, `/meta-jobs/search`,\n   `/tesla-jobs/list` for those employers. Each has a matching `.../job`\n   (or `/list`/`/board`) detail endpoint for one posting.\n2. **Any company's ATS board** — first resolve which system they use:\n   `/jobs/company-search` probes Greenhouse, Lever, Ashby, SmartRecruiters,\n   Workday, and more for a company slug. Then list postings via the matching\n   endpoint: `/jobs/greenhouse/board` (param `token`), `/jobs/lever/postings`,\n   `/jobs/workday/board`, `/jobs/smartrecruiters/postings`,\n   `/jobs/ashby/board` (param `org`), `/jobs/recruitee/offers`, `/jobs/workable/postings`,\n   `/jobs/rippling/board`, `/jobs/icims/board`, `/jobs/oracle/board`,\n   `/jobs/ukg/board`, `/jobs/personio/feed`, `/jobs/pinpoint/board`,\n   `/jobs/teamtailor/jobs`, `/jobs/eightfold/board`, `/jobs/gem/board` — one\n   endpoint per ATS, each with a matching single-posting detail endpoint.\n   Each ATS uses its own slug param name (`token`, `company`, `org`,\n   `tenant`+`datacenter`+`site`, or `domain`) — see `reference/endpoints.md`.\n3. **Hiring signals** — `/jobs/hiring-signals` aggregates a company's ATS\n   board into a hiring-velocity summary (headcount growth proxy) in one\n   call. Pass `provider` (the ATS name) plus that provider's slug param\n   (e.g. `provider=greenhouse` + `token=<slug>`, or `provider=ashby` + `org=<slug>`).\n4. **Freelance** — `/upwork/search` / `/fiverr/search` for gigs and jobs;\n   `/upwork/job/{id}`, `/fiverr/gig/{username}/{slug}` for detail;\n   `/upwork/freelancer/{id}`, `/fiverr/seller/{username}` for profiles.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Indeed,\nGoogle/Amazon/Apple/Meta/Tesla Jobs, ATS (`Jobs` group), Upwork, and Fiverr\nendpoint this skill uses.\n\n## Examples\n\n- **\"Is company X scaling?\"** — `/jobs/company-search` to find their board,\n  `/jobs/hiring-signals` for a velocity summary, then the raw board endpoint\n  to see which teams/roles are open.\n- **Cross-source role search:** `/indeed/search` + `/google-jobs/search` for\n  the same title/location, dedupe by company + title.\n- **Competitor hiring watch:** pull the ATS boards of 3-4 competitors on a\n  schedule and diff new postings between runs.\n- **Freelance rate-check:** `/upwork/search` for a skill, collect budgets\n  across postings to estimate a market rate.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public postings/boards; respect each source's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **ATS boards need the company's board slug**, not their public brand name —\n  use `/jobs/company-search` first if you don't already know it.\n- Results are paginated on most `search`/board-list endpoints — pass `page`\n  to walk the full list.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"job-market-research\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1789640407979\n}\n\nFile v1.0.17:reference/endpoints.md\n\n# job-market-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**57 endpoints across 10 platform group(s).**\n\n## Indeed (3)\n\n### `indeed_job`\n\n- **HTTP:** `GET /indeed/job`\n- **What:** Indeed job detail. Returns one Indeed job posting by its job key (the `job_key` field returned by search). Primary transport is Indeed's own credential-free GraphQL API; falls back to the original web-page transport if that fails.\n- **Params:** `jk` (string, **required**) — Indeed job key (16-character hex)\n\n### `indeed_locations_suggest`\n\n- **HTTP:** `GET /indeed/locations/suggest`\n- **What:** Indeed location suggestions. Returns Indeed's own location-search autocomplete suggestions for a partial location string -- the same suggestions the app's search bar offers -- for building a valid `l` value for search. Credential-free GraphQL only; there is no page-based fallback for this endpoint.\n- **Params:** `limit` (integer, optional) — Max suggestions to return, defaults to 10, maxes at 25; `q` (string, **required**) — Partial location text\n\n### `indeed_search`\n\n- **HTTP:** `GET /indeed/search`\n- **What:** Indeed job search. Searches Indeed job postings by keyword and location. Primary transport is Indeed's own credential-free GraphQL API; a page 1, unfiltered-by-date request uses it directly. Requesting page 2+ or the `fromage` filter (not yet expressible over the primary transport) uses the original web-page transport instead, with the same normalized response shape either way. `sort` enum: `relevance` (default), `date`.\n- **Params:** `fromage` (integer, optional) — Only jobs posted within this many days; `l` (string, optional) — Location (city, state, or zip); `page` (integer, optional) — Page number, 1-based, defaults to 1; `q` (string, **required**) — Search keywords; `radius` (integer, optional) — Search radius in miles; `sort` (string, optional) — Sort order: relevance, date\n\n## Google Jobs (2)\n\n### `google_jobs_job`\n\n- **HTTP:** `GET /google-jobs/job`\n- **What:** Google Jobs single posting. Returns one Google Careers posting by its numeric job id (the `id` field returned by search). Parsed from careers.google.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Numeric Google job id\n\n### `google_jobs_search`\n\n- **HTTP:** `GET /google-jobs/search`\n- **What:** Google Jobs search. Searches Google's public careers site (careers.google.com) via its server-rendered search page's embedded job data. Each result includes the description, responsibilities, and qualifications inline. Page size is fixed by Google at 20 results.\n- **Params:** `location` (string, optional) — Location filter (free text); `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Amazon Jobs (2)\n\n### `amazon_jobs_job`\n\n- **HTTP:** `GET /amazon-jobs/job`\n- **What:** Amazon Jobs single posting. Returns one Amazon.jobs posting by its numeric job id (the `id` field returned by search). Parsed from amazon.jobs's stable server-rendered job detail page — there is no separate JSON detail endpoint upstream.\n- **Params:** `id` (string, **required**) — Numeric Amazon job id\n\n### `amazon_jobs_search`\n\n- **HTTP:** `GET /amazon-jobs/search`\n- **What:** Amazon Jobs search. Searches Amazon's public careers site (amazon.jobs) via its credential-free search JSON. Each result includes the full description and qualifications inline. `sort` accepts `relevant` (default, upstream relevance ranking) or `recent` (newest posted first). Either `q` or `category` (or both) must be given -- `category` filters by Amazon's own job-category taxonomy and works with no text query at all.\n- **Params:** `category` (string, optional) — Amazon's own job-category taxonomy slug. Either q or category is required; `country` (string, optional) — ISO 3166-1 alpha-3 country code filter; `limit` (integer, optional) — Results per page, max 100 (default 20); `page` (integer, optional) — Page number, 1-based; `q` (string, optional) — Search query. Either q or category is required; `sort` (string, optional) — Sort order\n\n## Apple Jobs (2)\n\n### `apple_jobs_job`\n\n- **HTTP:** `GET /apple-jobs/job`\n- **What:** Apple Jobs single posting. Returns one Apple Careers posting by its job id (the `id` field returned by search, e.g. `200674676-0836` for a specific requisition or `PIPE-200314122` for an evergreen/pipeline retail role). Parsed from jobs.apple.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Apple job id\n\n### `apple_jobs_search`\n\n- **HTTP:** `GET /apple-jobs/search`\n- **What:** Apple Jobs search. Searches Apple's public careers site (jobs.apple.com) via its server-rendered search page's embedded job data. Page size is fixed by Apple at 20 results. Search results carry identity/location/team metadata only — call the job endpoint for the full description and qualifications.\n- **Params:** `location` (string, optional) — Location filter in Apple's own slug format, e.g. united-states-USA or singapore-SGP; `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Meta Jobs (3)\n\n### `meta_jobs_job`\n\n- **HTTP:** `GET /meta-jobs/job`\n- **What:** Meta Jobs single posting. Returns one Meta Careers posting by its numeric job id (the `id` field returned by search or list). Parsed from metacareers.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Meta job id\n\n### `meta_jobs_list`\n\n- **HTTP:** `GET /meta-jobs/list`\n- **What:** Meta Jobs catalog listing. Returns a page of Meta's own public job sitemap -- every open requisition's id, canonical URL, and last-modified timestamp, with no team/location/keyword filtering. Use this for full-catalog enumeration or change tracking via last_modified; use search when you need to filter by team, technology, location, employment type, or keyword.\n- **Params:** `page` (integer, optional) — Page number, 1-based, defaults to 1; `page_size` (integer, optional) — Page size, defaults to 50, maxes at 200\n\n### `meta_jobs_search`\n\n- **HTTP:** `GET /meta-jobs/search`\n- **What:** Meta Jobs search. Searches Meta's public careers site (metacareers.com) via its own anonymous jobsearch GraphQL endpoint, with the same team/technology/location/employment-type/keyword/remote/sort filters the live search page offers. All filters are optional and combine with AND semantics; an empty request returns Meta's entire open-requisition catalog in one response. `q` matches team, technology, location, or ref/req-code names -- it is NOT a free-text search over job titles or descriptions. `teams` enum (org teams + technologies, both use the same field): `Advertising Technology`, `AR/VR`, `Artificial Intelligence`, `Business Development & Partnerships`, `Communications & Public Policy`, `Creative`, `Data & Analytics`, `Data Center`, `Design & User Experience`, `Enterprise Engineering`, `Global Operations`, `Infrastructure`, `Internship - Business`, `Internship - Engineering, Tech & Design`, `Internship - PhD`, `Legal, Finance, Facilities & Admin`, `People & Recruiting`, `Product Management`, `Research`, `Sales & Marketing`, `Security`, `Software Engineering`, `Technical Program Management`, `University Grad - Business`, `University Grad - Engineering, Tech & Design`, `University Grad - PhD & Postdoc`, `Facebook`, `Messenger`, `Instagram`, `WhatsApp`, `Meta Quest`. `roles` enum: `Full time employment`, `Internship`, `Short term employment`. `results_per_page` enum: `all`, `five`, `ten`.\n- **Params:** `is_remote_only` (boolean, optional) — Restrict to remote-only postings; `offices` (array, optional) — Repeatable location-id filter (OR) in Meta's own id format, e.g. menlo-park, london -- not a closed enum; `q` (string, optional) — Facet-name keyword: matches team, technology, location, or ref/req-code -- not a title/description search; `results_per_page` (string, optional) — Response size cap: all, five, ten; `roles` (array, optional) — Repeatable employment-type filter (OR); see roles enum above; `sort_by_new` (boolean, optional) — Sort newest-first instead of relevance; `teams` (array, optional) — Repeatable team-or-technology filter (OR); see teams enum above\n\n## Tesla Jobs (2)\n\n### `tesla_jobs_job`\n\n- **HTTP:** `GET /tesla-jobs/job`\n- **What:** Tesla Jobs single posting. Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint). Parsed from tesla.com's own job detail JSON endpoint.\n- **Params:** `id` (string, **required**) — Tesla job id\n\n### `tesla_jobs_list`\n\n- **HTTP:** `GET /tesla-jobs/list`\n- **What:** Tesla Jobs listing. Searches Tesla's public careers site (tesla.com/careers) via its own careers-state JSON endpoint. Tesla's own endpoint always returns its entire global job dataset regardless of query parameters; this filters and paginates that snapshot server-side. Listings carry identity/department/location metadata only — call the job endpoint for the full description, responsibilities, and requirements.\n- **Params:** `location` (string, optional) — Filter by location, case-insensitive substring match; `page` (integer, optional) — Page number, 1-based; `page_size` (integer, optional) — Results per page, up to 100; `query` (string, optional) — Filter by title or department, case-insensitive substring match\n\n## Jobs (30)\n\n### `jobs_ashby_board`\n\n- **HTTP:** `GET /jobs/ashby/board`\n- **What:** List an organization's Ashby job board. Lists an organization's public Ashby board postings with inline detail (description, compensation when include_compensation=true). The org is the Ashby slug from its careers URL. An unknown org returns an empty board (Ashby does not 404). Credential-free public ATS JSON.\n- **Params:** `include_compensation` (boolean, optional) — Include compensation summary; `org` (string, **required**) — Ashby org slug (careers URL)\n\n### `jobs_company_search`\n\n- **HTTP:** `GET /jobs/company-search`\n- **What:** Find which ATS a company uses by slug. Probes Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Rippling, Teamtailor, and Pinpoint in parallel for a slug and reports the providers where it resolves to a non-empty board (with the open-role count and board URL). Workday is excluded (its board needs tenant + datacenter + site). Credential-free public ATS JSON.\n- **Params:** `slug` (string, **required**) — Company careers slug to probe\n\n### `jobs_eightfold_board`\n\n- **HTTP:** `GET /jobs/eightfold/board`\n- **What:** List an Eightfold tenant's job board. Lists a company's public Eightfold AI job board, paged via limit/offset. tenant is the {tenant}.eightfold.ai subdomain from the careers URL; domain is the hiring organization's own domain (e.g. microsoft.com), also visible on the tenant's careers page. Tries the newer PCSX search first, falling back to the legacy SmartApply generation when PCSX is not enabled for the tenant. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `limit` (integer, optional) — Page size, default 10, max 10 (upstream caps results per page regardless of a larger value); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `query` (string, optional) — Free-text search; `tenant` (string, **required**) — Eightfold tenant subdomain (careers URL)\n\n### `jobs_eightfold_job`\n\n- **HTTP:** `GET /jobs/eightfold/job`\n- **What:** Get a single Eightfold position. Returns a single Eightfold position with its full HTML/text description. id is the position id from a board listing; tenant/domain as in the board endpoint. Tries the newer PCSX detail first, falling back to the legacy SmartApply detail generation. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `id` (string, **required**) — Eightfold position id from a board listing; `tenant` (string, **required**) — Eightfold tenant subdomain\n\n### `jobs_gem_board`\n\n- **HTTP:** `GET /jobs/gem/board`\n- **What:** List a company's Gem job board. Lists a company's public Gem (gem.com) board postings with inline detail (full HTML description, and compensation when the company publishes a pay range). The company is the Gem vanity URL slug from its careers URL. Credential-free public GraphQL.\n- **Params:** `company` (string, **required**) — Gem vanity URL slug (careers URL)\n\n### `jobs_greenhouse_board`\n\n- **HTTP:** `GET /jobs/greenhouse/board`\n- **What:** List a company's Greenhouse job board. Lists a company's public Greenhouse board postings, normalized to the shared Job shape. Set content=true to include each job's full HTML description in one call. The token is the company's Greenhouse board slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `content` (boolean, optional) — Include full HTML description per job; `token` (string, **required**) — Greenhouse board token (careers URL slug)\n\n### `jobs_greenhouse_job`\n\n- **HTTP:** `GET /jobs/greenhouse/job`\n- **What:** Get a single Greenhouse job. Returns a single Greenhouse job with its full HTML/text description, department, and offices. Credential-free public ATS JSON.\n- **Params:** `id` (string, **required**) — Greenhouse job id; `token` (string, **required**) — Greenhouse board token\n\n### `jobs_hiring_signals`\n\n- **HTTP:** `GET /jobs/hiring-signals`\n- **What:** Aggregate hiring signals for a company's board. Aggregates a company's ATS board into a hiring snapshot: total open roles, breakdowns by department/location/title, remote share, and how many roles are new in the last 7/30 days — a leading indicator of company growth. Supply provider plus that provider's slug params (token / company / org / tenant+datacenter+site / domain). Breakdowns are computed over the fetched postings. Credential-free public ATS JSON.\n- **Params:** `board` (string, optional) — ukg job-board UUID; `company` (string, optional) — lever / smartrecruiters / workable / recruitee / rippling / personio / teamtailor / gem / pinpoint company slug; `datacenter` (string, optional) — workday datacenter shard; `domain` (string, optional) — icims careers domain / eightfold organization domain; `host` (string, optional) — oracle cloud host (*.oraclecloud.com); `org` (string, optional) — ashby org slug; `provider` (string, **required**) — ATS provider; `site` (string, optional) — workday / oracle career site; `tenant` (string, optional) — workday / eightfold tenant; `token` (string, optional) — greenhouse board token\n\n### `jobs_icims_board`\n\n- **HTTP:** `GET /jobs/icims/board`\n- **What:** List an iCIMS tenant's job board. Lists a company's public iCIMS job board (served through the tenant's white-labeled careers domain, e.g. careers.costco.com — not the bare {company}.icims.com subdomain, which is an OAuth-gated employee portal), paged via page/limit, with the full description inline per job. domain is the tenant's careers domain from its careers URL. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size, default 20, max 50; `location` (string, optional) — Filter: location contains; `page` (integer, optional) — Page number, default 1\n\n### `jobs_icims_job`\n\n- **HTTP:** `GET /jobs/icims/job`\n- **What:** Get a single iCIMS job. Returns a single iCIMS job with its full HTML/text description, department, and benefits. id is the req_id/slug from a board listing; lang defaults to en-us. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain; `id` (string, **required**) — iCIMS job req_id/slug from a board listing; `lang` (string, optional) — Language code, default en-us\n\n### `jobs_lever_posting`\n\n- **HTTP:** `GET /jobs/lever/posting`\n- **What:** Get a single Lever posting. Returns a single Lever posting with its full HTML/text description. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug; `id` (string, **required**) — Lever posting id\n\n### `jobs_lever_postings`\n\n- **HTTP:** `GET /jobs/lever/postings`\n- **What:** List a company's Lever postings. Lists a company's public Lever postings (detail is inline), optionally filtered by department, location, or remote. The company is the Lever slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_oracle_board`\n\n- **HTTP:** `GET /jobs/oracle/board`\n- **What:** List an Oracle Recruiting (ORC) tenant's job board. Lists an Oracle Recruiting Cloud tenant's public requisitions, paged via limit/offset. host and site both come from the careers URL https://{host}/hcmUI/CandidateExperience/en/sites/{site}/ (host must be an *.oraclecloud.com hostname; site looks like CX_1). The listing carries a short description; use the single-job endpoint for full detail. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (careers URL, *.oraclecloud.com); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `site` (string, **required**) — Oracle career site number\n\n### `jobs_oracle_job`\n\n- **HTTP:** `GET /jobs/oracle/job`\n- **What:** Get a single Oracle Recruiting (ORC) requisition. Returns a single Oracle Recruiting requisition with its full HTML/text description (description, responsibilities, qualifications). id is the requisition Id from a board listing; host/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (*.oraclecloud.com); `id` (string, **required**) — Oracle requisition Id from a board listing; `site` (string, **required**) — Oracle career site number\n\n### `jobs_personio_feed`\n\n- **HTTP:** `GET /jobs/personio/feed`\n- **What:** List a company's Personio job board. Lists a company's public Personio board feed (XML), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Personio subdomain from its careers URL https://{company}.jobs.personio.de/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Personio subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_phenom_board`\n\n- **HTTP:** `GET /jobs/phenom/board`\n- **What:** Search a Phenom People tenant's job board. Searches a company's public Phenom People career site (a white-labeled domain such as careers.whataburger.com or jobs.cvshealth.com — Phenom serves the search-results page as server-rendered HTML with the job data embedded inline, not a JSON API, but this is still credential-free public data with no auth, cookie, or session required). domain is the tenant's careers domain from its careers URL. Paged via offset/limit; limit is a best-effort page-size hint some tenants ignore, so count always reflects what actually came back.\n- **Params:** `category` (string, optional) — Filter: category contains; `domain` (string, **required**) — Phenom tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size hint, default 10, max 100 (some tenants ignore this and return their own configured page size regardless); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `sort` (string, optional) — Sort order, default relevant\n\n### `jobs_phenom_job`\n\n- **HTTP:** `GET /jobs/phenom/job`\n- **What:** Get a single Phenom People job. Returns a single Phenom People job with its full HTML/text description, category, and apply URL. domain is the tenant's careers domain (as in the board endpoint); id is the jobId/reqId from a board listing (e.g. JR10002958).\n- **Params:** `domain` (string, **required**) — Phenom tenant careers domain; `id` (string, **required**) — Phenom job id from a board listing\n\n### `jobs_pinpoint_board`\n\n- **HTTP:** `GET /jobs/pinpoint/board`\n- **What:** List a tenant's Pinpoint job board. Lists a tenant's public Pinpoint (pinpointhq.com) board postings with inline detail (full HTML description, key responsibilities, skills, and benefits, plus structured compensation when the tenant publishes a pay range). The company is the tenant subdomain from its careers URL https://{company}.pinpointhq.com/. Credential-free public JSON.\n- **Params:** `company` (string, **required**) — Pinpoint tenant subdomain (careers URL)\n\n### `jobs_recruitee_offer`\n\n- **HTTP:** `GET /jobs/recruitee/offer`\n- **What:** Get a single Recruitee offer. Returns a single Recruitee offer with its full HTML/text description and structured compensation when the board exposes it. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain; `id` (string, **required**) — Recruitee offer id\n\n### `jobs_recruitee_offers`\n\n- **HTTP:** `GET /jobs/recruitee/offers`\n- **What:** List a company's Recruitee offers. Lists a company's public Recruitee offers (detail is inline), optionally filtered by department, location, or remote. The company is the Recruitee subdomain from its careers URL https://{company}.recruitee.com/. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_board`\n\n- **HTTP:** `GET /jobs/rippling/board`\n- **What:** List a company's Rippling job board. Lists a company's public Rippling board postings (thin listing — title, department, work location). The company is the Rippling board slug from its careers URL https://ats.rippling.com/{company}/jobs. Detail (full description, employment type) is fetched per job via the single-job endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_job`\n\n- **HTTP:** `GET /jobs/rippling/job`\n- **What:** Get a single Rippling job. Returns a single Rippling job with its full HTML/text description, employment type, and work locations. The id is the job uuid from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug; `id` (string, **required**) — Rippling job uuid\n\n### `jobs_smartrecruiters_posting`\n\n- **HTTP:** `GET /jobs/smartrecruiters/posting`\n- **What:** Get a single SmartRecruiters posting. Returns a single SmartRecruiters posting with its jobAd description. Recruiter personal data is intentionally omitted. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id; `id` (string, **required**) — SmartRecruiters posting id\n\n### `jobs_smartrecruiters_postings`\n\n- **HTTP:** `GET /jobs/smartrecruiters/postings`\n- **What:** List a company's SmartRecruiters postings. Lists a company's public SmartRecruiters postings, paged via limit/offset. The company is the SmartRecruiters identifier from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id (careers URL); `limit` (integer, optional) — Page size, default 100, max 100; `offset` (integer, optional) — Page offset, default 0\n\n### `jobs_teamtailor_jobs`\n\n- **HTTP:** `GET /jobs/teamtailor/jobs`\n- **What:** List a company's Teamtailor job board. Lists a company's public Teamtailor board feed (JSON Feed), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Teamtailor subdomain from its careers URL https://{company}.teamtailor.com/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Teamtailor subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_ukg_board`\n\n- **HTTP:** `GET /jobs/ukg/board`\n- **What:** List a UKG Pro Recruiting tenant's job board. Lists a UKG Pro Recruiting (formerly UltiPro) tenant's public opportunities, paged via limit/offset. tenant and board both come from the careers URL https://recruiting.ultipro.com/{tenant}/JobBoard/{board}. Each posting carries a brief description inline (UKG's full detail page is HTML, not JSON). Credential-free public ATS JSON.\n- **Params:** `board` (string, **required**) — UKG job-board UUID (careers URL); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `tenant` (string, **required**) — UKG tenant code (careers URL)\n\n### `jobs_workable_posting`\n\n- **HTTP:** `GET /jobs/workable/posting`\n- **What:** Get a single Workable posting. Returns a single Workable posting with its full HTML/text description. The id is the posting shortcode from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug; `id` (string, **required**) — Workable posting shortcode\n\n### `jobs_workable_postings`\n\n- **HTTP:** `GET /jobs/workable/postings`\n- **What:** List a company's Workable postings. Lists a company's public Workable postings, normalized to the shared Job shape, optionally filtered by department, location, or remote. The company is the Workable account slug from its careers URL https://apply.workable.com/{company}/. Detail (full description) is fetched per job via the single-posting endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false); `search` (string, optional) — Free-text search\n\n### `jobs_workday_board`\n\n- **HTTP:** `GET /jobs/workday/board`\n- **What:** List a Workday tenant's job board. Lists a company's public Workday (CXS) postings, paged via limit/offset. tenant, datacenter (wd1/wd3/wd5/...), and site all come from the careers URL https://{tenant}.wd5.myworkdayjobs.com/{site}. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard (wd1, wd3, wd5, ...); `limit` (integer, optional) — Page size, default 20, max 20; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text search; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n### `jobs_workday_job`\n\n- **HTTP:** `GET /jobs/workday/job`\n- **What:** Get a single Workday job. Returns a single Workday posting's full detail (description, location, req id). path is the externalPath from a board listing. tenant/datacenter/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard; `path` (string, **required**) — Job externalPath from a board listing; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n## Tes (7)\n\n### `tes_job_detail`\n\n- **HTTP:** `GET /tes/jobs/detail`\n- **What:** Get a Tes teaching job. Returns normalized detail for one job posting by its numeric id (the id field returned by tes-job-search): employer, location, salary, contract terms/types, dates, and application contact/URL, plus a short excerpt of the listing description rather than the full long-form HTML copy.\n- **Params:** `id` (string, **required**) — Tes job id\n\n### `tes_job_employer`\n\n- **HTTP:** `GET /tes/jobs/employer`\n- **What:** Get a Tes jobs employer profile. Returns normalized detail for one jobs employer profile by its numeric id (the trailing id in tes-job-detail's employer_url field, e.g. .../jobs/employer/epsom-college-1039424 -- the 1039424): name, location, school type/phase/funding status/gender/age range, an about description, its postal address, and every currently-open position listed on the employer's own profile page (id, title, url -- call tes-job-detail with each id for the full posting).\n- **Params:** `id` (string, **required**) — Tes employer id\n\n### `tes_job_search`\n\n- **HTTP:** `GET /tes/jobs/search`\n- **What:** Search Tes teaching jobs. Searches Tes's (tes.com) teaching-jobs board. Returns normalized listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates via Tes's own location-autocomplete endpoint; omit for Tes's own default market, \"United Kingdom\". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated passthrough filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.\n- **Params:** `contract_term` (string, optional) — Contract term; `contract_type` (string, optional) — Contract type; `keywords` (string, optional) — Job title or keyword; `location` (string, optional) — Free-text place name resolved via Tes's own location autocomplete; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `position` (string, optional) — Comma-separated position category label(s) -- see the endpoint markdown; `radius_miles` (integer, optional) — Search radius around location, in miles; `salary_min` (integer, optional) — Minimum advertised salary, in the searched market's local currency; `sort` (string, optional) — Sort order; `subject` (string, optional) — Comma-separated subject label(s) -- see the endpoint markdown; `workplace` (string, optional) — Comma-separated workplace/organisation-type label(s) -- see the endpoint markdown\n\n### `tes_resource_detail`\n\n- **HTTP:** `GET /tes/resources/detail`\n- **What:** Get a Tes teaching resource. Returns normalized detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself, which robots.txt already disallows scraping regardless.\n- **Params:** `country` (string, optional) — Storefront market for pricing/currency; `id` (string, **required**) — Tes resource id\n\n### `tes_resource_search`\n\n- **HTTP:** `GET /tes/resources/search`\n- **What:** Search Tes teaching resources. Searches Tes's (tes.com) teaching-resources marketplace. Returns normalized listing facts (title, author, price, rating, downloads) -- not full listing descriptions -- out of respect for Tes's general reproduction/republication restriction. query is optional: omit it (alone, or combined with key_stage/subject/on_sale) for pure filter-driven or fully unfiltered browsing, matching Tes's own search API. sort mirrors the real search page's own Sort by dropdown; key_stage and subject mirror its left-hand Refine by filters (both closed, validated enums taken from Tes's own facet taxonomy, and always resolved against Tes's own single GB-taxonomy regardless of country). country controls result currency/localisation only (confirmed live for all seven values); it does not change which key_stage/subject values are valid.\n- **Params:** `country` (string, optional) — Storefront market; `key_stage` (string, optional) — Filter by age range; `on_sale` (boolean, optional) — Filter to discounted resources only; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, optional) — Search keywords -- omit for filter-driven or unfiltered browsing; `sort` (string, optional) — Sort order; `subject` (string, optional) — Filter by subject -- one of Tes's own top-level subject facet labels; see the endpoint markdown for the full list (two of the 29 values contain a comma, which is why this parameter is not expressed as a Swagger Enums() list)\n\n### `tes_resource_shop`\n\n- **HTTP:** `GET /tes/resources/shop`\n- **What:** Get a Tes teaching-resources author shop. Returns normalized detail for one teaching-resources author/seller shop by its username (from tes-resource-search/tes-resource-detail's author field, or the trailing path segment of author_url): display name, average rating, upload/view/download counts, a bio, and a page of that author's resource listing (id, title, price, thumbnail -- call tes-resource-detail with each id for subject/age-range/resource-type/rating/description). subject narrows the listing to one of the subject tabs shown on the shop's own page; these vary per author and are not a curated enum.\n- **Params:** `page` (integer, optional) — One-based page; `subject` (string, optional) — Subject tab to filter the listing to -- see the shop's own page for the current set; `username` (string, **required**) — Tes author username\n\n### `tes_school_search`\n\n- **HTTP:** `GET /tes/schools/search`\n- **What:** Search the Tes Schools Directory. Searches Tes's (tes.com) public Schools Directory by school name or location. Returns normalized listing facts (name, logo, a short description, address) for each matching school/employer. Each result's id is the same employer id tes-job-employer accepts, so a caller can go straight from a name/location search to a full employer profile (school type/phase/funding status/gender/age range, and its currently-open positions) without first needing a job posting to discover the id.\n- **Params:** `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, **required**) — School name or location\n\n## Upwork (3)\n\n### `upwork_freelancer`\n\n- **HTTP:** `GET /upwork/freelancer/{id}`\n- **What:** Get Upwork freelancer profile. Returns a normalized Upwork freelancer profile: name, title, verification badge, overview, hourly rate, rating and review count, Job Success Score, location and local time, total jobs/hours worked, and recent client feedback (title, comment, date, client name, rating). Public data sourced from Upwork's own server-rendered profile pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork freelancer id, the value after \\\n\n### `upwork_job`\n\n- **HTTP:** `GET /upwork/job/{id}`\n- **What:** Get Upwork job posting detail. Returns a normalized Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size). Public data sourced from Upwork's own server-rendered job pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork job id, e.g. from a search result's id field\n\n### `upwork_search`\n\n- **HTTP:** `GET /upwork/search`\n- **What:** Search Upwork job postings. Searches Upwork's public job listings by free-text keyword, returning normalized job summaries (title, budget, experience level, duration, posted date, description snippet, skill tags). Public data sourced from Upwork's own server-rendered search pages via a real browser-rendering backend.\n- **Params:** `page` (integer, optional) — 1-based result page. Defaults to 1.; `q` (string, **required**) — Free-text job search keyword\n\n## Fiverr (3)\n\n### `fiverr_gig`\n\n- **HTTP:** `GET /fiverr/gig/{username}/{slug}`\n- **What:** Get Fiverr gig detail. Returns a normalized Fiverr gig detail page: title, description, category, pricing packages (basic/standard/premium tiers with price and delivery time), rating, review count, orders in queue, tags, gallery images, and a seller summary (level, rating, response time, languages). Public data sourced from Fiverr's own server-rendered gig pages via a real browser-rendering backend.\n- **Params:** `slug` (string, **required**) — Fiverr gig URL slug, the trailing path segment after the username in a gig URL; `username` (string, **required**) — Fiverr seller username, e.g. from a search result's seller_username field\n\n### `fiverr_search`\n\n- **HTTP:** `GET /fiverr/search`\n- **What:** Search Fiverr gigs. Searches Fiverr's public gig listings by free-text keyword, returning normalized gig summaries (title, seller username, seller level, rating, review count, starting price, category, thumbnail image). Public data sourced from Fiverr's own server-rendered search pages via a real browser-rendering backend.\n- **Params:** `page` (integer, optional) — 1-based result page. Defaults to 1.; `q` (string, **required**) — Free-text gig search keyword\n\n### `fiverr_seller`\n\n- **HTTP:** `GET /fiverr/seller/{username}`\n- **What:** Get Fiverr seller profile. Returns a normalized Fiverr seller profile: display name, one-liner title, description, country, seller level, verification status, hourly rate, spoken languages, join date, and the seller's gig ids. Public data sourced from Fiverr's own server-rendered seller profile pages via a real browser-rendering backend.\n- **Params:** `username` (string, **required**) — Fiverr seller username, e.g. from a search result's seller_username field\n\nFile v1.0.17:skill-card.md\n\n## Description:\n\nResearches job postings, hiring signals, and freelance gigs via the Crawlora API, including company career sites, ATS boards, Upwork, and Fiverr, returning normalized JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and recruiting teams use this skill to search public job postings, inspect current company hiring, resolve ATS boards, summarize hiring signals, and research freelance gigs or sellers through Crawlora.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Queries, company slugs, gig identifiers, and freelancer identifiers are sent to Crawlora as a third-party provider.\n\nMitigation: Use the skill only when sharing that lookup data with Crawlora is acceptable for the task.\n\nRisk: The Crawlora API key could be exposed if copied into commands, files, or version control.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment and do not hardcode, pass, or commit the key.\n\nRisk: Broader Tes resource and school-directory endpoints may exceed the intended job-market research use case.\n\nMitigation: Use those endpoints only when they directly match the requested research scope.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/crawlora-org/skills/job-market-research)\n- [Crawlora Website](https://crawlora.net)\n- [Endpoint Reference](artifact/reference/endpoints.md)\n- [Crawlora API Base](https://api.crawlora.net/api/v1)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [API requests require CRAWLORA_API_KEY and use the documented Crawlora GET endpoints.]\n\n## Skill Version(s):\n\n1.0.17 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.16: 5 files, 16431 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (6685b), skill-card.md (2148b), SKILL.md (5408b), _meta.json (139b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: job-market-research\ndescription: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.\n---\n\n# Job market & hiring research\n\nSearch job postings, pull a company's live openings straight from its ATS,\nand research freelance gigs — all as normalized JSON from the Crawlora API,\nno scraping job boards or ATS pages by hand.\n\n## When to use this skill\n\n- \"Search for <role> jobs in <location>.\" (Indeed, Google/Amazon/Apple/Meta/Tesla careers)\n- \"What is <company> currently hiring for?\" — pull their ATS board directly.\n- \"Which ATS does <company> use?\" / \"find any company's job board.\"\n- \"Is <company> hiring aggressively?\" — aggregate hiring-signal analysis.\n- \"Find freelancers / gigs for <skill>\" (Upwork, Fiverr).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Job boards & search engines** — `/indeed/search` (keyword + location),\n   `/google-jobs/search` (careers.google.com), and the dedicated\n   `/amazon-jobs/search`, `/apple-jobs/search`, `/meta-jobs/search`,\n   `/tesla-jobs/list` for those employers. Each has a matching `.../job`\n   (or `/list`/`/board`) detail endpoint for one posting.\n2. **Any company's ATS board** — first resolve which system they use:\n   `/jobs/company-search` probes Greenhouse, Lever, Ashby, SmartRecruiters,\n   Workday, and more for a company slug. Then list postings via the matching\n   endpoint: `/jobs/greenhouse/board` (param `token`), `/jobs/lever/postings`,\n   `/jobs/workday/board`, `/jobs/smartrecruiters/postings`,\n   `/jobs/ashby/board` (param `org`), `/jobs/recruitee/offers`, `/jobs/workable/postings`,\n   `/jobs/rippling/board`, `/jobs/icims/board`, `/jobs/oracle/board`,\n   `/jobs/ukg/board`, `/jobs/personio/feed`, `/jobs/pinpoint/board`,\n   `/jobs/teamtailor/jobs`, `/jobs/eightfold/board`, `/jobs/gem/board` — one\n   endpoint per ATS, each with a matching single-posting detail endpoint.\n   Each ATS uses its own slug param name (`token`, `company`, `org`,\n   `tenant`+`datacenter`+`site`, or `domain`) — see `reference/endpoints.md`.\n3. **Hiring signals** — `/jobs/hiring-signals` aggregates a company's ATS\n   board into a hiring-velocity summary (headcount growth proxy) in one\n   call. Pass `provider` (the ATS name) plus that provider's slug param\n   (e.g. `provider=greenhouse` + `token=<slug>`, or `provider=ashby` + `org=<slug>`).\n4. **Freelance** — `/upwork/search` / `/fiverr/search` for gigs and jobs;\n   `/upwork/job/{id}`, `/fiverr/gig/{username}/{slug}` for detail;\n   `/upwork/freelancer/{id}`, `/fiverr/seller/{username}` for profiles.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Indeed,\nGoogle/Amazon/Apple/Meta/Tesla Jobs, ATS (`Jobs` group), Upwork, and Fiverr\nendpoint this skill uses.\n\n## Examples\n\n- **\"Is company X scaling?\"** — `/jobs/company-search` to find their board,\n  `/jobs/hiring-signals` for a velocity summary, then the raw board endpoint\n  to see which teams/roles are open.\n- **Cross-source role search:** `/indeed/search` + `/google-jobs/search` for\n  the same title/location, dedupe by company + title.\n- **Competitor hiring watch:** pull the ATS boards of 3-4 competitors on a\n  schedule and diff new postings between runs.\n- **Freelance rate-check:** `/upwork/search` for a skill, collect budgets\n  across postings to estimate a market rate.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public postings/boards; respect each source's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **ATS boards need the company's board slug**, not their public brand name —\n  use `/jobs/company-search` first if you don't already know it.\n- Results are paginated on most `search`/board-list endpoints — pass `page`\n  to walk the full list.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"job-market-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789350753975\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# job-market-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**57 endpoints across 10 platform group(s).**\n\n## Indeed (3)\n\n### `indeed_job`\n\n- **HTTP:** `GET /indeed/job`\n- **What:** Indeed job detail. Returns one Indeed job posting by its job key (the `job_key` field returned by search). Primary transport is Indeed's own credential-free GraphQL API; falls back to the original web-page transport if that fails.\n- **Params:** `jk` (string, **required**) — Indeed job key (16-character hex)\n\n### `indeed_locations_suggest`\n\n- **HTTP:** `GET /indeed/locations/suggest`\n- **What:** Indeed location suggestions. Returns Indeed's own location-search autocomplete suggestions for a partial location string -- the same suggestions the app's search bar offers -- for building a valid `l` value for search. Credential-free GraphQL only; there is no page-based fallback for this endpoint.\n- **Params:** `limit` (integer, optional) — Max suggestions to return, defaults to 10, maxes at 25; `q` (string, **required**) — Partial location text\n\n### `indeed_search`\n\n- **HTTP:** `GET /indeed/search`\n- **What:** Indeed job search. Searches Indeed job postings by keyword and location. Primary transport is Indeed's own credential-free GraphQL API; a page 1, unfiltered-by-date request uses it directly. Requesting page 2+ or the `fromage` filter (not yet expressible over the primary transport) uses the original web-page transport instead, with the same normalized response shape either way. `sort` enum: `relevance` (default), `date`.\n- **Params:** `fromage` (integer, optional) — Only jobs posted within this many days; `l` (string, optional) — Location (city, state, or zip); `page` (integer, optional) — Page number, 1-based, defaults to 1; `q` (string, **required**) — Search keywords; `radius` (integer, optional) — Search radius in miles; `sort` (string, optional) — Sort order: relevance, date\n\n## Google Jobs (2)\n\n### `google_jobs_job`\n\n- **HTTP:** `GET /google-jobs/job`\n- **What:** Google Jobs single posting. Returns one Google Careers posting by its numeric job id (the `id` field returned by search). Parsed from careers.google.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Numeric Google job id\n\n### `google_jobs_search`\n\n- **HTTP:** `GET /google-jobs/search`\n- **What:** Google Jobs search. Searches Google's public careers site (careers.google.com) via its server-rendered search page's embedded job data. Each result includes the description, responsibilities, and qualifications inline. Page size is fixed by Google at 20 results.\n- **Params:** `location` (string, optional) — Location filter (free text); `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Amazon Jobs (2)\n\n### `amazon_jobs_job`\n\n- **HTTP:** `GET /amazon-jobs/job`\n- **What:** Amazon Jobs single posting. Returns one Amazon.jobs posting by its numeric job id (the `id` field returned by search). Parsed from amazon.jobs's stable server-rendered job detail page — there is no separate JSON detail endpoint upstream.\n- **Params:** `id` (string, **required**) — Numeric Amazon job id\n\n### `amazon_jobs_search`\n\n- **HTTP:** `GET /amazon-jobs/search`\n- **What:** Amazon Jobs search. Searches Amazon's public careers site (amazon.jobs) via its credential-free search JSON. Each result includes the full description and qualifications inline. `sort` accepts `relevant` (default, upstream relevance ranking) or `recent` (newest posted first). Either `q` or `category` (or both) must be given -- `category` filters by Amazon's own job-category taxonomy and works with no text query at all.\n- **Params:** `category` (string, optional) — Amazon's own job-category taxonomy slug. Either q or category is required; `country` (string, optional) — ISO 3166-1 alpha-3 country code filter; `limit` (integer, optional) — Results per page, max 100 (default 20); `page` (integer, optional) — Page number, 1-based; `q` (string, optional) — Search query. Either q or category is required; `sort` (string, optional) — Sort order\n\n## Apple Jobs (2)\n\n### `apple_jobs_job`\n\n- **HTTP:** `GET /apple-jobs/job`\n- **What:** Apple Jobs single posting. Returns one Apple Careers posting by its job id (the `id` field returned by search, e.g. `200674676-0836` for a specific requisition or `PIPE-200314122` for an evergreen/pipeline retail role). Parsed from jobs.apple.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Apple job id\n\n### `apple_jobs_search`\n\n- **HTTP:** `GET /apple-jobs/search`\n- **What:** Apple Jobs search. Searches Apple's public careers site (jobs.apple.com) via its server-rendered search page's embedded job data. Page size is fixed by Apple at 20 results. Search results carry identity/location/team metadata only — call the job endpoint for the full description and qualifications.\n- **Params:** `location` (string, optional) — Location filter in Apple's own slug format, e.g. united-states-USA or singapore-SGP; `page` (integer, optional) — Page number, 1-based; `q` (string, **required**) — Search query\n\n## Meta Jobs (3)\n\n### `meta_jobs_job`\n\n- **HTTP:** `GET /meta-jobs/job`\n- **What:** Meta Jobs single posting. Returns one Meta Careers posting by its numeric job id (the `id` field returned by search or list). Parsed from metacareers.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Meta job id\n\n### `meta_jobs_list`\n\n- **HTTP:** `GET /meta-jobs/list`\n- **What:** Meta Jobs catalog listing. Returns a page of Meta's own public job sitemap -- every open requisition's id, canonical URL, and last-modified timestamp, with no team/location/keyword filtering. Use this for full-catalog enumeration or change tracking via last_modified; use search when you need to filter by team, technology, location, employment type, or keyword.\n- **Params:** `page` (integer, optional) — Page number, 1-based, defaults to 1; `page_size` (integer, optional) — Page size, defaults to 50, maxes at 200\n\n### `meta_jobs_search`\n\n- **HTTP:** `GET /meta-jobs/search`\n- **What:** Meta Jobs search. Searches Meta's public careers site (metacareers.com) via its own anonymous jobsearch GraphQL endpoint, with the same team/technology/location/employment-type/keyword/remote/sort filters the live search page offers. All filters are optional and combine with AND semantics; an empty request returns Meta's entire open-requisition catalog in one response. `q` matches team, technology, location, or ref/req-code names -- it is NOT a free-text search over job titles or descriptions. `teams` enum (org teams + technologies, both use the same field): `Advertising Technology`, `AR/VR`, `Artificial Intelligence`, `Business Development & Partnerships`, `Communications & Public Policy`, `Creative`, `Data & Analytics`, `Data Center`, `Design & User Experience`, `Enterprise Engineering`, `Global Operations`, `Infrastructure`, `Internship - Business`, `Internship - Engineering, Tech & Design`, `Internship - PhD`, `Legal, Finance, Facilities & Admin`, `People & Recruiting`, `Product Management`, `Research`, `Sales & Marketing`, `Security`, `Software Engineering`, `Technical Program Management`, `University Grad - Business`, `University Grad - Engineering, Tech & Design`, `University Grad - PhD & Postdoc`, `Facebook`, `Messenger`, `Instagram`, `WhatsApp`, `Meta Quest`. `roles` enum: `Full time employment`, `Internship`, `Short term employment`. `results_per_page` enum: `all`, `five`, `ten`.\n- **Params:** `is_remote_only` (boolean, optional) — Restrict to remote-only postings; `offices` (array, optional) — Repeatable location-id filter (OR) in Meta's own id format, e.g. menlo-park, london -- not a closed enum; `q` (string, optional) — Facet-name keyword: matches team, technology, location, or ref/req-code -- not a title/description search; `results_per_page` (string, optional) — Response size cap: all, five, ten; `roles` (array, optional) — Repeatable employment-type filter (OR); see roles enum above; `sort_by_new` (boolean, optional) — Sort newest-first instead of relevance; `teams` (array, optional) — Repeatable team-or-technology filter (OR); see teams enum above\n\n## Tesla Jobs (2)\n\n### `tesla_jobs_job`\n\n- **HTTP:** `GET /tesla-jobs/job`\n- **What:** Tesla Jobs single posting. Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint). Parsed from tesla.com's own job detail JSON endpoint.\n- **Params:** `id` (string, **required**) — Tesla job id\n\n### `tesla_jobs_list`\n\n- **HTTP:** `GET /tesla-jobs/list`\n- **What:** Tesla Jobs listing. Searches Tesla's public careers site (tesla.com/careers) via its own careers-state JSON endpoint. Tesla's own endpoint always returns its entire global job dataset regardless of query parameters; this filters and paginates that snapshot server-side. Listings carry identity/department/location metadata only — call the job endpoint for the full description, responsibilities, and requirements.\n- **Params:** `location` (string, optional) — Filter by location, case-insensitive substring match; `page` (integer, optional) — Page number, 1-based; `page_size` (integer, optional) — Results per page, up to 100; `query` (string, optional) — Filter by title or department, case-insensitive substring match\n\n## Jobs (30)\n\n### `jobs_ashby_board`\n\n- **HTTP:** `GET /jobs/ashby/board`\n- **What:** List an organization's Ashby job board. Lists an organization's public Ashby board postings with inline detail (description, compensation when include_compensation=true). The org is the Ashby slug from its careers URL. An unknown org returns an empty board (Ashby does not 404). Credential-free public ATS JSON.\n- **Params:** `include_compensation` (boolean, optional) — Include compensation summary; `org` (string, **required**) — Ashby org slug (careers URL)\n\n### `jobs_company_search`\n\n- **HTTP:** `GET /jobs/company-search`\n- **What:** Find which ATS a company uses by slug. Probes Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Rippling, Teamtailor, and Pinpoint in parallel for a slug and reports the providers where it resolves to a non-empty board (with the open-role count and board URL). Workday is excluded (its board needs tenant + datacenter + site). Credential-free public ATS JSON.\n- **Params:** `slug` (string, **required**) — Company careers slug to probe\n\n### `jobs_eightfold_board`\n\n- **HTTP:** `GET /jobs/eightfold/board`\n- **What:** List an Eightfold tenant's job board. Lists a company's public Eightfold AI job board, paged via limit/offset. tenant is the {tenant}.eightfold.ai subdomain from the careers URL; domain is the hiring organization's own domain (e.g. microsoft.com), also visible on the tenant's careers page. Tries the newer PCSX search first, falling back to the legacy SmartApply generation when PCSX is not enabled for the tenant. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `limit` (integer, optional) — Page size, default 10, max 10 (upstream caps results per page regardless of a larger value); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `query` (string, optional) — Free-text search; `tenant` (string, **required**) — Eightfold tenant subdomain (careers URL)\n\n### `jobs_eightfold_job`\n\n- **HTTP:** `GET /jobs/eightfold/job`\n- **What:** Get a single Eightfold position. Returns a single Eightfold position with its full HTML/text description. id is the position id from a board listing; tenant/domain as in the board endpoint. Tries the newer PCSX detail first, falling back to the legacy SmartApply detail generation. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — Hiring organization domain; `id` (string, **required**) — Eightfold position id from a board listing; `tenant` (string, **required**) — Eightfold tenant subdomain\n\n### `jobs_gem_board`\n\n- **HTTP:** `GET /jobs/gem/board`\n- **What:** List a company's Gem job board. Lists a company's public Gem (gem.com) board postings with inline detail (full HTML description, and compensation when the company publishes a pay range). The company is the Gem vanity URL slug from its careers URL. Credential-free public GraphQL.\n- **Params:** `company` (string, **required**) — Gem vanity URL slug (careers URL)\n\n### `jobs_greenhouse_board`\n\n- **HTTP:** `GET /jobs/greenhouse/board`\n- **What:** List a company's Greenhouse job board. Lists a company's public Greenhouse board postings, normalized to the shared Job shape. Set content=true to include each job's full HTML description in one call. The token is the company's Greenhouse board slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `content` (boolean, optional) — Include full HTML description per job; `token` (string, **required**) — Greenhouse board token (careers URL slug)\n\n### `jobs_greenhouse_job`\n\n- **HTTP:** `GET /jobs/greenhouse/job`\n- **What:** Get a single Greenhouse job. Returns a single Greenhouse job with its full HTML/text description, department, and offices. Credential-free public ATS JSON.\n- **Params:** `id` (string, **required**) — Greenhouse job id; `token` (string, **required**) — Greenhouse board token\n\n### `jobs_hiring_signals`\n\n- **HTTP:** `GET /jobs/hiring-signals`\n- **What:** Aggregate hiring signals for a company's board. Aggregates a company's ATS board into a hiring snapshot: total open roles, breakdowns by department/location/title, remote share, and how many roles are new in the last 7/30 days — a leading indicator of company growth. Supply provider plus that provider's slug params (token / company / org / tenant+datacenter+site / domain). Breakdowns are computed over the fetched postings. Credential-free public ATS JSON.\n- **Params:** `board` (string, optional) — ukg job-board UUID; `company` (string, optional) — lever / smartrecruiters / workable / recruitee / rippling / personio / teamtailor / gem / pinpoint company slug; `datacenter` (string, optional) — workday datacenter shard; `domain` (string, optional) — icims careers domain / eightfold organization domain; `host` (string, optional) — oracle cloud host (*.oraclecloud.com); `org` (string, optional) — ashby org slug; `provider` (string, **required**) — ATS provider; `site` (string, optional) — workday / oracle career site; `tenant` (string, optional) — workday / eightfold tenant; `token` (string, optional) — greenhouse board token\n\n### `jobs_icims_board`\n\n- **HTTP:** `GET /jobs/icims/board`\n- **What:** List an iCIMS tenant's job board. Lists a company's public iCIMS job board (served through the tenant's white-labeled careers domain, e.g. careers.costco.com — not the bare {company}.icims.com subdomain, which is an OAuth-gated employee portal), paged via page/limit, with the full description inline per job. domain is the tenant's careers domain from its careers URL. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size, default 20, max 50; `location` (string, optional) — Filter: location contains; `page` (integer, optional) — Page number, default 1\n\n### `jobs_icims_job`\n\n- **HTTP:** `GET /jobs/icims/job`\n- **What:** Get a single iCIMS job. Returns a single iCIMS job with its full HTML/text description, department, and benefits. id is the req_id/slug from a board listing; lang defaults to en-us. Credential-free public ATS JSON.\n- **Params:** `domain` (string, **required**) — iCIMS tenant careers domain; `id` (string, **required**) — iCIMS job req_id/slug from a board listing; `lang` (string, optional) — Language code, default en-us\n\n### `jobs_lever_posting`\n\n- **HTTP:** `GET /jobs/lever/posting`\n- **What:** Get a single Lever posting. Returns a single Lever posting with its full HTML/text description. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug; `id` (string, **required**) — Lever posting id\n\n### `jobs_lever_postings`\n\n- **HTTP:** `GET /jobs/lever/postings`\n- **What:** List a company's Lever postings. Lists a company's public Lever postings (detail is inline), optionally filtered by department, location, or remote. The company is the Lever slug from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Lever company slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_oracle_board`\n\n- **HTTP:** `GET /jobs/oracle/board`\n- **What:** List an Oracle Recruiting (ORC) tenant's job board. Lists an Oracle Recruiting Cloud tenant's public requisitions, paged via limit/offset. host and site both come from the careers URL https://{host}/hcmUI/CandidateExperience/en/sites/{site}/ (host must be an *.oraclecloud.com hostname; site looks like CX_1). The listing carries a short description; use the single-job endpoint for full detail. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (careers URL, *.oraclecloud.com); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `site` (string, **required**) — Oracle career site number\n\n### `jobs_oracle_job`\n\n- **HTTP:** `GET /jobs/oracle/job`\n- **What:** Get a single Oracle Recruiting (ORC) requisition. Returns a single Oracle Recruiting requisition with its full HTML/text description (description, responsibilities, qualifications). id is the requisition Id from a board listing; host/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `host` (string, **required**) — Oracle Cloud host (*.oraclecloud.com); `id` (string, **required**) — Oracle requisition Id from a board listing; `site` (string, **required**) — Oracle career site number\n\n### `jobs_personio_feed`\n\n- **HTTP:** `GET /jobs/personio/feed`\n- **What:** List a company's Personio job board. Lists a company's public Personio board feed (XML), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Personio subdomain from its careers URL https://{company}.jobs.personio.de/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Personio subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_phenom_board`\n\n- **HTTP:** `GET /jobs/phenom/board`\n- **What:** Search a Phenom People tenant's job board. Searches a company's public Phenom People career site (a white-labeled domain such as careers.whataburger.com or jobs.cvshealth.com — Phenom serves the search-results page as server-rendered HTML with the job data embedded inline, not a JSON API, but this is still credential-free public data with no auth, cookie, or session required). domain is the tenant's careers domain from its careers URL. Paged via offset/limit; limit is a best-effort page-size hint some tenants ignore, so count always reflects what actually came back.\n- **Params:** `category` (string, optional) — Filter: category contains; `domain` (string, **required**) — Phenom tenant careers domain (careers URL); `keywords` (string, optional) — Free-text keyword search; `limit` (integer, optional) — Page size hint, default 10, max 100 (some tenants ignore this and return their own configured page size regardless); `location` (string, optional) — Filter: location contains; `offset` (integer, optional) — Page offset, default 0; `sort` (string, optional) — Sort order, default relevant\n\n### `jobs_phenom_job`\n\n- **HTTP:** `GET /jobs/phenom/job`\n- **What:** Get a single Phenom People job. Returns a single Phenom People job with its full HTML/text description, category, and apply URL. domain is the tenant's careers domain (as in the board endpoint); id is the jobId/reqId from a board listing (e.g. JR10002958).\n- **Params:** `domain` (string, **required**) — Phenom tenant careers domain; `id` (string, **required**) — Phenom job id from a board listing\n\n### `jobs_pinpoint_board`\n\n- **HTTP:** `GET /jobs/pinpoint/board`\n- **What:** List a tenant's Pinpoint job board. Lists a tenant's public Pinpoint (pinpointhq.com) board postings with inline detail (full HTML description, key responsibilities, skills, and benefits, plus structured compensation when the tenant publishes a pay range). The company is the tenant subdomain from its careers URL https://{company}.pinpointhq.com/. Credential-free public JSON.\n- **Params:** `company` (string, **required**) — Pinpoint tenant subdomain (careers URL)\n\n### `jobs_recruitee_offer`\n\n- **HTTP:** `GET /jobs/recruitee/offer`\n- **What:** Get a single Recruitee offer. Returns a single Recruitee offer with its full HTML/text description and structured compensation when the board exposes it. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain; `id` (string, **required**) — Recruitee offer id\n\n### `jobs_recruitee_offers`\n\n- **HTTP:** `GET /jobs/recruitee/offers`\n- **What:** List a company's Recruitee offers. Lists a company's public Recruitee offers (detail is inline), optionally filtered by department, location, or remote. The company is the Recruitee subdomain from its careers URL https://{company}.recruitee.com/. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Recruitee subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_board`\n\n- **HTTP:** `GET /jobs/rippling/board`\n- **What:** List a company's Rippling job board. Lists a company's public Rippling board postings (thin listing — title, department, work location). The company is the Rippling board slug from its careers URL https://ats.rippling.com/{company}/jobs. Detail (full description, employment type) is fetched per job via the single-job endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_rippling_job`\n\n- **HTTP:** `GET /jobs/rippling/job`\n- **What:** Get a single Rippling job. Returns a single Rippling job with its full HTML/text description, employment type, and work locations. The id is the job uuid from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Rippling board slug; `id` (string, **required**) — Rippling job uuid\n\n### `jobs_smartrecruiters_posting`\n\n- **HTTP:** `GET /jobs/smartrecruiters/posting`\n- **What:** Get a single SmartRecruiters posting. Returns a single SmartRecruiters posting with its jobAd description. Recruiter personal data is intentionally omitted. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id; `id` (string, **required**) — SmartRecruiters posting id\n\n### `jobs_smartrecruiters_postings`\n\n- **HTTP:** `GET /jobs/smartrecruiters/postings`\n- **What:** List a company's SmartRecruiters postings. Lists a company's public SmartRecruiters postings, paged via limit/offset. The company is the SmartRecruiters identifier from its careers URL. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — SmartRecruiters company id (careers URL); `limit` (integer, optional) — Page size, default 100, max 100; `offset` (integer, optional) — Page offset, default 0\n\n### `jobs_teamtailor_jobs`\n\n- **HTTP:** `GET /jobs/teamtailor/jobs`\n- **What:** List a company's Teamtailor job board. Lists a company's public Teamtailor board feed (JSON Feed), normalized to the shared Job shape with detail inline, optionally filtered by department, location, or remote. The company is the Teamtailor subdomain from its careers URL https://{company}.teamtailor.com/. Credential-free public ATS feed.\n- **Params:** `company` (string, **required**) — Teamtailor subdomain (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false)\n\n### `jobs_ukg_board`\n\n- **HTTP:** `GET /jobs/ukg/board`\n- **What:** List a UKG Pro Recruiting tenant's job board. Lists a UKG Pro Recruiting (formerly UltiPro) tenant's public opportunities, paged via limit/offset. tenant and board both come from the careers URL https://recruiting.ultipro.com/{tenant}/JobBoard/{board}. Each posting carries a brief description inline (UKG's full detail page is HTML, not JSON). Credential-free public ATS JSON.\n- **Params:** `board` (string, **required**) — UKG job-board UUID (careers URL); `limit` (integer, optional) — Page size, default 25, max 50; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text keyword search; `tenant` (string, **required**) — UKG tenant code (careers URL)\n\n### `jobs_workable_posting`\n\n- **HTTP:** `GET /jobs/workable/posting`\n- **What:** Get a single Workable posting. Returns a single Workable posting with its full HTML/text description. The id is the posting shortcode from a listing. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug; `id` (string, **required**) — Workable posting shortcode\n\n### `jobs_workable_postings`\n\n- **HTTP:** `GET /jobs/workable/postings`\n- **What:** List a company's Workable postings. Lists a company's public Workable postings, normalized to the shared Job shape, optionally filtered by department, location, or remote. The company is the Workable account slug from its careers URL https://apply.workable.com/{company}/. Detail (full description) is fetched per job via the single-posting endpoint. Credential-free public ATS JSON.\n- **Params:** `company` (string, **required**) — Workable account slug (careers URL); `department` (string, optional) — Filter: department contains; `location` (string, optional) — Filter: location contains; `remote` (boolean, optional) — Filter by remote (true or false); `search` (string, optional) — Free-text search\n\n### `jobs_workday_board`\n\n- **HTTP:** `GET /jobs/workday/board`\n- **What:** List a Workday tenant's job board. Lists a company's public Workday (CXS) postings, paged via limit/offset. tenant, datacenter (wd1/wd3/wd5/...), and site all come from the careers URL https://{tenant}.wd5.myworkdayjobs.com/{site}. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard (wd1, wd3, wd5, ...); `limit` (integer, optional) — Page size, default 20, max 20; `offset` (integer, optional) — Page offset, default 0; `search` (string, optional) — Free-text search; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n### `jobs_workday_job`\n\n- **HTTP:** `GET /jobs/workday/job`\n- **What:** Get a single Workday job. Returns a single Workday posting's full detail (description, location, req id). path is the externalPath from a board listing. tenant/datacenter/site as in the board endpoint. Credential-free public ATS JSON.\n- **Params:** `datacenter` (string, **required**) — Workday datacenter shard; `path` (string, **required**) — Job externalPath from a board listing; `site` (string, **required**) — Workday career site; `tenant` (string, **required**) — Workday tenant\n\n## Tes (7)\n\n### `tes_job_detail`\n\n- **HTTP:** `GET /tes/jobs/detail`\n- **What:** Get a Tes teaching job. Returns normalized detail for one job posting by its numeric id (the id field returned by tes-job-search): employer, location, salary, contract terms/types, dates, and application contact/URL, plus a short excerpt of the listing description rather than the full long-form HTML copy.\n- **Params:** `id` (string, **required**) — Tes job id\n\n### `tes_job_employer`\n\n- **HTTP:** `GET /tes/jobs/employer`\n- **What:** Get a Tes jobs employer profile. Returns normalized detail for one jobs employer profile by its numeric id (the trailing id in tes-job-detail's employer_url field, e.g. .../jobs/employer/epsom-college-1039424 -- the 1039424): name, location, school type/phase/funding status/gender/age range, an about description, its postal address, and every currently-open position listed on the employer's own profile page (id, title, url -- call tes-job-detail with each id for the full posting).\n- **Params:** `id` (string, **required**) — Tes employer id\n\n### `tes_job_search`\n\n- **HTTP:** `GET /tes/jobs/search`\n- **What:** Search Tes teaching jobs. Searches Tes's (tes.com) teaching-jobs board. Returns normalized listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates via Tes's own location-autocomplete endpoint; omit for Tes's own default market, \"United Kingdom\". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated passthrough filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.\n- **Params:** `contract_term` (string, optional) — Contract term; `contract_type` (string, optional) — Contract type; `keywords` (string, optional) — Job title or keyword; `location` (string, optional) — Free-text place name resolved via Tes's own location autocomplete; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `position` (string, optional) — Comma-separated position category label(s) -- see the endpoint markdown; `radius_miles` (integer, optional) — Search radius around location, in miles; `salary_min` (integer, optional) — Minimum advertised salary, in the searched market's local currency; `sort` (string, optional) — Sort order; `subject` (string, optional) — Comma-separated subject label(s) -- see the endpoint markdown; `workplace` (string, optional) — Comma-separated workplace/organisation-type label(s) -- see the endpoint markdown\n\n### `tes_resource_detail`\n\n- **HTTP:** `GET /tes/resources/detail`\n- **What:** Get a Tes teaching resource. Returns normalized detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself, which robots.txt already disallows scraping regardless.\n- **Params:** `country` (string, optional) — Storefront market for pricing/currency; `id` (string, **required**) — Tes resource id\n\n### `tes_resource_search`\n\n- **HTTP:** `GET /tes/resources/search`\n- **What:** Search Tes teaching resources. Searches Tes's (tes.com) teaching-resources marketplace. Returns normalized listing facts (title, author, price, rating, downloads) -- not full listing descriptions -- out of respect for Tes's general reproduction/republication restriction. query is optional: omit it (alone, or combined with key_stage/subject/on_sale) for pure filter-driven or fully unfiltered browsing, matching Tes's own search API. sort mirrors the real search page's own Sort by dropdown; key_stage and subject mirror its left-hand Refine by filters (both closed, validated enums taken from Tes's own facet taxonomy, and always resolved against Tes's own single GB-taxonomy regardless of country). country controls result currency/localisation only (confirmed live for all seven values); it does not change which key_stage/subject values are valid.\n- **Params:** `country` (string, optional) — Storefront market; `key_stage` (string, optional) — Filter by age range; `on_sale` (boolean, optional) — Filter to discounted resources only; `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, optional) — Search keywords -- omit for filter-driven or unfiltered browsing; `sort` (string, optional) — Sort order; `subject` (string, optional) — Filter by subject -- one of Tes's own top-level subject facet labels; see the endpoint markdown for the full list (two of the 29 values contain a comma, which is why this parameter is not expressed as a Swagger Enums() list)\n\n### `tes_resource_shop`\n\n- **HTTP:** `GET /tes/resources/shop`\n- **What:** Get a Tes teaching-resources author shop. Returns normalized detail for one teaching-resources author/seller shop by its username (from tes-resource-search/tes-resource-detail's author field, or the trailing path segment of author_url): display name, average rating, upload/view/download counts, a bio, and a page of that author's resource listing (id, title, price, thumbnail -- call tes-resource-detail with each id for subject/age-range/resource-type/rating/description). subject narrows the listing to one of the subject tabs shown on the shop's own page; these vary per author and are not a curated enum.\n- **Params:** `page` (integer, optional) — One-based page; `subject` (string, optional) — Subject tab to filter the listing to -- see the shop's own page for the current set; `username` (string, **required**) — Tes author username\n\n### `tes_school_search`\n\n- **HTTP:** `GET /tes/schools/search`\n- **What:** Search the Tes Schools Directory. Searches Tes's (tes.com) public Schools Directory by school name or location. Returns normalized listing facts (name, logo, a short description, address) for each matching school/employer. Each result's id is the same employer id tes-job-employer accepts, so a caller can go straight from a name/location search to a full employer profile (school type/phase/funding status/gender/age range, and its currently-open positions) without first needing a job posting to discover the id.\n- **Params:** `page` (integer, optional) — One-based page; `page_size` (integer, optional) — Results per page; `query` (string, **required**) — School name or location\n\n## Upwork (3)\n\n### `upwork_freelancer`\n\n- **HTTP:** `GET /upwork/freelancer/{id}`\n- **What:** Get Upwork freelancer profile. Returns a normalized Upwork freelancer profile: name, title, verification badge, overview, hourly rate, rating and review count, Job Success Score, location and local time, total jobs/hours worked, and recent client feedback (title, comment, date, client name, rating). Public data sourced from Upwork's own server-rendered profile pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork freelancer id, the value after \\\n\n### `upwork_job`\n\n- **HTTP:** `GET /upwork/job/{id}`\n- **What:** Get Upwork job posting detail. Returns a normalized Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size). Public data sourced from Upwork's own server-rendered job pages via a real browser-rendering backend.\n- **Params:** `id` (string, **required**) — Upwork job id, e.g. from a search result's id field\n\n### `upwork_search`\n\n- **HTTP:** `GET /upwork/search`\n- **What:** Search Upwork job postings. Searches Upwork's public job listings by free-text keyword, returning normalized job summaries (title, budget, experience level, duration, posted date, description snippet, skill tags). Public data sourced from Upwork's own server-rendered search pages via a real browser-rendering backend.\n- **Params:** `page` (integer, optional) — 1-based result page. Defaults to 1.; `q` (string, **required**) — Free-text job search keyword\n\n## Fiverr (3)\n\n### `fiverr_gig`\n\n- **HTTP:** `GET /fiverr/gig/{username}/{slug}`\n- **What:** Get Fiverr gig detail. Returns a normalized Fiverr gig detail page: title, description, category, pricing packages (basic/standard/premium tiers with price and delivery time), rating, review count, orders in queue, tags, gallery images, and a seller summary (level, rating, response time, languages). Public data sourced from Fiverr's own server-rendered gig pages via a real browser-rendering backend.\n- **Params:** `slug` (string, **required**) — Fiverr gig URL s\n\nArchive v1.0.15: 5 files, 16105 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (5167b), skill-card.md (2018b), SKILL.md (5408b), _meta.json (139b)\n\nArchive v1.0.14: 5 files, 16138 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (4910b), skill-card.md (2389b), SKILL.md (5408b), _meta.json (139b)\n\nArchive v1.0.13: 5 files, 16102 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (4585b), skill-card.md (2599b), SKILL.md (5446b), _meta.json (139b)\n\nArchive v1.0.12: 5 files, 15742 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (4285b), skill-card.md (2063b), SKILL.md (5446b), _meta.json (139b)\n\nArchive v1.0.11: 5 files, 15779 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (4237b), skill-card.md (2232b), SKILL.md (5446b), _meta.json (139b)\n\nArchive v1.0.10: 5 files, 15082 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (2005b), skill-card.md (2360b), SKILL.md (5420b), _meta.json (139b)\n\nArchive v1.0.9: 5 files, 14945 bytes\n\nFiles: reference/endpoints.md (39662b), scripts/crawlora.sh (1870b), skill-card.md (2187b), SKILL.md (5420b), _meta.json (138b)","readmeExcerpt":"Skill: job-market-research Owner: crawlora-org Summary: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, a","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'"},{"language":"sh","snippet":"# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'"},{"language":"sh","snippet":"# Search:\nscripts/crawlora.sh /indeed/search q=\"staff engineer\" l=\"Remote\" | jq '.'\n\n# Resolve then pull a company's ATS board:\nscripts/crawlora.sh /jobs/company-search slug=stripe | jq '.'\nscripts/crawlora.sh /jobs/greenhouse/board token=stripe | jq '.data'\n\n# Hiring signals:\nscripts/crawlora.sh /jobs/hiring-signals provider=greenhouse token=stripe | jq '.'\n\n# Freelance:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: job-market-research\ndescription: Researches job postings, hiring signals, and freelance gigs via the Crawlora API — Indeed, Google/Amazon/Apple/Meta/Tesla careers sites, any company's ATS board (Greenhouse, Lever, Workday, SmartRecruiters, Ashby, and more), plus Upwork and Fiverr — returning clean JSON. Use when the user wants to search job postings, see what a specific company is hiring for, aggregate hiring signals for a company, or research freelance gigs and sellers.\n---\n\n# Job market & hiring research\n\nSearch job postings, pull a company's live openings straight from its ATS,\nand research freelance gigs — all as normalized JSON from the Crawlora API,\nno scraping job boards or ATS pages by hand.\n\n## When to use this skill\n\n- \"Search for <role> jobs in <location>.\" (Indeed, Google/Amazon/Apple/Meta/Tesla careers)\n- \"What is <company> currently hiring for?\" — pull their ATS board directly.\n- \"Which ATS does <company> use?\" / \"find any company's job board.\"\n- \"Is <company> hiring aggressively?\" — aggregate hiring-signal analysis.\n- \"Find freelancers / gigs for <skill>\" (Upwork, Fiverr).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Job boards & search engines** — `/indeed/search` (keyword + location),\n   `/google-jobs/search` (careers.google.com), and the dedicated\n   `/amazon-jobs/search`, `/apple-jobs/search`, `/meta-jobs/search`,\n   `/tesla-jobs/list` for those employers. Each has a matching `.../job`\n   (or `/list`/`/board`) detail endpoint for one posting.\n2. **Any company's ATS board** — first resolve which system they use:\n   `/jobs/company-search` probes Greenhouse, Lever, Ashby, SmartRecruiters,\n   Workday, and more for a company slug. Then list postings via the matching\n   endpoint: `/jobs/greenhouse/board` (param `token`), `/jobs/lever/postings`,\n   `/jobs/workday/board`, `/jobs/smartrecruiters/postings`,\n   `/jobs/ashby/board` (param `org`), `/jobs/recruitee/offers`, `/jobs/workable/postings`,\n   `/jobs/rippling/board`, `/jobs/icims/board`, `/jobs/oracle/board`,\n   `/jobs/ukg/board`, `/jobs/personio/feed`, `/jobs/pinpoint/board`,\n   `/jobs/teamtailor/jobs`, `/jobs/eightfold/board`, `/jobs/gem/board` — one\n   endpoint per ATS, each with a matching single-posting detail endpoint.\n   Each ATS uses its own slug param name (`token`, `company`, `org`,\n   `tenant`+`datacenter`+`site`, or `domain`) — see `reference/endpoints.md`.\n3. **Hiring signals** — `/jobs/hiring-signals` aggregates a company's ATS\n   board into a hiring-velocity summary (headcount growth proxy) in one\n   call. Pass `provider` (the ATS name) plus that provider's slug param\n   (e."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"job-market-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789954615467\n}"},{"path":"reference/endpoints.md","content":"# job-market-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**59 endpoints across 10 platform group(s).**\n\n## Indeed (3)\n\n### `indeed_job`\n\n- **HTTP:** `GET /indeed/job`\n- **What:** Indeed job detail. Returns one Indeed job posting by its job key (the `job_key` field returned by search). Primary transport is Indeed's own credential-free GraphQL API; falls back to the original web-page transport if that fails.\n- **Params:** `jk` (string, **required**) — Indeed job key (16-character hex)\n\n### `indeed_locations_suggest`\n\n- **HTTP:** `GET /indeed/locations/suggest`\n- **What:** Indeed location suggestions. Returns Indeed's own location-search autocomplete suggestions for a partial location string -- the same suggestions the app's search bar offers -- for building a valid `l` value for search. Credential-free GraphQL only; there is no page-based fallback for this endpoint.\n- **Params:** `limit` (integer, optional) — Max suggestions to return, defaults to 10, maxes at 25; `q` (string, **required**) — Partial location text\n\n### `indeed_search`\n\n- **HTTP:** `GET /indeed/search`\n- **What:** Indeed job search. Searches Indeed job postings by keyword and location. Primary transport is Indeed's own credential-free GraphQL API; a page 1, unfiltered-by-date request uses it directly. Requesting page 2+ or the `fromage` filter (not yet expressible over the primary transport) uses the original web-page transport instead, with the same normalized response shape either way. `sort` enum: `relevance` (default), `date`.\n- **Params:** `fromage` (integer, optional) — Only jobs posted within this many days; `l` (string, optional) — Location (city, state, or zip); `page` (integer, optional) — Page number, 1-based, defaults to 1; `q` (string, **required**) — Search keywords; `radius` (integer, optional) — Search radius in miles; `sort` (string, optional) — Sort order: relevance, date\n\n## Google Jobs (2)\n\n### `google_jobs_job`\n\n- **HTTP:** `GET /google-jobs/job`\n- **What:** Google Jobs single posting. Returns one Google Careers posting by its numeric job id (the `id` field returned by search). Parsed from careers.google.com's server-rendered job detail page.\n- **Params:** `id` (string, **required**) — Numeric Google job id\n\n### `google_jobs_search`\n\n- **HTTP:** `GET /google-jobs/search`\n- **What:** Google Jobs search. Searches Google's public careers site (careers.google.com) via its server-rendered search page's embedded job data. Each result includes the description, responsibilities, and qualifications inline. Page size is fixed by Google at 20 results.\n"},{"path":"skill-card.md","content":"## Description:\n\nResearches job postings, hiring signals, and freelance gigs via the Crawlora API across job boards, employer career sites, ATS boards, Upwork, and Fiverr, returning clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to search public job postings, inspect company hiring activity, resolve ATS boards, aggregate hiring signals, and research freelance gigs through Crawlora API calls.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends the Crawlora API key and job or freelance search parameters to Crawlora.\n\nMitigation: Use only an intended Crawlora API key and avoid sensitive personal or confidential business information in search terms unless sharing it with Crawlora is acceptable.\n\nRisk: Job, ATS, and freelance marketplace results are external public data and may be incomplete, stale, or subject to source terms.\n\nMitigation: Validate important hiring or market conclusions against the source postings and respect the applicable terms for each data source.\n\nRisk: The helper performs API calls through a shell script and requires local environment setup.\n\nMitigation: Set CRAWLORA_API_KEY in the environment, keep it out of files and command arguments, and review generated shell commands before execution.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [Crawlora account and API key](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/job-market-research)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, JSON, Guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and uses GET requests against documented Crawlora routes.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1655,"uniquenessScore":40,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T14:44:13.899Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:45:57.250Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}