Query recent Upwork job listings with AI quality scores built in. Every result includes scores — no extra calls required.
Pass your API key as a Bearer token on every request. Generate keys in Settings → Developer.
Authorization: Bearer vw_your_api_key_here
Responses are always { data: [...], count: N } on success, or { error: '...' } with an appropriate HTTP status on failure. Free accounts also include quotaRemaining in each response.
https://kttkatrmvlzsepgprqqd.supabase.co/functions/v1/public-jobsReturns recent Upwork job listings matching your filters. Jobs are continuously ingested and scored as they are posted — results are typically available within seconds of going live on Upwork.
Example request
curl https://kttkatrmvlzsepgprqqd.supabase.co/functions/v1/public-jobs \ -H "Authorization: Bearer vw_your_key" \ -G \ -d keywords=react \ -d jobType=fixed \ -d minQuickWin=7 \ -d sort=quick_win \ -d limit=20
Example response
{
"data": [
{
"id": "vw_b797267068b246bfa8da8722",
"title": "Build a Next.js dashboard with Supabase backend",
"category": "Web Development",
"jobType": "fixed",
"budget": 800,
"budgetMax": null,
"experienceLevel": "Intermediate",
"duration": "Less than 1 month",
"connects": 11,
"hoursPerWeek": null,
"skills": ["Next.js", "TypeScript", "Supabase", "Tailwind CSS"],
"clientLocation": "United States",
"clientPaymentVerified": true,
"clientTotalSpent": 42000,
"clientHireRate": 78,
"clientRating": 4.9,
"clientAvgRate": null,
"description": "Build a clean admin dashboard...",
"upworkUrl": "https://www.upwork.com/jobs/~01abc...",
"scores": {
"quickWin": 8,
"scopeClarity": 9,
"redFlags": 10,
"effortHours": 14
},
"postedAt": "2026-06-08T09:31:00+00:00",
"receivedAt": "2026-06-08T09:32:14.000+00:00"
}
],
"count": 1,
"quotaRemaining": 95
}keywordsstringFilter by job title keyword (e.g. react, shopify). Case-insensitive partial match.categorystringFilter by category. Must match exactly. Supported values: Web Development, Mobile Development, Ecommerce Development, AI & Machine Learning, Data Analysis & Testing, Scripts & Utilities, DevOps & Solution Architecture, QA Testing, Game Design & Development, ERP/CRM Software, Blockchain, NFT & Cryptocurrency, Web & Mobile Design, Graphic, Editorial & Presentation Design, Branding & Logo Design, Product Design, Art & Illustration, Video & Animation, 3D Modeling & CAD, Photography, Digital Marketing, Marketing, PR & Brand Strategy, Lead Generation & Telemarketing, Social Media Management, Market Research & Product Reviews, Content Writing, Editing & Proofreading Services, Translation & Localization Services, Virtual Assistance, Customer Service & Tech Support, Data Entry & Transcription Services, Project Management, Recruiting & Human Resources, Accounting & Bookkeeping, Corporate & Contract LawjobTypefixed | hourlyFilter by contract type.experienceLevelEntry Level | Intermediate | ExpertFilter by the client's requested experience level.minBudgetnumberMinimum budget in USD. Applies to fixed-price jobs.minQuickWininteger 1–10Only return jobs at or above this Quick Win score. Set to 7 to filter for high-quality quick wins only.sortnewest | quick_win | budgetSort order. Default: newest.limitinteger 1–100Number of results to return. Default: 50. Counts against your daily quota on free accounts.Every job is scored by an LLM within seconds of being posted. The scores object is included on every result.
scores.quickWin1–10Fixed price + clear bounded scope + completable in one session. Higher = faster money with less negotiation risk.scores.scopeClarity1–10How precisely the deliverable is defined. Low scores indicate vague requirements and scope creep risk.scores.redFlags1–10Absence of bad signals. 10 = clean client with no red flags. Low scores mean proceed with caution.scores.effortHourshoursRealistic estimated hours to complete the job.| Free | Paid | |
|---|---|---|
| Results per day | 100 | Unlimited |
| Max per request | 100 | 100 |
| Quota reset | Midnight UTC | — |
| API keys | Multiple | Multiple |
The daily quota is per account, not per key — creating additional API keys does not increase your limit.
Rather than polling the API, webhooks push a job payload to your endpoint the moment a matching job is ingested — typically within seconds of it posting on Upwork. Available on paid plans. Configure webhooks in Settings → Developer.
Payload shape
{
"event": "job.matched",
"job": {
"id": "vw_b797267068b246bfa8da8722",
"title": "Build a Next.js dashboard",
"category": "Web Development",
"jobType": "fixed",
"budget": 800,
"skills": ["Next.js", "TypeScript"],
"upworkUrl": "https://www.upwork.com/jobs/~01abc...",
"scores": { "quickWin": 8, "scopeClarity": 9, "redFlags": 10, "effortHours": 14 },
"receivedAt": "2026-06-08T09:32:14.000+00:00"
}
}Signature verification
Every request is signed with HMAC-SHA256 using your webhook secret. Verify the X-Vibeworker-Signature header before processing.
// Node.js
const sig = createHmac('sha256', webhookSecret)
.update(rawBody)
.digest('hex');
if (sig !== req.headers['x-vibeworker-signature'].replace('sha256=', '')) {
return res.status(401).end();
}