# Fiverr Gig Listings Scraper (`devilscrapes/fiverr-gig-listings-scraper`) Actor

Scrape Fiverr gig search results by keyword — title, seller name, price, rating, review count, and delivery package details. Structured JSON/CSV output for freelance-marketplace research, competitor pricing benchmarks, and lead-gen tooling. No login required.

- **URL**: https://apify.com/devilscrapes/fiverr-gig-listings-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Fiverr Gig Listings Scraper

*We do the dirty work so your dataset stays clean.* 😈

Scrape Fiverr gig search results by keyword — title, seller name, price, rating, review count, and delivery package details. Structured JSON/CSV output for freelance-marketplace research, competitor pricing benchmarks, and lead-gen tooling. No login required.

</div>

***

### 🎯 What this scrapes

Fiverr's gig search (`fiverr.com/search/gigs`) has no public API and is
the default place agencies, researchers, and lead-gen tooling look for
freelance-marketplace pricing and seller data. This Actor searches one
or more keywords and returns structured rows per gig — title, seller
name and country, rating and review count, starting price, package
type, delivery time, and thumbnail — straight from Fiverr's own search
response.

### 🔥 What we handle for you

- 🛡️ **Browser fingerprint rotation** — `curl-cffi` impersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python.
- 🌐 **Residential proxy rotation** via Apify Proxy — fresh session and exit IP on every block.
- 🔁 **Retries with exponential backoff** on `408 / 429 / 503 / 504` — up to 5 attempts per page, `Retry-After` honoured.
- 🧱 **Session rotation on 403** — a block on one exit IP doesn't stall the whole run.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, JSON / CSV / Excel export straight from the Apify Console.
- 💰 **Pay-Per-Event pricing** — $0.20 per run plus $0.003 per unique gig delivered. No data, no per-result charge.
- 🧹 **De-duplicated results** — Fiverr's own search response can list the same gig twice on one page (once promoted, once organic); we collapse duplicates before they ever hit your dataset or your bill.

### 💡 Use cases

- **Competitor pricing benchmarks** — pull starting prices and delivery times across a service category.
- **Freelance-marketplace research** — analyze rating, review volume, and Pro-seller mix by keyword.
- **Lead generation** — build a directory of active Fiverr sellers in a given niche.
- **Market monitoring** — re-run on a schedule and diff successive datasets to spot new gigs and price changes.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Enter one or more search keywords and adjust `maxPagesPerKeyword` if needed.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `keywords` | `array` | **yes** | — | One or more Fiverr search queries, e.g. `["logo design", "wordpress developer"]`. |
| `maxPagesPerKeyword` | `integer` | no | `3` | Pages to fetch per keyword (48 gigs/page, so 3 = up to 144 rows/keyword). |
| `countryCode` | `string` | no | `"US"` | 2-letter ISO code pinning the residential proxy exit country. |
| `maxRuntimeSecs` | `integer` | no | `300` | Wall-clock deadline governor; stop requesting new pages once spent. |
| `proxyConfiguration` | `object` | no | Residential | Apify Proxy spec — must stay Residential; Fiverr blocks direct/datacenter requests. |

#### Example input

```json
{
  "keywords": ["logo design", "wordpress developer"],
  "maxPagesPerKeyword": 2,
  "maxRuntimeSecs": 90,
  "countryCode": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### 📤 Output

Every row is one Fiverr gig.

| Field | Type | Notes |
|---|---|---|
| `gigId` | `integer` | Fiverr gig ID. |
| `title` | `string` | Gig title. |
| `sellerName` | `string` | Seller username. |
| `sellerId` | `integer \| null` | Seller numeric ID. |
| `sellerCountry` | `string \| null` | Seller's declared country. |
| `sellerOnline` | `boolean \| null` | Whether the seller was online at scrape time. |
| `isPro` | `boolean \| null` | Whether the seller carries Fiverr Pro status. |
| `isSponsored` | `boolean` | True iff the gig was a promoted/sponsored listing. |
| `sellerRatingScore` | `number \| null` | Seller rating, 0-5. |
| `sellerRatingCount` | `integer \| null` | Number of ratings. |
| `priceFrom` | `number \| null` | Starting price, as-observed (no currency conversion). |
| `packageType` | `string \| null` | Recommended package tier. |
| `deliveryDays` | `integer \| null` | Delivery time in days for the recommended package. |
| `hourlyRate` | `number \| null` | Hourly rate, when published. |
| `categoryId` | `integer \| null` | Fiverr category ID. |
| `subCategoryId` | `integer \| null` | Fiverr sub-category ID. |
| `thumbnailUrl` | `string \| null` | Main gig image URL. |
| `gigUrl` | `string` | Absolute gig URL. |
| `sourceKeyword` | `string` | The input keyword that produced this row. |
| `sourcePage` | `integer` | 1-indexed search-results page this row came from. |
| `scrapedAt` | `string` | ISO-8601 timestamp of when this row was fetched. |

#### Example output

```json
{
  "gigId": 38121635, "title": "create a modern minimalist logo design",
  "sellerName": "yannick90", "sellerId": 30065438, "sellerCountry": "NL",
  "sellerOnline": true, "isPro": true, "isSponsored": false,
  "sellerRatingScore": 4.879479, "sellerRatingCount": 2303,
  "priceFrom": 250.0, "packageType": "cheapest", "deliveryDays": 3,
  "hourlyRate": 3500.0, "categoryId": 3, "subCategoryId": 49,
  "thumbnailUrl": "https://fiverr-res.cloudinary.com/.../design-a-clean-and-modern-logo.png",
  "gigUrl": "https://www.fiverr.com/yannick90/design-a-clean-and-modern-logo",
  "sourceKeyword": "logo design", "sourcePage": 1, "scrapedAt": "2026-09-10T14:22:03Z"
}
```

### 💰 Pricing

Pay-Per-Event: **$0.20** per run start, plus **$0.003** per unique gig
row written to your dataset. No results, no per-row charge — a run that
gets blocked before returning any gigs only costs the $0.20 start fee.
1,000 gigs works out to **$3.20** total ($0.20 + 1,000 × $0.003).

Duplicate gig entries — the same gig appearing twice on one search
page, or the same promoted gig re-appearing across multiple pages of
one keyword — are collapsed before they reach your dataset (see
Limitations), so you are only ever billed once per gig actually
delivered.

### 🚧 Limitations

Search results only — no gig detail-page scraping (reviews list, FAQ,
seller portfolio) and no seller-profile-page scraping in v1. No
authenticated/logged-in views. Prices are emitted as-observed in
whatever unit Fiverr's response carries for the pinned `countryCode`,
with no currency conversion.

Fiverr's search response can list the same gig twice within one page —
once as a promoted/sponsored placement and once in the organic
ranking — and can also re-inject the same promoted gig on multiple
pages of one keyword's results. We de-duplicate by `gigId` within each
keyword's whole result set before writing rows, keeping
`isSponsored: true` if any copy carried the promoted marker, so you
get one clean row (and one charge) per gig instead of a duplicate. The
same gig matching two *different* keywords is not de-duplicated — that
is distinct information you asked for twice.

### ❓ FAQ

**Is this legal?**

We only fetch content Fiverr's own public search page makes visible to
any visitor. Respect Fiverr's terms of service before using output
commercially.

**Why did I get fewer rows than `maxPagesPerKeyword × 48`?**

Fiverr's own search may return fewer gigs for a niche keyword, or the
run may have hit `maxRuntimeSecs` before finishing every page —
check the run's status message for a pages-fetched-vs-requested count.

**Can I filter by price or rating?**

Not in v1 — this Actor returns everything Fiverr's search API returns
for your keyword; filter the dataset after export.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship fixes
weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `keywords` (type: `array`):

One or more Fiverr search queries, e.g. <code>logo design</code>. Each keyword is searched independently, up to <code>maxPagesPerKeyword</code> pages.

## `maxPagesPerKeyword` (type: `integer`):

Pages to fetch per keyword. Fiverr returns 48 gigs per page, so 3 pages = up to 144 rows per keyword.

## `countryCode` (type: `string`):

2-letter ISO country code pinning the residential proxy exit (e.g. <code>US</code>). Prevents a geo-random exit from silently serving a localized/wrong-currency page.

## `maxRuntimeSecs` (type: `integer`):

Wall-clock deadline. The Actor stops requesting new pages once this much time has elapsed and finishes with whatever rows were already collected.

## `proxyConfiguration` (type: `object`):

Apify Proxy spec. Fiverr is fronted by Cloudflare + PerimeterX — residential exits are required for reliable access; direct/unauthenticated requests are blocked outright.

## Actor input object example

```json
{
  "keywords": [
    "logo design",
    "wordpress developer"
  ],
  "maxPagesPerKeyword": 3,
  "countryCode": "US",
  "maxRuntimeSecs": 300,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "keywords": [
        "logo design",
        "wordpress developer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/fiverr-gig-listings-scraper").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 = {
    "keywords": [
        "logo design",
        "wordpress developer",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/fiverr-gig-listings-scraper").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 '{
  "keywords": [
    "logo design",
    "wordpress developer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call devilscrapes/fiverr-gig-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devilscrapes/fiverr-gig-listings-scraper"
        }
    }
}

```

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/VZqn0pa7eeoaU9Yc4/builds/VvPsv7OXuskF61tgY/openapi.json
