← Dashboard

API Reference

Query recent Upwork job listings with AI quality scores built in. Every result includes scores — no extra calls required.

Authentication

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.

Endpoint

GEThttps://kttkatrmvlzsepgprqqd.supabase.co/functions/v1/public-jobs

Returns 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
}

Parameters

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 Law
jobTypefixed | 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.

AI Score Fields

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.

Limits

FreePaid
Results per day100Unlimited
Max per request100100
Quota resetMidnight UTC
API keysMultipleMultiple

The daily quota is per account, not per key — creating additional API keys does not increase your limit.

Webhooks

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();
}
Questions? Email mike@vibeworker.com