Freelancer Profile Scraper avatar

Freelancer Profile Scraper

Under maintenance

Pricing

$2.70 / 1,000 freelancer profiles

Go to Apify Store
Freelancer Profile Scraper

Freelancer Profile Scraper

Under maintenance

Search Contra, Upwork, or PeoplePerHour for public freelancer profiles by skill, role, or supported source URL. Save source links and available details, such as skills, location, rates, and earnings, in a dataset.

Pricing

$2.70 / 1,000 freelancer profiles

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

🧭 Build a public freelancer profile list

Recruiters, talent teams, and researchers can search Contra, Upwork, or PeoplePerHour by skill, role, or supported source URL. Each saved profile includes its marketplace link and the professional details that source makes public, so you can review skills, rates, and locations together in one dataset.

📦 Public profile data in one dataset

The Actor saves one row for each collected public freelancer profile. The marketplace field shows whether it came from Contra, Upwork, or PeoplePerHour. Each row has a source profile link. Other fields depend on the marketplace and what it makes public.

Contra rows can include skills, rates, portfolios, testimonials, follower counts, and linked social profiles. Upwork rows can include earnings, billed hours, job totals, badges, verification details, and agency information. PeoplePerHour rows can include rates, ratings, reviews, and completed-job totals. Optional fields may be missing when a source does not show them.

Choose one marketplace for each run. Add skills or roles, or provide URLs supported by that marketplace. All keywords in the same run use the same filters.

  1. Choose Contra, Upwork, or PeoplePerHour.
  2. Enter one or more skills or roles, or add supported source URLs.
  3. Set filters that apply to the chosen marketplace.
  4. Set a profile limit, run the Actor, and open the dataset from the output.

⚙️ Input

Input fields

FieldTypeWhat it does
marketplaceString (select)Choose Contra, Upwork, or PeoplePerHour. Contra is prefilled. Only the selected marketplace's options apply.
specializationStringSet a Contra category or specialization, such as Graphic Designer.
countryStringFind Upwork freelancers in a country, such as Canada.
regionStringFind Upwork freelancers in a continent or supported sub-region, such as Europe.
earningsString (select)Filter Upwork profiles by public earnings in USD: confirmed $0, $1 to under $100, $100 to under $1,000, $1,000 to under $10,000, or $10,000 or more. Hidden or unknown amounts are not treated as zero.
minBilledHoursIntegerSet the minimum billed hours for Upwork profiles.
minJobSuccessIntegerSet the minimum Upwork Job Success Score, from 0 to 100.
talentBadgeString (select)Find Upwork profiles with Top Rated, Top Rated Plus, or Rising Talent status.
minRatingNumberSet the minimum PeoplePerHour rating, from 0 to 5 stars.
keywordsArray of stringsEnter skills or roles to search. All keywords use the same filters. “graphic designer” is prefilled.
sourceUrlsArray of URL objectsAdd Contra directory, hire, category, or profile URLs, or Upwork talent search URLs. This field does not apply to PeoplePerHour.
locationStringFind Contra or PeoplePerHour freelancers in a city or region. It does not apply to Upwork.
minHourlyRateNumberSet a minimum hourly rate in USD for Contra or Upwork. It does not apply to PeoplePerHour.
maxHourlyRateNumberSet a maximum hourly rate in USD for Contra or Upwork. It does not apply to PeoplePerHour.
maxItemsIntegerStop after saving this many profiles across the run. The field is prefilled with 8 and has a minimum of 1, with no schema maximum. Leave it empty to return all available results until the source is exhausted.

Example input

This example matches the public input from a successful hosted run with the prefilled marketplace, keyword, and profile limit.

{
"marketplace": "contra",
"keywords": [
"graphic designer"
],
"maxItems": 8
}

🧾 Output

The run output has a profiles link that opens the default dataset view. Each dataset row is a flat profile object. Its fields depend on the marketplace and the public details available for that profile.

Run output

FieldTypeWhat it does
profilesString (link)Opens the collected freelancer profiles in the default dataset view.

Dataset profile fields

FieldTypeWhat it does
marketplaceStringMarketplace name: contra, upwork, or peopleperhour.
profileUrlString (URL)Link to the public freelancer profile. This field is required.
nameStringName shown on the profile.
usernameStringPublic marketplace username.
profileIdStringSource profile ID for matching records from the same marketplace.
headlineStringProfessional headline shown by the source.
biographyStringBiography shown by the source.
timezoneStringTimezone listed by Upwork.
photoUrlString (URL)Link to the profile photo.
websiteUrlString (URL)Personal website linked on Contra.
introVideoUrlString (URL)Introduction video linked on Upwork.
skillsArray of stringsSkills listed on the profile.
hourlyRateObjectHourly rate reported by the source. A fixed rate uses an amount and currency. A range uses text.
hourlyRate.amountNumberFixed hourly amount reported by the source.
hourlyRate.currencyStringCurrency for the hourly rate.
hourlyRate.textStringRate range shown by the source, including its currency and hourly unit.
locationObjectLocation shared on the profile.
location.textStringLocation label shown by the source.
location.cityStringCity shown by the source.
location.regionStringState or region shown by the source.
location.countryStringCountry shown by the source.
earningsObjectPublic Upwork earnings. A missing amount is unknown, not zero.
earnings.amountNumberReported earnings amount. Zero means the source confirms zero earnings.
earnings.currencyStringCurrency for the reported earnings.
earnings.textStringEarnings label shown by the source, including a range or lower bound.
jobCountIntegerJob total reported by the marketplace.
completedJobCountIntegerCompleted-job total reported by PeoplePerHour.
reviewCountIntegerReview total reported by the marketplace.
followerCountIntegerFollower total reported by Contra.
billedHoursNumberBilled hours reported by Upwork.
jobSuccessScoreNumberUpwork Job Success Score as a percent.
ratingNumberPeoplePerHour star rating, out of 5.
badgesArray of stringsProfessional or talent badges shown by the marketplace.
isVettedBooleanWhether Upwork reports that the freelancer is vetted.
isPhoneVerifiedBooleanWhether Upwork reports that the phone is verified.
isOpenToWorkBooleanWhether the source reports that the freelancer is open to work.
portfolioProjectsArray of objectsPortfolio projects shared on Contra.
portfolioProjects[].titleStringPortfolio project title.
portfolioProjects[].urlString (URL)Link to the source project page.
portfolioProjects[].descriptionStringPortfolio project description.
portfolioProjects[].imageUrlString (URL)Link to the project image.
socialLinksArray of objectsPublic social profiles linked on Contra.
socialLinks[].platformStringSocial platform named by the source.
socialLinks[].urlString (URL)Link to the social profile.
testimonialsArray of objectsPublic testimonials and review text shared on Contra.
testimonials[].textStringTestimonial or review text.
testimonials[].authorNameStringName of the testimonial author when shown.
agenciesArray of objectsAgency affiliations shown by Upwork.
agencies[].idStringSource agency ID.
agencies[].nameStringAgency name.
agencies[].urlString (URL)Link to the public agency page.
agencies[].descriptionStringAgency description shown by Upwork.
agencies[].logoUrlString (URL)Link to the source agency logo.
portfolioCountIntegerContra portfolio project total. It may include projects not listed in the row.
testimonialCountIntegerContra testimonial total. It may include testimonials not listed in the row.
hourlyJobCountIntegerHourly-job total reported by Upwork.
fixedPriceJobCountIntegerFixed-price job total reported by Upwork.

All profile fields except marketplace and profileUrl are optional. The rows below come from successful runs on the current beta build. The Contra and Upwork examples are shortened; "..." marks omitted data.

Contra profile row, shortened

{
"marketplace": "contra",
"profileId": "WyJVc2VyUHJvZmlsZSIsMzUyODgyNDdd",
"profileUrl": "https://contra.com/onyourtiptoes",
"name": "Cara Ellis",
"headline": "Designing for connection ⋆˚꩜。 ",
"biography": "...",
"location": {
"text": "London, UK"
},
"skills": [
"Brand Designer",
"Logo Designer",
"Digital illustrator"
],
"hourlyRate": {
"text": "$100 - $150/hr"
},
"followerCount": 1712,
"isOpenToWork": true,
"reviewCount": 25,
"portfolioCount": 24,
"portfolioProjects": [
{
"title": "Guerilla Marketing Shirt Artworks and Design for Conduct AI",
"url": "https://contra.com/p/LAmsBcOl-guerilla-marketing-shirt-artworks-and-design-for-conduct-ai",
"description": "...",
"imageUrl": "..."
}
],
"socialLinks": "...",
"testimonials": "...",
"testimonialCount": 21
}

Upwork profile row, shortened

{
"marketplace": "upwork",
"profileId": "~01f7f788f7fcd6abae",
"profileUrl": "https://upwork.com/freelancers/dmytro1serebrych1udata",
"name": "Dmytro S.",
"headline": "Python Full stack developer | Python Web Scraping Automation AI LLM",
"biography": "...",
"timezone": "UTC+02:00 Israel",
"location": {
"city": "Kyiv",
"region": "KYIV CITY",
"country": "Ukraine"
},
"hourlyRate": {
"amount": 30,
"currency": "USD"
},
"skills": [
"Python",
"Python Script",
"Django",
"Flask",
"..."
],
"billedHours": 3349,
"hourlyJobCount": 28,
"fixedPriceJobCount": 17,
"jobCount": 1,
"earnings": {
"amount": 142231.66,
"currency": "USD",
"text": "$100K+ earned"
},
"jobSuccessScore": 100,
"badges": [
"Top Rated Plus",
"Available now"
],
"isPhoneVerified": true,
"agencies": [
{
"id": "~01a9ca7867c57aca25",
"name": "UData",
"logoUrl": "...",
"url": "https://www.upwork.com/agencies/1727373285633892352/",
"description": "..."
}
],
"isVetted": false
}

PeoplePerHour profile row

This complete row is unchanged except for whitespace from a successful current beta run.

{
"marketplace": "peopleperhour",
"profileId": "3653562",
"profileUrl": "https://www.peopleperhour.com/freelancer/technology-programming/george-ogden-software-developer-problem-solver-xwqxqwy",
"name": "George O.",
"photoUrl": "https://dw3i9sxi97owk.cloudfront.net/uploads/thumbs/3ae49abfe1115138b12d2dac6da93816_150x150.jpg",
"skills": [
"Amazon web services",
"Linux",
"Git",
"C++ programming language",
"Julia programming language",
"Problem solving",
"Python programming language",
"Rust programming language",
"Simulation software",
"Software development"
],
"location": {
"country": "United Kingdom",
"city": "Croydon"
},
"headline": "Software Developer/Problem Solver",
"rating": 5,
"reviewCount": 114,
"completedJobCount": 98,
"hourlyRate": {
"amount": 67.10644712701436,
"currency": "USD"
}
}

💳 Pricing

This Actor uses pay-per-event pricing. A charged primary event represents one public freelancer profile successfully collected and delivered to the dataset. The event price is $0.0027 per profile.

🔌 Integrations

Open the profiles output link to view the dataset on Apify. For an Apify walkthrough, watch:

❓ FAQ

Can one run search more than one marketplace?

No. Choose Contra, Upwork, or PeoplePerHour for each run. All keywords in that run use the same filters.

What happens if Maximum profiles is empty?

Leave it empty to return all available results until the source is exhausted. The Actor stops when the source has no more available results.

Can I search Fiverr or GitHub?

No. This Actor searches Contra, Upwork, and PeoplePerHour.

Why are some profile fields missing?

Each marketplace shows different fields, and some details are optional. The Actor includes optional values only when they are available. Hidden or unknown Upwork earnings are not treated as zero.

Which source URLs can I use?

For Contra, you can add directory, hire, category, or profile URLs. For Upwork, add a talent search URL. PeoplePerHour does not use the Source URLs field.

📝 Changelog

v0.0 (08-10-2026)

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré