A week ago I had zero products. Today I have 10 paid scrapers ("actors") live on the Apify Store, all pay-per-result. Total revenue so far: modest. Total lessons: enormous. Here are the ones I wish someone had told me on day one.
1. "Zero competitors" is not a green light
My first instinct was to hunt for empty niches. Zero competitors means zero proof: it is not evidence of an untapped market, it is the absence of evidence of any market. A niche actor I studied had 2 users after 7 weeks.
The niche that actually performs for me (crypto funding rate arbitrage) had two established competitors with 20+ paying users each. That was the real signal: money already flows here, and the pie is not locked up.
2. Your platform defaults are eating your margin
This one hurt. On pay-per-event pricing, YOU pay the platform usage of every run out of your earnings. The default memory allocation was 4096 MB. My actors are simple HTTP fetchers that finish in 5 seconds.
One of my actors was literally losing money: $0.0161 platform cost per run vs $0.015 revenue. Negative margin on every single sale, invisible unless you check run stats via the API.
Dropping memory from 4096 MB to 512 MB cut per-run cost by a factor of 4 to 8. One API call. Biggest ROI of the whole week.
3. Sources will block you, and your datacenter IP is the problem
What works from your laptop will not necessarily work from a cloud IP:
- Binance geo-blocks datacenter IPs with HTTP 451. OKX serves them fine. Same data.
- Steam rate-limits its price endpoint so hard from cloud IPs that every request 429s. Fix: route through a proxy and keep a fallback endpoint.
- Yahoo Finance blocks its crumb endpoint from datacenter ranges. CBOE serves the same options data with no auth at all.
The lesson: pick your data source for its reachability from cloud infra, not just for its data quality. Always have a plan B endpoint.
4. Silent failure handling is a trap you set for yourself
Every fetch helper I wrote originally swallowed exceptions and returned None. Clean, defensive, and completely blind. When a source started failing, my actor shipped empty datasets with a green SUCCEEDED status. A paying customer gets zero rows and you get zero idea why.
Now every helper retries on 429/5xx with backoff and logs the status code on final failure. The first day this was live, the logs immediately told me exactly which source was blocking which endpoint. Debugging went from "rerun and guess" to "read one log line".
5. Never ship an empty dataset
If your scraper found no signals today, that is information. Push a baseline snapshot row, or a top-N fallback, anything structured. Empty datasets get your actor flagged as "under maintenance" and kill buyer trust. A customer who pays for 5 rows of "nothing unusual today, here is the current state" is happier than one who pays for nothing.
What the portfolio looks like
10 actors, all pay-per-result ($0.002 to $0.005): funding rate arbitrage across 4 exchanges, a Bitcoin market pulse score, new-token momentum with anti-rug filters, news trend acceleration, odds movement for soccer and horse racing, CS2 skin prices, prediction market comparison (Polymarket vs Kalshi), unusual options activity from CBOE, and an address-history lookup.
All of them: https://apify.com/0xgollum
Happy to answer questions about any of this, especially the pricing/margin math, which nobody seems to write about.
Top comments (0)