{"id":"2b2325ad-62ec-475f-af23-0da15e0ad973","entityType":"agent","slug":"clawhub-crawlora-org-upwork-research","name":"upwork-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-upwork-research","canonicalPath":"/agent/clawhub-crawlora-org-upwork-research","generatedAt":"2026-10-14T04:34:54.476Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:38:07.231Z","emptyReason":null},"description":"Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 953 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:upwork-research","sourceUrl":"https://clawhub.ai/crawlora-org/upwork-research","homepage":"https://clawhub.ai/crawlora-org/skills/upwork-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/upwork-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/upwork-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"upwork-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-12T02:38:07.231Z","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-12T02:38:07.231Z","emptyReason":null},"stars":null,"forks":null,"downloads":953,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.16","tractionLabel":"953 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:38:07.115Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T02:38:07.231Z","lastCrawledAt":"2026-10-12T02:38:07.115Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T02:38:07.115Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.16","createdAt":"2026-09-17T10:21:51.984Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":6415},{"version":"1.0.15","createdAt":"2026-09-14T02:19:08.939Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":6913},{"version":"1.0.14","createdAt":"2026-09-10T12:37:37.544Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":6655},{"version":"1.0.13","createdAt":"2026-09-10T12:18:23.603Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":6555},{"version":"1.0.12","createdAt":"2026-09-10T12:08:41.242Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":6238},{"version":"1.0.11","createdAt":"2026-09-10T11:56:33.910Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":6271},{"version":"1.0.10","createdAt":"2026-09-10T11:44:37.317Z","changelog":"Scope helper routes and remove secret-shaped key examples","fileCount":5,"zipByteSize":6126},{"version":"1.0.9","createdAt":"2026-09-10T07:17:04.653Z","changelog":"Migrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins","fileCount":5,"zipByteSize":5767}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:upwork-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:upwork-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/upwork-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-upwork-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-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-14T04:34:54.475Z"}},"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-upwork-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-upwork-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-12T02:38:07.231Z","emptyReason":null},"readme":"Skill: upwork-research\n\nOwner: crawlora-org\n\nSummary: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n\nTags: latest:1.0.16\n\nVersion history:\n\nv1.0.16 | 2026-09-17T10:21:51.984Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.15 | 2026-09-14T02:19:08.939Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.14 | 2026-09-10T12:37:37.544Z | user\n\nValidate API keys before curl config\n\nv1.0.13 | 2026-09-10T12:18:23.603Z | user\n\nKeep API keys out of process arguments\n\nv1.0.12 | 2026-09-10T12:08:41.242Z | user\n\nReject curl local-file query syntax\n\nv1.0.11 | 2026-09-10T11:56:33.910Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.10 | 2026-09-10T11:44:37.317Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.9 | 2026-09-10T07:17:04.653Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.8 | 2026-09-08T04:38:10.894Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.7 | 2026-09-07T13:38:13.387Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T08:20:08.440Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-09-07T06:44:50.612Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T07:23:56.249Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T06:36:52.241Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-24T05:16:44.745Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-14T18:35:20.873Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.0 | 2026-08-10T18:57:57.956Z | user\n\nInitial publish\n\nArchive index:\n\nArchive v1.0.16: 5 files, 6415 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (3381b), skill-card.md (2291b), SKILL.md (4479b), _meta.json (135b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | 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 all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789640511984\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.16:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, returning normalized JSON for job search, job detail, freelancer profile lookup, rate checks, and freelancer vetting.\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\nExternal users, developers, and hiring teams use this skill to research public Upwork jobs and freelancer profiles, estimate market rates, and review freelancer history before outreach or hiring decisions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends Upwork search terms, job IDs, freelancer IDs, and the Crawlora API key to Crawlora.\n\nMitigation: Use it only for intended public Upwork research, keep CRAWLORA_API_KEY in the environment, and avoid private Upwork pages or account data.\n\nRisk: Undocumented API routes or methods could broaden what the helper sends.\n\nMitigation: The included helper is limited to documented GET routes for Upwork search, job detail, and freelancer profile lookup.\n\nRisk: API keys can leak through command history or process listings if passed as arguments.\n\nMitigation: The helper reads CRAWLORA_API_KEY from the environment and supplies it to curl through a private temporary config file.\n\n## Reference(s):\n\n- [Upwork endpoint reference](reference/endpoints.md)\n- [Crawlora website](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Uses GET requests to documented Crawlora Upwork endpoints and prints raw JSON suitable for jq.]\n\n## Skill Version(s):\n\n1.0.16 (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.15: 5 files, 6913 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (4301b), skill-card.md (2358b), SKILL.md (4479b), _meta.json (135b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | 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 all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1789352348939\n}\n\nFile v1.0.15:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.15:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles through the Crawlora API, returning normalized JSON for job searches, job details, and freelancer profile lookups.\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\nExternal users and developers use this skill to research public Upwork jobs, inspect full job postings, compare market rates, and review freelancer profiles before hiring or outreach.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Upwork search terms, job or freelancer identifiers, and the Crawlora API key are sent to Crawlora.\n\nMitigation: Install only when that data sharing is acceptable, keep the key in CRAWLORA_API_KEY, and do not hardcode, commit, or place the key in query parameters.\n\nRisk: The helper supports POST request bodies even though the documented Upwork endpoints are GET-only.\n\nMitigation: Use the documented GET calls for /upwork/search, /upwork/job/{id}, and /upwork/freelancer/{id}; avoid placing private data in request bodies.\n\nRisk: Returned public profile or job data may be incomplete, outdated, or insufficient for hiring decisions.\n\nMitigation: Use the data as research input and verify critical hiring or contracting decisions against current source pages and applicable Upwork terms.\n\n## Reference(s):\n\n- [Endpoint Reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API Base](https://api.crawlora.net/api/v1)\n- [ClawHub Skill Page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, 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:** [Requires CRAWLORA_API_KEY; responses contain normalized public Upwork job and freelancer data returned by Crawlora.]\n\n## Skill Version(s):\n\n1.0.15 (source: server release metadata)\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.14: 5 files, 6655 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (3783b), skill-card.md (2354b), SKILL.md (4479b), _meta.json (135b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | 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 all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1789043857544\n}\n\nFile v1.0.14:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.14:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, returning normalized JSON for job search, job detail, freelancer profile, market-rate research, and freelancer vetting workflows.\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, recruiters, and business users use this skill to search public Upwork job listings, inspect job details, and research freelancer profiles through Crawlora before market-rate analysis, hiring outreach, or freelancer vetting.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Upwork search terms, public job or freelancer IDs, and the Crawlora API key are sent to Crawlora.\n\nMitigation: Install only if that disclosure is acceptable, keep the key in the environment, and review Crawlora and Upwork terms for the intended use.\n\nRisk: The API key could be exposed if it is hardcoded, committed, or passed through unsafe command arguments.\n\nMitigation: Use CRAWLORA_API_KEY as instructed; the helper keeps the key out of normal command arguments and validates the key format before use.\n\nRisk: Public Upwork data can change and may be incomplete for high-stakes hiring or pricing decisions.\n\nMitigation: Treat returned JSON as research input and verify important decisions against current public Upwork postings or profiles.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Guidance]\n\n**Output Format:** [JSON responses with optional Markdown explanations and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and uses the documented Upwork endpoints exposed by Crawlora.]\n\n## Skill Version(s):\n\n1.0.14 (source: release metadata)\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.13: 5 files, 6555 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (3526b), skill-card.md (2375b), SKILL.md (4479b), _meta.json (135b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | 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 all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1789042703603\n}\n\nFile v1.0.13:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.13:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, including job search, job detail lookup, and freelancer profile lookup, 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, recruiters, and hiring teams use this skill to search public Upwork jobs, inspect individual job postings, estimate market rates from job budgets, and review public freelancer profile details before outreach.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Requests and the Crawlora API key are sent to Crawlora when the helper calls the API.\n\nMitigation: Use an environment-scoped CRAWLORA_API_KEY, avoid hardcoding or committing it, and understand Crawlora's handling of API requests before installation.\n\nRisk: The helper supports POST even though the documented Upwork endpoints are GET endpoints.\n\nMitigation: Prefer the documented GET commands for /upwork/search, /upwork/job/{id}, and /upwork/freelancer/{id}; remove or ignore POST support unless Crawlora documents a matching Upwork use case.\n\nRisk: The skill returns public Upwork data through a third-party API, so terms and data-use expectations may apply.\n\nMitigation: Use the returned public job and freelancer information in accordance with Upwork's terms and any applicable internal hiring or data-handling policies.\n\n## Reference(s):\n\n- [upwork-research endpoint reference](reference/endpoints.md)\n- [Crawlora service](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands that return JSON from the Crawlora API]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; API responses contain public Upwork job and freelancer data returned as JSON.]\n\n## Skill Version(s):\n\n1.0.13 (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.12: 5 files, 6238 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (3201b), skill-card.md (1922b), SKILL.md (4515b), _meta.json (135b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1789042121242\n}\n\nFile v1.0.12:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.12:skill-card.md\n\n## Description:\n\nResearches public Upwork job postings and freelancer profiles through the Crawlora API, returning normalized JSON for job search, job-detail lookup, freelancer review, and market-rate research.\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, recruiters, and business users use this skill to search public Upwork jobs, inspect specific job postings, research freelancer profiles, and compare visible market-rate signals.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Upwork search terms, job or freelancer IDs, and the Crawlora API key are sent to Crawlora.\n\nMitigation: Use the skill only when that data sharing is acceptable, keep the API key in CRAWLORA_API_KEY, and do not hardcode or commit the key.\n\nRisk: Undocumented POST behavior is not established by the release evidence.\n\nMitigation: Prefer the documented GET routes unless the publisher documents POST behavior for this skill.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [API Calls, Shell commands, JSON, Guidance]\n\n**Output Format:** [JSON responses with Markdown guidance and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; helper routes are limited to the documented Upwork endpoints.]\n\n## Skill Version(s):\n\n1.0.12 (source: server release metadata)\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.11: 5 files, 6271 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (2901b), skill-card.md (2311b), SKILL.md (4515b), _meta.json (135b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1789041393910\n}\n\nFile v1.0.11:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.11:skill-card.md\n\n## Description:\n\nResearches public Upwork job postings and freelancer profiles through the Crawlora API, returning normalized JSON for job searches, job details, and freelancer due diligence.\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\nExternal users, developers, and hiring teams use this skill to research public Upwork job listings, inspect specific postings, compare budgets, and review freelancer profile signals before outreach.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Queries and requested Upwork identifiers are sent to Crawlora as a third-party service.\n\nMitigation: Use the skill only for public Upwork research and avoid submitting private or sensitive search terms unless they are intended to be shared with Crawlora.\n\nRisk: The Crawlora API key could be exposed if hardcoded, committed, or passed in a URL.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment and do not place it in source files, query parameters, or logs.\n\nRisk: The skill works with public Upwork postings and profiles, so results may be incomplete for content behind login walls or restricted by platform terms.\n\nMitigation: Treat results as public-data research signals and review Upwork's terms before using the output in a hiring workflow.\n\n## Reference(s):\n\n- [Upwork endpoint reference](reference/endpoints.md)\n- [Crawlora service](https://crawlora.net)\n- [ClawHub skill listing](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples; helper commands return JSON from the Crawlora API.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY in the environment and uses Crawlora to access public Upwork data.]\n\n## Skill Version(s):\n\n1.0.11 (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.10: 5 files, 6126 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (2853b), skill-card.md (2077b), SKILL.md (4515b), _meta.json (135b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1789040677317\n}\n\nFile v1.0.10:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.10:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API by searching public job listings, retrieving full job posting details, or looking up freelancer profiles, 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, sourcing teams, and agents use this skill to research public Upwork job postings, inspect individual job details, evaluate freelancer profiles, and gather market-rate evidence from normalized Crawlora API responses.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The Crawlora API key may be exposed to automated agents that can invoke the helper.\n\nMitigation: Provide the key only in the CRAWLORA_API_KEY environment variable, avoid committing it, and review agent access before installation.\n\nRisk: Authenticated helper use can exceed the documented read-only Upwork search, job, and freelancer workflow.\n\nMitigation: Restrict use to documented GET endpoints and review any arbitrary helper arguments before allowing automated execution.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration, text, code]\n\n**Output Format:** [Markdown guidance with shell commands that return JSON from the Crawlora API]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and uses public Upwork job and freelancer data exposed through documented Crawlora endpoints.]\n\n## Skill Version(s):\n\n1.0.10 (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.9: 5 files, 5767 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (2005b), skill-card.md (2006b), SKILL.md (4489b), _meta.json (134b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- `export CRAWLORA_API_KEY=sk_your_key_here`\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1789024624653\n}\n\nFile v1.0.9:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.9:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, returning normalized JSON for job search, job detail, and freelancer profile requests.\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, recruiters, hiring teams, and agents use this skill to search public Upwork job listings, inspect specific job postings, estimate market rates from budgets, and review public freelancer profile signals before outreach or hiring decisions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The bundled Crawlora helper can send the user's API key to non-Upwork Crawlora API paths or methods if invoked outside the advertised workflow, which may consume credits or call unrelated services.\n\nMitigation: Use the helper only with the documented /upwork/search, /upwork/job/{id}, and /upwork/freelancer/{id} endpoints; review generated commands before execution and monitor Crawlora API key usage.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora website](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, API calls, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands that return normalized JSON]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; Crawlora requests may consume account credits on successful responses.]\n\n## Skill Version(s):\n\n1.0.9 (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.8: 5 files, 5692 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (1870b), skill-card.md (2086b), SKILL.md (4489b), _meta.json (134b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- `export CRAWLORA_API_KEY=sk_your_key_here`\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all Upwork endpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1788842290894\n}\n\nFile v1.0.8:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.8:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, including public job search, job-detail lookup, freelancer-profile lookup, and clean JSON results.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[tonywangcn](https://clawhub.ai/user/tonywangcn)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and hiring teams use this skill to search public Upwork job listings, inspect a specific job posting, research freelancer profiles, estimate market rates, and support freelancer due diligence.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The helper script can send the Crawlora API key to an environment-overridden API base.\n\nMitigation: Run it only with a trusted CRAWLORA_API_BASE value or leave CRAWLORA_API_BASE unset so the default Crawlora API endpoint is used.\n\nRisk: Search terms and request arguments may expose sensitive research intent to the API provider.\n\nMitigation: Use non-sensitive Upwork research terms and keep the Crawlora API key scoped and revocable.\n\nRisk: Untrusted command arguments could change the API path or request body sent by the helper script.\n\nMitigation: Avoid running the helper in environments where command arguments can be influenced by untrusted input.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; returns normalized JSON for public Upwork job and freelancer data.]\n\n## Skill Version(s):\n\n1.0.8 (source: 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.7: 5 files, 5757 bytes\n\nFiles: reference/endpoints.md (2287b), scripts/crawlora.sh (1796b), skill-card.md (2269b), SKILL.md (4491b), _meta.json (134b)\n\nFile v1.0.7:SKILL.md\n\n---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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- `export CRAWLORA_API_KEY=sk_your_key_here`\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/upwork/search?q=react%20developer\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for all 3 Upwork\nendpoints this skill uses.\n\n## Examples\n\n- **Freelance rate-check:** `/upwork/search` for a skill (e.g. `q=\"react developer\"`),\n  collect the `budget` field across results to estimate a market rate for\n  that skill.\n- **Freelancer due diligence:** `/upwork/search` or a known id to find a\n  candidate, then `/upwork/freelancer/{id}` to check their Job Success\n  Score, hourly rate, hours worked, and recent client feedback before\n  reaching out.\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/profiles; respect Upwork's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Job and freelancer ids come from search results** — grab the `id` field\n  from `/upwork/search` output rather than guessing one.\n- Data is sourced from Upwork's own server-rendered pages via a real\n  browser-rendering backend, so fields reflect exactly what's publicly\n  visible on the page (no data behind Upwork's login wall).\n- `/upwork/search` is paginated — pass `page` to walk past the first page\n  of results.\n\nFile v1.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1788788293387\n}\n\nFile v1.0.7:reference/endpoints.md\n\n# upwork-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**3 endpoints across 1 platform group(s).**\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\nFile v1.0.7:skill-card.md\n\n## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, returning normalized JSON for job searches, job detail lookup, and freelancer profile research.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[tonywangcn](https://clawhub.ai/user/tonywangcn)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, recruiters, and hiring teams use this skill to search public Upwork job postings, inspect a specific posting, research freelancer profiles, estimate market rates, and support freelancer due diligence.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The helper script can send the Crawlora API key to an API base URL overridden through CRAWLORA_API_BASE.\n\nMitigation: Run it only in a trusted shell or CI environment, unset untrusted CRAWLORA_API_BASE values, and use the default Crawlora API base unless you intentionally reviewed the override.\n\nRisk: Queries and request bodies may contain secrets, private client data, or sensitive hiring context.\n\nMitigation: Keep inputs limited to public Upwork research terms or public identifiers, and avoid sending secrets or private client data to the API.\n\nRisk: The bundled API script is broader than the advertised Upwork workflow.\n\nMitigation: Review script behavior before installation and restrict use to the documented Upwork endpoints when deploying this skill.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub release page](https://clawhub.ai/tonywangcn/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, 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 a Crawlora API key in CRAWLORA_API_KEY; the helper script reads CRAWLORA_API_BASE when present.]\n\n## Skill Version(s):\n\n1.0.7 (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.","readmeExcerpt":"Skill: upwork-research Owner: crawlora-org Summary: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research ","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'"},{"language":"sh","snippet":"# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'"},{"language":"sh","snippet":"# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'"},{"language":"sh","snippet":"# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'"},{"language":"sh","snippet":"# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'"},{"language":"sh","snippet":"curl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: upwork-research\ndescription: Researches Upwork job postings and freelancer profiles via the Crawlora API — search Upwork's public job listings by keyword, pull full detail on a specific job posting, or look up a freelancer's profile (rate, Job Success Score, ratings, feedback) — returning clean JSON. Use when the user wants to search Upwork jobs, read a specific Upwork job posting, or research an Upwork freelancer.\n---\n\n# Upwork research\n\nSearch Upwork job postings and pull freelancer profiles — all as\nnormalized JSON from the Crawlora API, no scraping Upwork's pages by hand.\n\n## When to use this skill\n\n- \"Search Upwork for <skill/role> jobs.\" — free-text keyword search over\n  public job listings.\n- \"Show me this Upwork job posting.\" — full detail (budget, description,\n  client history) for one posting by id.\n- \"Look up this Upwork freelancer.\" — profile, hourly rate, Job Success\n  Score, ratings, and recent client feedback by freelancer id.\n- \"What's the going rate for <skill> on Upwork?\" — collect budgets across\n  search results to estimate a market rate.\n- \"Vet this freelancer before hiring.\" — pull their profile and feedback\n  history in one call.\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. **Search** — `/upwork/search` takes a free-text keyword (`q`) and returns\n   normalized job summaries (title, budget, experience level, duration,\n   posted date, description snippet, skill tags), paginated via `page`.\n2. **Job detail** — take an `id` from a search result and call\n   `/upwork/job/{id}` for the full posting: description, employment type,\n   budget (hourly range or fixed amount), location/remote type, experience\n   level, duration, project type, proposal count, allowed applicant\n   countries, and a summary of the posting client (member since, location,\n   spend, hires, hours, industry, company size).\n3. **Freelancer profile** — `/upwork/freelancer/{id}` returns a normalized\n   profile: name, title, verification badge, overview, hourly rate, rating\n   and review count, Job Success Score, location and local time, total\n   jobs/hours worked, and recent client feedback (title, comment, date,\n   client name, rating).\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search jobs by keyword:\nscripts/crawlora.sh /upwork/search q=\"react developer\" | jq '.'\n\n# Job detail (id from a search result):\nscripts/crawlora.sh /upwork/job/<job_id> | jq '.'\n\n# Freelancer profile (id from a search result or a known profile):\nscripts/crawlora.sh /upwork/freelancer/<freelancer_id> | jq '.'\n```\n\nUse `scr"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"upwork-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789640511984\n}"},{"path":"reference/endpoints.md","content":"# upwork-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**3 endpoints across 1 platform group(s).**\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"},{"path":"skill-card.md","content":"## Description:\n\nResearches Upwork job postings and freelancer profiles via the Crawlora API, returning normalized JSON for job search, job detail, freelancer profile lookup, rate checks, and freelancer vetting.\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\nExternal users, developers, and hiring teams use this skill to research public Upwork jobs and freelancer profiles, estimate market rates, and review freelancer history before outreach or hiring decisions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends Upwork search terms, job IDs, freelancer IDs, and the Crawlora API key to Crawlora.\n\nMitigation: Use it only for intended public Upwork research, keep CRAWLORA_API_KEY in the environment, and avoid private Upwork pages or account data.\n\nRisk: Undocumented API routes or methods could broaden what the helper sends.\n\nMitigation: The included helper is limited to documented GET routes for Upwork search, job detail, and freelancer profile lookup.\n\nRisk: API keys can leak through command history or process listings if passed as arguments.\n\nMitigation: The helper reads CRAWLORA_API_KEY from the environment and supplies it to curl through a private temporary config file.\n\n## Reference(s):\n\n- [Upwork endpoint reference](reference/endpoints.md)\n- [Crawlora website](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/upwork-research)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Uses GET requests to documented Crawlora Upwork endpoints and prints raw JSON suitable for jq.]\n\n## Skill Version(s):\n\n1.0.16 (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":1478,"uniquenessScore":39,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T02:38:07.231Z","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-12T02:38:07.231Z","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-14T04:34:54.476Z","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"}]}}}