Erome Scraper & Video Downloader avatar

Erome Scraper & Video Downloader

Pricing

from $0.70 / 1,000 results

Go to Apify Store
Erome Scraper & Video Downloader

Erome Scraper & Video Downloader

Scrape and download Erome albums, profiles and search. One row per video or image with the direct CDN link, a working download URL, duration, resolution, real file size, a thumbnail for every video, tags, views and full uploader details.

Pricing

from $0.70 / 1,000 results

Rating

0.0

(0)

Developer

1codefort

1codefort

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Scrape Erome albums, creator profiles and keyword searches — and, when you ask for it, download the actual files. One clean row per media item, with everything the other Erome actors leave out.

Feed it album links, profile links, usernames or a keyword in the same run — no stitching separate runs together afterwards.


Why this one

Most Erome actors hand you a list of vNN.erome.com/..._720p.mp4 links and stop there. Those links answer 403 Forbidden the moment your own script fetches them, because Erome's CDN requires a Referer: https://www.erome.com/ header. A dataset of dead links is not a product.

This actor closes that gap:

Typical Erome actorsThis actor
Direct CDN linksyesyes
Working download link (no special headers needed)noyes — a pre-signed, permanent public URL per file, stored in the run
Ready-to-run curl + exact headers for the CDN linknoyescurlCommand, requestHeaders
Real file size per itemrarelyyes — true bytes + readable form
Thumbnail for every videoonly the ones Erome rendersyes — derived from the CDN when Erome lazy-loads it
Duration in seconds + MM:SSclaimed by someyes, from the page itself
True resolution + quality labelno (res='720' label='HD')yesqualityRes, qualityLabel
Image pixel dimensionsnoyeswidth, height
Album tags, views, uploader avatarpartialyes
One row per media item (no second lookup)yesyes
Album-only output mode (cheap catalogue runs)noyes
Real ZIP per albumadvertised, usually a stubyes, actually implemented
Error rows chargedoftennever — only successful rows are charged

Honest note on quality selection: Erome publishes a single 720p (HD) rendition per video. Actors that offer a "1080p / 480p / 360p" picker are choosing between options that do not exist — those URLs return 410 Gone. This actor accepts preferredQuality for drop-in compatibility, resolves it against the renditions actually exposed, and always reports the real resolution it returned.


Three ways in, one run

{
"startUrls": [
"https://www.erome.com/a/9epdXFu0",
"https://www.erome.com/ScandalouzBitchezTripleSIXXX",
"someotherusername"
],
"searchQuery": "amateur"
}
  • Album link (https://www.erome.com/a/XXXXXXXX) → that album's media.
  • Profile link or bare username → every album from that creator (capped by maxAlbumsPerProfile).
  • Keyword (searchQuery) → Erome search results → their albums (capped by maxSearchPages / maxAlbumsPerSearch).

Every entry is classified automatically. A bare word that turns out not to be a creator is retried as a keyword instead of failing the run.


Input

FieldTypeDefaultWhat it does
startUrlsarray["https://www.erome.com/a/9epdXFu0"]Album links, profile links or plain usernames. Detected automatically.
urlTextstringCopy/paste fallback: one link or username per line.
usernamesarrayCreator usernames to crawl, one entry each.
searchQuerystringKeyword to search on Erome. Usable on its own or next to the links.
mediaTypeselectallall · video · image.
outputModeselectmediamedia = one row per item · albums = one row per album · both.
maxResultsinteger1000Hard cap on media items for the whole run — this is your cost cap.
maxAlbumsPerProfileinteger50Albums pulled per creator.
maxSearchPagesinteger1Erome result pages to walk (~36 albums per page).
maxAlbumsPerSearchinteger50Albums scraped from a keyword.
downloadFilesbooleanfalseDownload the real files into the run and give every row a permanent downloadUrl.
createZipbooleanfalseAlso bundle each album into a single ZIP. Requires downloadFiles.
preferredQualityselectbestResolved against the renditions Erome really exposes.
includeFileSizebooleantrueTrue file size via a 1-byte range request. Turn off for the fastest run.
includeErrorRowsbooleanfalseOff by default because the platform bills every dataset item, so a failed link would show up as a paid row. Failures are reported in the log and in the run's SUMMARY record instead.
concurrencyinteger8Albums scraped in parallel.
maxRequestsPerSecondinteger8Politeness limit (0 = unlimited).
maxZipSizeMbinteger2048Skip a ZIP bigger than this.
proxyConfigurationproxyOptional. Only needed for a specific country or after a rate limit — this actor already retries refused requests through it.

Output

One row per media item. Example (fields trimmed for width):

{
"type": "video",
"mediaId": "1bx9HTKu",
"position": 2,
"title": "Album title",
"url": "https://v46.erome.com/9037/9epdXFu0/1bx9HTKu_720p.mp4",
"directUrlRequiresReferer": true,
"requestHeaders": {
"Referer": "https://www.erome.com/",
"User-Agent": "Mozilla/5.0 ..."
},
"curlCommand": "curl -L -H 'Referer: https://www.erome.com/' -o 'file.mp4' '...'",
"downloadUrl": "https://api.apify.com/v2/key-value-stores/STORE/records/media/9epdXFu0/...",
"fileSizeBytes": 2929225,
"sizeFormatted": "2.8MB",
"thumbnailUrl": "https://s46.erome.com/9037/9epdXFu0/1bx9HTKu.jpg",
"durationSec": 22,
"durationText": "00:22",
"format": "mp4",
"qualityLabel": "HD",
"qualityRes": 720,
"availableFormats": [{ "url": "...", "type": "video/mp4", "qualityLabel": "HD", "qualityRes": 720, "sizeBytes": 2929225 }],
"albumId": "9epdXFu0",
"albumUrl": "https://www.erome.com/a/9epdXFu0",
"albumTitle": "Album title",
"uploader": "creator",
"uploaderUrl": "https://www.erome.com/creator",
"uploaderAvatarUrl": "https://avatar.erome.com/...",
"tags": ["Asian", "Amateur", "Teen"],
"viewsText": "131,4K",
"views": 131400,
"albumMediaCount": 5,
"albumVideoCount": 3,
"albumImageCount": 2,
"sourceUrl": "https://www.erome.com/a/9epdXFu0",
"sourceType": "album",
"searchQuery": null,
"inputUrl": "https://www.erome.com/a/9epdXFu0",
"scrapedAt": "2026-09-13T03:17:41.494Z",
"status": "ok",
"errorMessage": null
}

Images carry the same shape with "type": "image", plus the real width and height.

Album rows (outputMode: albums) carry the album metadata plus previewImage and — with createZipzipFileUrl.

The run also writes a SUMMARY record to the key-value store with album/media counts, error counts, files downloaded and total bytes.


Downloading the files

downloadFiles: true streams every file into the run's key-value store and puts a pre-signed public URL on each row:

https://api.apify.com/v2/key-value-stores/<store>/records/media-<albumId>-<position>-<mediaId>.mp4?signature=XXXXXXXX

This is worth explaining, because it is the single most common way an Erome downloader ships broken. The "obvious" URL for a stored file is

https://api.apify.com/v2/key-value-stores/<store>/records/<key>HTTP 403

and it answers 403 insufficient-permissions to anyone without an Apify token: run storages inherit the owner's restricted general access. A dataset full of those links looks perfect and downloads nothing. Apify signs a record URL with an HMAC signature, and a signed record link is permanent ("it stays valid as long as the record exists"), so it needs no token, no cookie and no header. Every row says which kind of link it got, in downloadUrlPublic (verified with a plain fetch: 200 video/mp4 with the exact byte count).

Drop those links in a browser, ffmpeg, a NAS, or an archive script. With createZip: true each album is also packed into one streaming ZIP (nothing is buffered in memory, so a 3 GB album is fine) and the ZIP link is signed the same way.

Two honest caveats:

  • "Permanent" means as long as both the record and the run's storage exist. Apify deletes run storages after your account's data-retention period, so treat the links as durable for that window — they are not an archive. For a real archive, download the files to your own storage.
  • Because the actor only charges for files it actually stored, a download that fails costs you nothing.

Pricing

Pay per event — you pay for what you get:

EventPriceWhen
Actor start$0.0002once per run
result$0.001per row written (media item or album row) — $1.00 per 1,000 results
file stored$0.01 per 10 MB (minimum 1)per file actually downloaded and stored — roughly $1 per GB you actually get

Volume discounts apply automatically from Bronze up (down to $0.0007 per result). Failures are never billed — error rows stay out of the dataset by default, so they are not charged.

How this compares

ActorPrice per 1,000 results
this one$0.70 at the best volume tier · $1.00 on the free tier
solidcode/erome-scraper-video-downloader$1.70 at the best tier · $2.00 on the free tier
vnx0/erome-downloader$5.00 + $0.10 per run
serpxxx/erome-bulk-video-downloader$10.00
serpxxx/erome-downloader, pornvidsdownload/how-to-download-erome-videosno runtime at all

That is 41% below the cheapest competing Erome actor on the free tier and 59% below it at volume, while returning more fields, a working download link and a real ZIP.

Why it can be that cheap: Erome answers from Apify's own infrastructure, so no proxy is needed for the normal path, and the actor streams instead of buffering, so 1 GB of memory is enough even for large albums. Metadata runs cost the platform about $0.015 per 1,000 rows (compute $0.20 per GB-hour, dataset writes $0.005 per 1,000). Stored files cost about $0.42 per GB (egress plus a week of storage), which is why the stored-file event is priced per 10 MB rather than per file — a 300 MB clip costs more to host than a 3 MB one, and it should pay for itself rather than being subsidised by cheap clips.

Cost examples:

  • 1,000 results, metadata only → $1.00
  • 1 album of 5 items → about $0.0002 + $0.005
  • 1 album of 20 clips, files downloaded (~120 MB) → $0.02 of rows + $0.12 of storage
  • catalogue run: outputMode: albums + includeFileSize: false → $0.001 per album and no album page is ever opened

Use it from anywhere

  • API — every run is a REST call, so it drops into any backend.
  • MCP server — plug it into an AI agent as a tool.
  • Integrations — Google Sheets, n8n, Make, Zapier, Slack, webhooks.
  • Schedules — keep a watchlist of profiles or a keyword fresh on a timer.

Notes, limits and fair use

  • Direct CDN links are short-lived. Erome rotates the tokens behind them — that is exactly why this actor returns fresh ones per run. downloadFiles gives you links that do not expire.
  • One 720p rendition per video (see above). Nothing in the output pretends otherwise.
  • Private content is out of scope. The actor reads public album, profile and search pages only; it does not log in, bypass paywalls, or touch private albums.
  • You are responsible for what you download. Use it for content you own, content you have permission to access, or content you are legally allowed to archive. Respect Erome's terms and the rights of the people in the media.
  • Failures never cost you a row. Because the platform bills for every item written to the dataset, error rows are kept out of the dataset by default (they go to the log and to the run's SUMMARY record). Set includeErrorRows: true if you want them in the dataset — knowing those rows are then charged like any other. Either way a bad link in a batch of 500 never kills the run.

Quick recipes

One album, metadata only

{ "startUrls": ["https://www.erome.com/a/9epdXFu0"] }

Whole creator, videos only, files downloaded, max 25 albums

{ "startUrls": ["somecreator"], "mediaType": "video", "downloadFiles": true, "createZip": true, "maxAlbumsPerProfile": 25 }

Keyword catalogue, 3 result pages, album rows only

{ "searchQuery": "amateur", "maxSearchPages": 3, "outputMode": "albums" }

Refresh a list of albums on a schedule, images only, cheap

{ "urlText": "https://www.erome.com/a/XXXXXXXX\nhttps://www.erome.com/a/YYYYYYYY", "mediaType": "image", "includeFileSize": false }