# Upwork Job Extractor ⚡ (`flash_mage/upwork`) Actor

upwork job extractor ⚡| 0.001 | fast, cheap, cost-effective, reliable, up-to-date, and highly stable data scraping service, optimized for long-term use with the fastest crawling speeds, low container usage, and  pricing to boost your upwork job scraper performance!

- **URL**: https://apify.com/flash_mage/upwork.md
- **Developed by:** [Flash Mage](https://apify.com/flash_mage) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 1,490 total users, 95 monthly users, 99.5% runs succeeded, 40 bookmarks
- **User rating**: 4.87 out of 5 stars

## Pricing

from $2.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Upwork Job Scraper

This Apify Actor automates Upwork job scraping, extracting titles, skills, budgets, and client details. Configurable for categories and locations, it handles pagination and anti-detection. Outputs structured JSON/CSV data for analysis. Perfect for freelancers—ethical, scalable, and integrates seamlessly with Apify's proxy rotation.

### ⚡ mageactors.com

⚡ MageActors is the console for running this Upwork Actor. Save an Apify token first 🔑, keep each search as its own query, and start one run ▶️, a schedule ⏰, or a timed refresh 🔄 from the header. History 📂, Tracker 🎯, and scheduled update stay on that query. Open the full console guide 📖 at [mageactors.com/docs](https://mageactors.com/docs).

### Features

Search each keyword separately, then re-sort the results by time or relevance:

- Default(recency) or Newest: sort by creation time (descending).
- Relevance sort: keep the exact order returned by Upwork for that keyword.
- Related_sort_id = the job’s original rank under that keyword.

(One keyword → one independent list → merge all lists → apply the chosen sort.)

### Caution

1. Recommended (~3 min to finish): ≤500 / 256MB · ≤1500 / 512MB · ≤3000 / 1024MB. Maximum: ≤1000 / 256MB · ≤3000 / 512MB · ≤5000 / 1024MB.
2. Each search task: max 5000 rows, min 5 rows. With authentication, max 500.
3. Each update task: max 5000 rows, min 1 row. With authentication, max 500.
4. Proxy fees are self-paid; service is free to use.
5. If the input or run options need a change, the run still finishes as **Succeeded**. Read the run **status message**. The Key-value store record **OUTPUT** also has `message` (and `type: user-config-error`). When **Results are empty** and the run is Succeeded, that is usually a config issue, not a successful scrape. If **Results has rows** but the Standard view is missing flattened fields and Status Save shows a Warning, the scrape succeeded — use the Overview view. See **Check run Status**.

### Check run Status

Open the run **Output** tab, then pick **Status** from the dropdown. The page lists the steps this run actually takes.

![How to open the Status report](https://i.ibb.co/PGkLkVGy/1787390481878.png)

- ✅ **Passed** — that step finished.
- ⚠️ **Needs change** — the input or Run options need a fix. Open the step for **Why this happened** and **What to do**. Results is empty.
- ⚠️ **Warning** — Results were saved, but flattened Standard fields could not be added. Use the Overview view. This is not a config error.
- ⏭️ **Skipped** — an earlier step blocked the run, or this mode does not use that step.

Empty **Results** with **Succeeded** is usually a config issue. Read Status first; do not treat it as a successful scrape. If Results has rows but the Standard view is empty and Save shows Warning, the scrape succeeded.

### Input notes (Budget)

- `hourly` / `fixed` default to on. A selected type uses its price filters. Both on = both types with filters. Both off = both types and ignore `hourly_*` / `fixed_*` prices.
- Hourly/fixed min and max can be filled independently (open-ended range, e.g. min only `10-`). If min is greater than max, they are swapped automatically and noted in the run status.

### Input notes (Authentication)

- When **Use Authentication** is on (only when necessary, or all requests), each run is limited to **500** jobs: search `limit` and update `update_job_ids`. Go over 500 and the run still **Succeeds**, but nothing is scraped — read Status / **OUTPUT**. Split into multiple tasks.
- No authentication: search still max 5000 (min 5), update still max 5000 (min 1).

### Output Samples

Each successful run writes **one** dataset. The **default** items are the nested envelope below (`overview` / `simplify` / `detail`) plus flattened Standard columns on the same row. **Standard** is a view of those same items (flattened columns for sheets and n8n), not a second dataset. Existing flows that read `data.opening` do not need to change.

Open the run **Output** tab, pick **Results**, then switch the view selector to **Overview** or **Standard**. Overview shows the envelope and nested `data`. If Status shows a **Warning** on Save, Results still contain the nested jobs; flattened Standard fields may be missing — use Overview.

#### overview data

```json
{
    "id": 1,
    "upwork_job_id": "1970117721739611767",
    "type": "detail",
    "type_description": "return public detail job info",
    "title": "Google Ads and Meta Ads Specialist Needed",
    "link": "https://www.upwork.com/jobs/~021970117721739611767",
    "related_search": "react",
    "related_sort": "recency",
    "related_sort_id": 1,
    "data": {}
}
```

#### standard data

The **Standard** view reads these columns from the same row — no unwind needed. Raw JSON without a view still has the envelope plus those flattened fields.

One row per job, already flattened for sheets. `id` is the row number in this run; `upwork_job_id` is the real Upwork job id. `type` is the same as in Results (`detail`, `private`, `authed`, and sometimes `not found` or `req_error`). The note next to it (`type_description`) is a short explanation — including why a fetch failed.

`job_status` is a hiring snapshot, such as `Active · 0/1 hired`. A job can still be Active after it has filled the seats. If Upwork did not send a hire count, that value stays empty (`null`) — it is not shown as 0. Private jobs say `Login required`. If the job could not be loaded, `job_status` is empty; use `type` and `type_description` to see why.

`budget` is a number for a fixed-price job with full details (e.g. `5500`), a quoted number for a list-only fixed-price card (e.g. `"300.0"`), or a range for hourly work (`15-40`, or `8-` / `-25` when only one side is known).

List-only / private rows do not include client details (nation, activity, qualifications, buyer, and similar). Description and skills are filled when the list card has them, and empty when it does not. Search keyword and rank (`related_search`, `related_sort_id`) appear on search runs only.

If something is missing, it is `null` — not an empty list or empty object.

```json
{
    "id": 0,
    "related_search": "react",
    "related_sort_id": 1,
    "nation": "India",
    "job_title": "TikTok Handle Management Agency",
    "budget_type": "FIXED",
    "budget": 5500,
    "job_status": "Active · 0/1 hired",
    "job_detail": "We are seeking a professional agency to manage our TikTok handle and assist in monetizing our content.",
    "link": "https://www.upwork.com/jobs/~022091770178047514259",
    "publish_time": "2026-08-24T06:11:37.834Z",
    "type": "detail",
    "type_description": "return public detail job info",
    "last_viewed": "0 minutes ago",
    "client_activity": {
        "totalInvitedToInterview": 0,
        "numberOfPositionsToHire": 1,
        "totalHired": 0,
        "totalApplicants": 0,
        "invitationsSent": 0,
        "unansweredInvites": 0
    },
    "upwork_job_id": "2091770178047514259",
    "qualifications": {
        "prefEnglishSkill": "ANY",
        "minJobSuccessScore": 0,
        "type": "ANY"
    },
    "ontologySkills": null,
    "additionalSkills": [
                    {
                        "id": "1031626756011311104",
                        "prefLabel": "Management Skills"
                    }
    ],
    "last_viewed_at": "2026-08-24T06:11:37.834Z",
    "buyer": {
        "location": {
            "country": "India",
            "city": null
        }
    },
    "isPaymentMethodVerified": false
}
```

#### simplify data

```json
{
    "description": "Digital Marketing Specialist – Google & Meta Ads...",
    "id": "1970117721739611767",
    "jobTile": {
        "job": {
            "ciphertext": "~021970117721739611767",
            "contractorTier": "IntermediateLevel",
            "createTime": "2025-09-22T13:27:22.747Z",
            "fixedPriceAmount": null,
            "fixedPriceEngagementDuration": null,
            "hourlyBudgetMax": null,
            "hourlyBudgetMin": null,
            "hourlyEngagementDuration": {
                "ctime": "2014-06-04T17:59:10.123Z",
                "label": "Less than 1 month",
                "mtime": "2014-06-04T17:59:10.123Z",
                "rid": 4,
                "weeks": 3
            },
            "hourlyEngagementType": "PART_TIME",
            "id": "1970117721739611767",
            "jobType": "HOURLY",
            "publishTime": "2025-09-22T13:27:23.222Z",
            "sourcingTimestamp": null,
            "weeklyRetainerBudget": null
        }
    },
    "ontologySkills": [
        {
            "freeText": null,
            "highlighted": false,
            "parentSkillUid": null,
            "prefLabel": "Search Engine Optimization",
            "prettyName": "Search Engine Optimization",
            "uid": "1031626778853490688"
        },
        {
            "freeText": null,
            "highlighted": false,
            "parentSkillUid": null,
            "prefLabel": "Social Media Marketing",
            "prettyName": "Social Media Marketing",
            "uid": "1031626781114220544"
        }
    ],
    "relevanceEncoded": "{\"position\":\"2\"}",
    "title": "Google Ads and Meta Ads Specialist Needed"
}
```

#### detail data

```json
{
  "opening": {
    "status": "ACTIVE",
    "postedOn": "2025-09-18T00:06:29.863Z",
    "publishTime": "2025-09-18T00:06:30.471Z",
    "sourcingTime": null,
    "startDate": null,
    "deliveryDate": null,
    "workload": null,
    "contractorTier": "EXPERT",
    "description": "We’re launching a front-end funnel teaching real estate investors about digital land with EarthMeta.AI. Digital land is an AR overlay on real-world cities, and our branding blends futuristic digital aesthetics with real estate investment credibility.\nWe need a creative, reliable freelancer to design a suite of assets for our offer. These assets will be used in a paid training funnel, so quality and consistency are key.\nDeliverables:\n1. Slides for Training Video (Digital Deed™ Quickstart)\n~20–25 slides designed in Canva, PowerPoint, or Keynote.\nBranded in royal gold, digital indigo, and deep obsidian.\nVisuals should mix city skylines + AR overlays + clean investor-friendly layouts.\nMinimal text per slide, strong visuals (we’ll provide outline + script).\n2. The Digital Land Map (1-page PDF Visual Guide)\nDesigned as a simple but striking one-pager.\nShows a world map with glowing AR pins highlighting cities (Accra, Cancun, Puerto Vallarta, etc.).\nExported as high-quality PDF.\n3. The “First Property” Checklist (PDF)\nChecklist-style design with branded icons (wallet, deed, skyline).\nClean, easy to print or use digitally.\n1–2 pages.\n4. 5 Investor Mistakes Report (PDF)\nShort PDF (4–6 pages).\nProfessional report style, with AR/digital grid aesthetics.\nIncludes cover page + inside layout.\n5. Wallet Setup Video Walkthrough\nWe’ll provide the outline/script.\nYou create slides + step screenshots to guide the walkthrough.\nDeliver final as slides or annotated screenshots — we’ll record voiceover.\n\n6. Upsell: Digital Land Investor’s Playbook (Top 10 Cities Report)\nPDF report (8–12 pages).\nDesigned like a premium investment report.\nCover + interior pages featuring visuals of cities with AR overlays.\nInclude space for data, commentary, and investor insights.\n\nRequirements:\nStrong portfolio in slide design, PDFs, and digital products.\nAbility to design futuristic yet professional investor-friendly aesthetics.\nProficiency in Canva, PowerPoint, or Adobe Suite.\nMust deliver editable files + final exports (PDF, PNG, PPTX/Canva link).\nStrong communication and ability to follow a creative brief.\nNice to Have\nExperience designing for online courses, funnels, or info products.\nUnderstanding of real estate, Web3, AR/VR, or digital economy themes.\nAbility to suggest visuals/icons that bring the “digital land” concept to life.\nDeliverables & Timeline\nTotal assets: ~6 (slides + 5 PDF products).\nTimeline: 2–3 weeks from start.\nDelivery: rolling (slides first, then PDFs).",
    "info": {
      "ciphertext": "~021968466621816122358",
      "id": "1968466621816122358",
      "type": "FIXED",
      "access": "PUBLIC_INDEX",
      "title": "Graphics Designer Needed for Slides + PDF Assets (Digital Land Training Funnels)",
      "hideBudget": false,
      "createdOn": "2025-09-18T00:06:29.863Z",
      "notSureProjectDuration": false,
      "notSureFreelancersToHire": false,
      "notSureExperienceLevel": false,
      "notSureLocationPreference": false,
      "premium": false
    },
    "segmentationData": [
      {
        "customValue": null,
        "label": "Ongoing project",
        "name": "Employment",
        "sortOrder": 1,
        "type": "EMPLOYMENT",
        "value": "EMPLOYMENT_POSITION",
        "skill": null
      }
    ],
    "sandsData": {
      "occupation": {
        "freeText": null,
        "ontologyId": "upworkOccupation:graphicdesign",
        "prefLabel": "Graphic Design",
        "id": "1017484851352698959",
        "uid": "1017484851352698959"
      },
      "ontologySkills": [
        {
          "groupId": "1052162208764317701",
          "id": "1031626753276624896",
          "freeText": null,
          "prefLabel": "Landing Page",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        },
        {
          "groupId": "1052162208764317701",
          "id": "1110580505353900032",
          "freeText": null,
          "prefLabel": "Brand Identity & Guidelines",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        },
        {
          "groupId": "1052162208764317701",
          "id": "1031626747748532224",
          "freeText": null,
          "prefLabel": "Infographic",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        },
        {
          "groupId": "1052162208764317701",
          "id": "1052162208852398101",
          "freeText": null,
          "prefLabel": "Website Asset",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        },
        {
          "groupId": "1052162208764317701",
          "id": "1052162209007587332",
          "freeText": null,
          "prefLabel": "Brochure",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        },
        {
          "groupId": "1052162208764317701",
          "id": "1184567337059631104",
          "freeText": null,
          "prefLabel": "Sales & Marketing Collateral",
          "groupPrefLabel": "Graphic Design Deliverables",
          "relevance": "MANDATORY"
        }
      ],
      "additionalSkills": [
        {
          "groupId": null,
          "id": "1052162208852398098",
          "freeText": null,
          "prefLabel": "Adobe Photoshop",
          "relevance": "MANDATORY"
        },
        {
          "groupId": null,
          "id": "1031626742929276928",
          "freeText": null,
          "prefLabel": "Graphic Design",
          "relevance": "MANDATORY"
        },
        {
          "groupId": null,
          "id": "1031626770443911168",
          "freeText": null,
          "prefLabel": "Presentation Design",
          "relevance": "MANDATORY"
        },
        {
          "groupId": null,
          "id": "1031626747312324608",
          "freeText": null,
          "prefLabel": "Illustration",
          "relevance": "MANDATORY"
        }
      ]
    },
    "category": {
      "name": "Graphic, Editorial & Presentation Design",
      "urlSlug": "graphic-editorial-presentation-design"
    },
    "categoryGroup": {
      "name": "Design & Creative",
      "urlSlug": "design-creative"
    },
    "budget": {
      "amount": 800,
      "currencyCode": "USD"
    },
    "annotations": {
      "tags": [
        "contractToHireSet",
        "searchable",
        "C2HJobsOptInEducation"
      ]
    },
    "engagementDuration": {
      "label": "1 to 3 months",
      "weeks": 9
    },
    "extendedBudgetInfo": {
      "hourlyBudgetMin": null,
      "hourlyBudgetMax": null,
      "hourlyBudgetType": null
    },
    "clientActivity": {
      "lastBuyerActivity": "2025-09-18T00:26:30.472Z",
      "totalApplicants": 12,
      "totalHired": 0,
      "totalInvitedToInterview": 3,
      "unansweredInvites": 22,
      "invitationsSent": 26,
      "numberOfPositionsToHire": 1
    },
    "deliverables": null,
    "deadline": null,
    "tools": []
  },
  "qualifications": {
    "countries": null,
    "earnings": null,
    "groupRecno": null,
    "languages": null,
    "localDescription": null,
    "localFlexibilityDescription": null,
    "localMarket": true,
    "minJobSuccessScore": 0,
    "minOdeskHours": 0,
    "onSiteType": null,
    "prefEnglishSkill": "ANY",
    "regions": null,
    "risingTalent": false,
    "shouldHavePortfolio": false,
    "states": null,
    "tests": null,
    "timezones": null,
    "type": "ANY",
    "locationCheckRequired": false,
    "group": null,
    "location": null,
    "locations": null,
    "minHoursWeek": null
  },
  "buyer": {
    "location": {
      "offsetFromUtcMillis": -14400000,
      "countryTimezone": "America/New_York (UTC-04:00)",
      "city": "Manchester",
      "country": "USA"
    },
    "stats": {
      "totalAssignments": 2,
      "activeAssignmentsCount": 1,
      "hoursCount": 0,
      "feedbackCount": 1,
      "score": 5,
      "totalJobsWithHires": 2,
      "totalCharges": {
        "amount": 2340
      }
    },
    "company": {
      "isEDCReplicated": null,
      "contractDate": "2024-09-07T00:00:00.000Z",
      "profile": {
        "industry": null,
        "size": null
      }
    },
    "jobs": {
      "openCount": 1,
      "openJobs": [
        {
          "id": "1968466621816122358",
          "uid": "1968466621816122358",
          "isPtcPrivate": false,
          "ciphertext": "~021968466621816122358",
          "title": "Graphics Designer Needed for Slides + PDF Assets (Digital Land Training Funnels)",
          "type": "FIXED"
        }
      ]
    }
  },
  "similarJobs": [
    {
      "id": null,
      "ciphertext": "~021946027940986250961",
      "title": "Graphic Designer / Artist for Anime-Inspired Clothing Brand",
      "description": "Eminence is a fresh and dynamic anime-inspired clothing brand that aims to blend the world of anime with streetwear fashion. We focus on creating unique, eye-catching designs that resonate with anime enthusiasts and fashion-forward individuals. Our product line includes t-shirts, hoodies, and shorts at this time that features bold and vibrant anime graphics. As a startup, we are excited to build a talented team of artists who are passionate about anime and fashion.\n\nWe're looking for someone who will have a passion for anime, a strong understanding of current fashion trends, and the ability to create original, high-quality designs that appeal to our target audience.\n\nResponsibilities:\n- Develop and create complete original anime-inspired designs for our clothing line. Could be symbolism and not character related, but it will affect the type of drops done.\n- Collaborate with us to ensure designs align with brand aesthetics and meet production standards.\n- Revise and edit designs based on feedback \n- Prepare design files (psd) format\n- Stay up-to-date with the latest anime to ensure our designs remain relevant and appealing.\n- Work within project timelines to meet deadlines for product launches and marketing campaigns.\n\nRequirements (we're not asking for much):\n- Strong portfolio showcasing anime-inspired designs and/or fashion graphics.\n- Proficiency in Adobe Creative Suite (Photoshop, Illustrator).\n- Excellent understanding of color theory, typography, and layout design.\n- Ability to take constructive criticism and adapt designs accordingly.\n- Strong communication and collaboration skills.\n- Ability to work independently and manage multiple projects simultaneously.\n\nPreferred Qualifications:\n- Knowledge of current anime series and trends.\n\nHow to Apply:\nPlease include any relevant links to your work or social media profiles.\nPLEASE VIEW IMAGES PROVIDED TO GET AN IDEA OF DESIGNS\n---\n\nLeon",
      "engagement": null,
      "durationLabel": "1 to 3 months",
      "contractorTier": "ENTRY_LEVEL",
      "type": "FIXED",
      "createdOn": "2025-07-18T02:03:11+0000",
      "renewedOn": null,
      "amount": {
        "amount": 40
      },
      "maxAmount": null,
      "ontologySkills": [
        {
          "id": null,
          "prefLabel": "Illustration"
        },
        {
          "id": null,
          "prefLabel": "Adobe Illustrator"
        },
        {
          "id": null,
          "prefLabel": "Adobe Photoshop"
        },
        {
          "id": null,
          "prefLabel": "Graphic Design"
        },
        {
          "id": null,
          "prefLabel": "Drawing"
        }
      ],
      "hourlyBudgetMin": 0,
      "hourlyBudgetMax": 0
    },
    {
      "id": null,
      "ciphertext": "~021947509025892179221",
      "title": "Podcast Rebranding: Logo, Banner, and Cover Photo Design",
      "description": "I am looking for a talented designer to help rebrand my podcast. The project includes creating a new logo, designing a YouTube banner, a cover photo for Apple Podcasts, and a versatile template for each episode. The ideal candidate will have experience in branding and a strong portfolio showcasing similar work. Your creativity will play a crucial role in redefining my podcast's visual identity. If you have a passion for podcasting and design, I would love to see your previous work and discuss this project further.\n\nPartner Path (rebranding to In Prod) is a podcast that explores the venture capital and startup ecosystem through the lens of trailblazing founders and operators. We feature candid conversations with early-stage AI leaders, offering insight into everything from product execution and go-to-market lessons to scaling teams and navigating growth. Whether you’re an aspiring founder, operator, or just curious about startups, tune in for an inside look at building in today’s ecosystem. \n\nhttps://podcasts.apple.com/us/podcast/partner-path/id1678521678",
      "engagement": null,
      "durationLabel": "1 to 3 months",
      "contractorTier": "INTERMEDIATE",
      "type": "FIXED",
      "createdOn": "2025-07-22T04:08:29+0000",
      "renewedOn": null,
      "amount": {
        "amount": 300
      },
      "maxAmount": null,
      "ontologySkills": [
        {
          "id": null,
          "prefLabel": "Graphic Design"
        },
        {
          "id": null,
          "prefLabel": "Logo Design"
        },
        {
          "id": null,
          "prefLabel": "Adobe Photoshop"
        },
        {
          "id": null,
          "prefLabel": "Social Media Imagery"
        }
      ],
      "hourlyBudgetMin": 0,
      "hourlyBudgetMax": 0
    },
    {
      "id": null,
      "ciphertext": "~021949869110835932117",
      "title": "Wedding Invitation Video (via QR Code)",
      "description": "We’ve printed a QR code on our wedding invitation. When scanned, it should open a short, beautiful video (approx. 1–2 minutes) that invites the guest in a personal and cinematic way.\n\nVideo Structure:\n\nIntro: Earth Zoom-In Animation\n\nStart in space, slowly zoom toward Earth\n\nTransition to zooming into Europe → Croatia → [Villa Dalmacija, Šetalište Ivana Meštrovića 43, 21000, Split, Kroatien]\n\n(Can be stylized with Google Earth animation or smooth map zoom effect)\n\nLocation Scenery (10–15 sec)\n\nShort aerial or cinematic clips (drone-style, if possible) of the venue and surrounding landscape Video: https://www.youtube.com/watch?v=yLhzY13X7jU\n\nPeaceful, romantic music in the background\n\nPersonal Invitation (30–45 sec)\n\nCut to a video of us (the couple) speaking directly to our guests\n\nCasual and heartfelt message welcoming them and sharing our excitement\n\nTone/Style:\n\nWarm, cinematic, heartfelt\n\nLight music in the background\n\nTransitions should feel smooth and magical\n\nDeliverables:\n\nFinal video (mp4) suitable for web/mobile viewing via QR code\n\nOptional: vertical version (for mobile) if possible\n\nPlease let me know if anything else is needed!",
      "engagement": "Less than 30 hrs/week",
      "durationLabel": "Less than 1 month",
      "contractorTier": "INTERMEDIATE",
      "type": "HOURLY",
      "createdOn": "2025-07-28T16:26:37+0000",
      "renewedOn": null,
      "amount": {
        "amount": 0
      },
      "maxAmount": null,
      "ontologySkills": [
        {
          "id": null,
          "prefLabel": "Video Editing"
        },
        {
          "id": null,
          "prefLabel": "Adobe Premiere Pro"
        },
        {
          "id": null,
          "prefLabel": "Animation"
        }
      ],
      "hourlyBudgetMin": 10,
      "hourlyBudgetMax": 20
    },
    {
      "id": null,
      "ciphertext": "~021949935562824070431",
      "title": "Actor's reel",
      "description": "I need help with my actor's reel. I have the movie and time frame for my scene. Can you help me?",
      "engagement": "Less than 30 hrs/week",
      "durationLabel": "Less than 1 month",
      "contractorTier": "INTERMEDIATE",
      "type": "HOURLY",
      "createdOn": "2025-07-28T20:50:41+0000",
      "renewedOn": null,
      "amount": {
        "amount": 0
      },
      "maxAmount": null,
      "ontologySkills": [
        {
          "id": null,
          "prefLabel": "Video Editing"
        },
        {
          "id": null,
          "prefLabel": "Video Editing & Production"
        },
        {
          "id": null,
          "prefLabel": "UGC"
        },
        {
          "id": null,
          "prefLabel": "Instagram Reels"
        },
        {
          "id": null,
          "prefLabel": "YouTube Video"
        },
        {
          "id": null,
          "prefLabel": "Podcast Editing"
        },
        {
          "id": null,
          "prefLabel": "Adobe Premiere Pro"
        },
        {
          "id": null,
          "prefLabel": "YouTube Shorts"
        },
        {
          "id": null,
          "prefLabel": "Graphic Design"
        },
        {
          "id": null,
          "prefLabel": "YouTube Thumbnail"
        },
        {
          "id": null,
          "prefLabel": "Social Media Design"
        },
        {
          "id": null,
          "prefLabel": "Adobe Photoshop"
        },
        {
          "id": null,
          "prefLabel": "Photo Editing"
        },
        {
          "id": null,
          "prefLabel": "Banner Ad Design"
        },
        {
          "id": null,
          "prefLabel": "Vlog"
        }
      ],
      "hourlyBudgetMin": 0,
      "hourlyBudgetMax": 0
    }
  ],
  "buyerExtra": {
    "isPaymentMethodVerified": true
  }
}
```

# Changelog

This Actor's version history is a separate document: https://apify.com/flash_mage/upwork/changelog.md

# Actor input Schema

## `query` (type: `array`):

💡 KEYWORD or URL or JOB-ID

## `limit` (type: `integer`):

Number of results. With authentication, at most 500.

## `sort` (type: `string`):

No description

## `category` (type: `string`):

Job category. All filters the whole group; a specific specialty sends both category and subcategory. Leave empty for no filter.

## `timezone` (type: `array`):

Client timezone preference on the job. Leave empty for no filter.

## `update_boolean` (type: `boolean`):

No description

## `update_job_ids` (type: `array`):

18–19 digit job IDs as strings. Required when only update is on. For search, leave the prefill as-is; do not send an empty array. With authentication, at most 500.

## `hourly` (type: `boolean`):

Include hourly jobs. Price filters below apply only when this is on. If hourly and fixed are both off, both types are searched and price filters are ignored.

## `hourly_min_price` (type: `integer`):

Optional lower bound in USD/hr. Leave empty for no minimum. If greater than hourly max, the two values are swapped.

## `hourly_max_price` (type: `integer`):

Optional upper bound in USD/hr. Leave empty for no maximum. If less than hourly min, the two values are swapped.

## `fixed` (type: `boolean`):

Include fixed-price jobs. Price filters below apply only when this is on. If hourly and fixed are both off, both types are searched and price filters are ignored.

## `fixed_prices` (type: `array`):

Preset fixed-price buckets. Optional custom min/max below are merged with this list.

## `fixed_min_price` (type: `integer`):

Optional custom lower bound in USD. Leave empty for no minimum. If greater than fixed max, the two values are swapped.

## `fixed_max_price` (type: `integer`):

Optional custom upper bound in USD. Leave empty for no maximum. If less than fixed min, the two values are swapped.

## `location_regions` (type: `array`):

Leave empty for no filter on this group.

## `location_subregions` (type: `array`):

Leave empty for no filter on this group.

## `location_countries` (type: `array`):

Leave empty for no filter on this group.

## `experience_level` (type: `array`):

No description

## `client_history` (type: `array`):

No description

## `project_length` (type: `array`):

No description

## `hours_per_week` (type: `array`):

No description

## `contract_to_hire_roles` (type: `boolean`):

No description

## `authentication` (type: `string`):

When authentication is on, search limit and update job IDs are at most 500.

## `authentication_node_js_code` (type: `string`):

Function Needed for Authentication Request

## Actor input object example

```json
{
  "update_boolean": false,
  "update_job_ids": [
    "1974229435317190991",
    "1974184115785526950",
    "1974229291820489729",
    "1974229162153307814",
    "1974229143502953454",
    "1974229140898021711",
    "1974229039236750318",
    "1974183702387982672",
    "1974228964049387855",
    "1974183649217059822"
  ],
  "hourly": true,
  "fixed": true,
  "authentication": "no_authentication"
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items. Switch Overview or Standard in the view selector.

## `status` (type: `string`):

Run summary. If the dataset is empty, read this page.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "update_job_ids": [
        "1974229435317190991",
        "1974184115785526950",
        "1974229291820489729",
        "1974229162153307814",
        "1974229143502953454",
        "1974229140898021711",
        "1974229039236750318",
        "1974183702387982672",
        "1974228964049387855",
        "1974183649217059822"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_mage/upwork").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "update_job_ids": [
        "1974229435317190991",
        "1974184115785526950",
        "1974229291820489729",
        "1974229162153307814",
        "1974229143502953454",
        "1974229140898021711",
        "1974229039236750318",
        "1974183702387982672",
        "1974228964049387855",
        "1974183649217059822",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("flash_mage/upwork").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "update_job_ids": [
    "1974229435317190991",
    "1974184115785526950",
    "1974229291820489729",
    "1974229162153307814",
    "1974229143502953454",
    "1974229140898021711",
    "1974229039236750318",
    "1974183702387982672",
    "1974228964049387855",
    "1974183649217059822"
  ]
}' |
apify call flash_mage/upwork --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,flash_mage/upwork"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QRHJxnLxIAxpfHCcu/builds/rotUN7lPvyu0qEjLN/openapi.json
