CrustAPI vs serper.dev benchmark Run: July 11, 2026, from a single machine (macOS, residential US connection). Method: identical queries sent to both APIs back to back, wall-clock time measured around each HTTPS request, medians reported. Keys redacted. Re-run it yourself with the script at the bottom. == WEB SEARCH (5 queries, run once each) == Queries: "best crm software", "coffee roasters brooklyn", "how to start an llc", "running shoes for flat feet", "b2b lead generation tools" serper POST google.serper.dev/search timings (ms): 1529, 1014, 1078, 1517, 955 -> median 1078 organic results per query: 8, 10, 8, 8, 8 crustapi GET crustapi.com/v1/search?type=web timings (ms): 1347, 2477, 1825, 1178, 949 -> median 1347 organic results per query: 9, 8, 8, 7, 8 == IMAGES ("latte art", 1 query each) == serper 1100 ms, 10 images returned, 1 credit charged (default num) crustapi 1657 ms, 99 images returned, 1 credit charged serper with num=100 (same query): 100 images returned, 2 credits charged. So at serper's best configuration: 50 images per credit. CrustAPI: ~100 per credit. == NEWS ("artificial intelligence") == serper 966 ms, 10 items crustapi 1738 ms, 10 items == AUTOCOMPLETE ("why is the sky") == serper 553 ms, 10 suggestions crustapi 286 ms, 10 suggestions (A later re-run measured crustapi at 410 ms. Latencies vary run to run; we claim "faster in our runs", not a fixed multiple.) == ZERO-RESULT BILLING PROBE == serper POST /search q="\"zxqv9kqpw waaxbolt mnrtq88x\"" (quoted nonsense phrase) -> organic: 0 results, credits charged: 1 crustapi GET /v1/search?type=web&q=... with a zero-result query -> charged 0 credits (billing is per successful search; verified in production repeatedly, including via the dashboard mini-batch) == HONEST NOTES == - serper was faster than us on web and news in this run. We were faster on autocomplete. Both APIs live in the ~1 second band; speed should not be the reason anyone switches in either direction. - Single-run numbers, one machine, one day. Network conditions matter. Run the script below from your own infrastructure before deciding anything. == SCRIPT (python3, stdlib only; put your own keys in) == import json, time, urllib.request, statistics from urllib.parse import urlencode SERPER_KEY='...'; CRUST_KEY='...' QUERIES=['best crm software','coffee roasters brooklyn','how to start an llc', 'running shoes for flat feet','b2b lead generation tools'] def serper(endpoint, body): t0=time.time() req=urllib.request.Request(f'https://google.serper.dev/{endpoint}', data=json.dumps(body).encode(), headers={'X-API-KEY':SERPER_KEY,'Content-Type':'application/json'}) d=json.loads(urllib.request.urlopen(req, timeout=30).read()) return (time.time()-t0)*1000, d def crust(params): t0=time.time() req=urllib.request.Request('https://crustapi.com/v1/search?'+urlencode(params), headers={'x-api-key':CRUST_KEY}) d=json.loads(urllib.request.urlopen(req, timeout=30).read()) return (time.time()-t0)*1000, d s_ms=[]; c_ms=[] for q in QUERIES: ms,d=serper('search',{'q':q}); s_ms.append(ms) ms,d=crust({'type':'web','q':q}); c_ms.append(ms) print('serper median', statistics.median(s_ms)) print('crust median', statistics.median(c_ms))