Response Time Profiler
Pricing
$2.99/month + usage
Response Time Profiler
Response time profiler measures TTFB, DNS lookup, and total load time for any URL, so you can find slow pages before they cost you rankings.
Response Time Profiler: Measure TTFB, DNS, and Page Speed for SEO
Response time profiling is one of the faster ways to find pages hurting your search rankings. This actor measures DNS lookup time, time to first byte (TTFB), and total response time for any URL. It runs multiple samples to average out network noise, then grades each page from A to F based on standard performance thresholds.
Point it at a list of pages and it tells you which ones are slow, how slow, and how consistent they are across requests. Useful before a launch, after a deploy, or when a client wants to know why their site scores badly on PageSpeed.
Use cases
- SEO auditing: find slow pages dragging down your Core Web Vitals scores before they affect rankings
- Pre-launch checks: confirm response times are within range before going live
- Post-deploy monitoring: catch regressions after infrastructure or code changes
- Redirect auditing: spot pages with too many hops adding latency before the content loads
- Hosting comparison: benchmark the same URLs across servers or CDN configurations
- Agency reporting: generate response-time data for client audits without extra tooling
What data does this actor collect?
Each profiled URL produces one output record:
{"url": "https://apify.com","finalUrl": "https://apify.com/","statusCode": 200,"dnsLookupMs": 12.4,"avgTtfbMs": 98.3,"minTotalMs": 210.5,"maxTotalMs": 245.8,"avgTotalMs": 228.1,"seoGrade": "B","redirectCount": 1,"contentLengthBytes": 54320,"samplesCount": 3,"testedAt": "2025-01-15T10:30:00+00:00"}
| Field | Type | Description |
|---|---|---|
url | string | Original URL provided as input |
finalUrl | string | Final URL after following all redirects |
statusCode | integer | HTTP status code of the response |
dnsLookupMs | number | DNS resolution time in milliseconds |
avgTtfbMs | number | Average time to first byte across all samples |
minTotalMs | number | Fastest total response time recorded |
maxTotalMs | number | Slowest total response time recorded |
avgTotalMs | number | Average total response time across all samples |
seoGrade | string | A-F grade (A under 200ms, B 200-500ms, C 500-1000ms, D 1000-2000ms, F over 2000ms) |
redirectCount | integer | Number of redirects followed before the final URL |
contentLengthBytes | integer | Total response body size in bytes |
samplesCount | integer | Number of successful samples taken |
testedAt | string | ISO 8601 timestamp of when the test ran |
error | string | Error message if all samples failed for this URL |
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | Single URL to profile | |
urls | array | List of URLs to profile in bulk (one per line) | |
samples | integer | 3 | Requests per URL, averaged for the result. Min 1, max 10 |
maxUrls | integer | 100 | Maximum URLs to process per run (cap: 1000) |
timeoutSecs | integer | 300 | Overall actor timeout in seconds |
requestTimeoutSecs | integer | 30 | Per-request timeout in seconds |
proxyConfiguration | object | Datacenter (Anywhere) | Proxy type and location for requests. Supports Datacenter, Residential, Special, and custom proxies. Optional. |
Example input
{"urls": ["https://apify.com","https://apify.com/store","https://apify.com/pricing"],"samples": 3,"maxUrls": 100,"requestTimeoutSecs": 30,"proxyConfiguration": { "useApifyProxy": true }}
How it works
- Takes URLs from
urlandurls, deduplicates them, and caps the list atmaxUrls - Measures DNS lookup time for each hostname using a direct socket call
- Makes
samplesHTTP GET requests per URL using streaming to capture time to first byte and total load time separately - Computes min, max, and average timing across all successful samples
- Assigns an A-F SEO performance grade based on average total response time
- Pushes one result record per URL to the Apify dataset
FAQ
What does the SEO grade mean?
Grades map to standard web performance thresholds: A is under 200ms, B is 200-500ms, C is 500-1000ms, D is 1-2 seconds, F is over 2 seconds. Pages scoring C or below are worth investigating for server-side bottlenecks.
How many samples should I run?
3 samples (the default) is enough for most checks. Use 5-10 if you need tighter averages or are testing across variable network conditions.
Can this actor check JavaScript-rendered pages?
It measures raw HTTP response time, not the full browser render time. Single-page apps will show a fast initial response because the actor does not wait for client-side JavaScript to execute.
How many URLs can it process per run?
Up to 1,000 per run (controlled by maxUrls). For larger batches, run multiple actor instances or schedule them.
Why does DNS time vary between runs?
DNS is measured from the machine running the actor, which has its own resolver and cache state. Treat DNS times as relative indicators rather than exact user-facing values.
What happens if a URL fails?
The actor records the error and moves on to the next URL. Failed URLs appear in the dataset with an error field instead of timing data.
Integrations
Connect Response Time Profiler with other apps and services using Apify integrations. You can integrate with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and many more. You can also use webhooks to get notified when results are ready.
SEO teams often pipe results into Google Sheets for trend tracking, or run the actor on a schedule to catch performance regressions before clients notice.



