Trace redirect chains and expand short URLs without executing browser scripts
Short URL Resolver & Scraper follows server-side HTTP redirects and expands shortened or obfuscated links without running page JavaScript. It records every hop with HTTP status codes, preserves tracking parameters, flags redirect loops and HTTPS→HTTP downgrades, and returns the final destination URL. Use it to sanitize URL lists before ingestion — not to scrape destination HTML.
Open Short URL Resolver & Scraper on Apify
HTTP unshortening, not HTML extraction
Use this page when the job is expanding bit.ly, t.co, tinyurl, goo.gl, ow.ly, buff.ly, lnkd.in, or custom HTTP shorteners and inspecting the hop path. Use Website Content Extractor after you have a final docs, pricing, product, or policy URL. Use Article Content Extractor after you have a final news, blog, or press URL. Those Actors fetch page HTML. This one does not.
| This Actor | Website Content Extractor | Article Content Extractor | |
|---|---|---|---|
| Intent | Expand short/obfuscated links and log the HTTP redirect chain | Clean docs, product, pricing, policy, and help-center HTML | Parse news, blog, newsroom, and press article pages |
| What it reads | Server-side HTTP redirects only — no browser scripts | Live page HTML | Live article HTML |
| Primary input | urls (max 1000 shortened URLs) |
Site page URLs (max 200) | Article-shaped page URLs (max 300) |
| Primary output | Final URL, hop chain, hop count, loop and HTTPS-downgrade flags, status | Cleaned markdown or text plus page metadata | Article body, byline, date, excerpt, hero image |
| JavaScript redirects | Not followed (meta refresh, window.location) |
HTML cleanup, not a redirect resolver | HTML cleanup, not a redirect resolver |
If the URLs are still publisher feed items or Google News queries, start with RSS & Atom Feed Extractor or Google News Scraper, then resolve any short links here before HTML cleanup.
Use cases
- Ad fraud analysts: detect cloaking by tracing redirect chains in ad URLs.
- Security teams: resolve phishing links without clicking, to identify payloads.
- Social media analysts: expand t.co links from X/Twitter datasets for attribution.
- SEO auditors: verify outbound shortened links resolve to intended destinations.
- Journalism / OSINT: investigate URL patterns in misinformation campaigns.
The published README also positions the Actor for sanitizing URL lists before ingestion or publishing, scheduling automated bulk link-checking, identifying broken links and insecure HTTP downgrades, and flagging toxic or suspicious domains. Developers and data engineers use it to validate data integrity before loading URLs into databases.
What does Short URL Resolver & Scraper expand?
Any HTTP-based redirect: bit.ly, t.co, tinyurl, goo.gl, ow.ly, buff.ly, lnkd.in, and custom shorteners. No special integration is required. The Actor follows server-side HTTP redirects, records every intermediate hop with HTTP status codes, preserves full URLs including UTM and tracking parameters, detects redirect loops and HTTPS-to-HTTP downgrades, and emits a final destination URL plus error or status. It does not execute page JavaScript.
Published key features: expand HTTP shorteners; log every hop with URL and status code; detect infinite or cyclic redirects; flag https→http downgrades; bulk-process up to 1,000 URLs per run; emit hop counts for ad-network and tracker analysis. README concurrency for bulk work is described as 1–20. The Store Quickstart starts with 3 demo shortened URLs; Bulk Resolve is the published 1,000-URL path (concurrency 20).
How is this different from Website Content Extractor and Article Content Extractor?
This Actor resolves shortened or obfuscated links at the HTTP layer. It does not fetch destination HTML or extract article bodies. Website Content Extractor cleans docs, pricing, product, policy, and help-center pages. Article Content Extractor cleans news, blog, and press pages. Use this Actor first when the URL is still a short link; send the final destination to an extractor when you need page text.
What input is required?
urls is required: a list of shortened URLs to resolve, maximum 1000 per run. Optional published schema fields are maxRedirects (integer, default 10), concurrency (integer, default 10), timeoutMs (integer, default 10000), delivery (dataset or webhook, default dataset), webhookUrl (when delivery is webhook), dryRun (boolean, default false), and maxChargeUsd (number, default 1). additionalProperties is false. The published input schema does not include includeSafetyAdvisory, maxRedirectChain, recordIntermediateRedirects, or abortOnLoop.
The README input table lists only urls, maxRedirects, and concurrency, and describes those hop/concurrency ranges as 1–20. The live schema does not encode min/max on those two fields. Default maxRedirects: 10 is described as safe for legitimate shorteners; increase only if needed. For bit.ly-heavy batches, the published FAQ recommends concurrency of 10 or less even though Bulk Resolve uses concurrency 20.
Published schema example:
{
"urls": [
"https://bit.ly/3LHGnWZ",
"https://tinyurl.com/2p9zf5xr"
],
"maxRedirects": 10,
"concurrency": 10,
"timeoutMs": 10000,
"delivery": "dataset",
"dryRun": false,
"maxChargeUsd": 1
}
| Field | Type | Default | Notes |
|---|---|---|---|
urls |
string[] | required | Shortened URLs to resolve (max 1000). Schema prefill: https://bit.ly/3LHGnWZ, https://tinyurl.com/2p9zf5xr |
maxRedirects |
integer | 10 | Maximum redirects to follow. README table: 1–20; schema has no min/max |
concurrency |
integer | 10 | Parallel requests. README table: 1–20; FAQ: ≤ 10 on shortener-heavy batches |
timeoutMs |
integer | 10000 | Request timeout in milliseconds (schema only) |
delivery |
string | dataset |
dataset or webhook |
webhookUrl |
string | — | POST target when delivery is webhook |
dryRun |
boolean | false | Run without saving results |
maxChargeUsd |
number | 1 | Safety cap for billable dataset rows in this run |
Run Short URL Resolver & Scraper on Apify
A schema-valid single-URL start is {"urls": ["https://bit.ly/abc"]}. Do not send unpublished aliases from older README examples.
What does a result row contain?
The published README field table lists originalUrl, finalUrl, redirectChain (string array of intermediate URLs), totalHops, hasLoop, isHttpsDowngrade, statusCode (final HTTP status), and error. The published README output example uses a chain array of hop objects with url and statusCode instead of redirectChain, and it omits statusCode and error at the top level. Treat the table plus that example as the documented shapes; the sample is an illustration, not a live coverage guarantee.
Published README sample:
{
"originalUrl": "https://bit.ly/3abcdef",
"chain": [
{"url": "https://bit.ly/3abcdef", "statusCode": 301},
{"url": "https://example.com/landing", "statusCode": 200}
],
"finalUrl": "https://example.com/landing",
"totalHops": 2,
"hasLoop": false,
"isHttpsDowngrade": false
}
The README also points to docs/sample-output.json as a representative dataset from a real run, for schema validation before you subscribe. After you confirm a final destination, send article-shaped URLs to Article Content Extractor and docs, product, or policy URLs to Website Content Extractor.
What if the short URL is dead?
The chain shows the final status code (for example, 404). hasLoop will be false; finalUrl will be the last URL reached.
Can it handle JavaScript redirects?
No — this is HTTP-level only. JS-based redirects (meta refresh, window.location) require a browser.
Is bit.ly rate-limited?
bit.ly may rate-limit aggressive requests. Use concurrency of 10 or less for safety on shortener-heavy batches.
Will this follow tracking parameters?
Yes. The full URL including UTM tags is preserved at each hop.
Will it click through tracking pixels?
It follows server-side HTTP redirects only, not JavaScript or meta-refresh redirects.
How is Short URL Resolver & Scraper priced?
Billing is pay per event. The published Store price is $8.00 / 1,000 resolved URL rows. The billed event is Resolved URL row at $0.008, charged only for one successfully delivered URL resolution row. You are not charged for Apify platform usage, only the fixed event price. maxChargeUsd defaults to 1 as a safety cap for billable dataset rows in the run.
$8.00 per 1,000 resolved URL rows ($0.008 per successfully delivered URL resolution row)
See Short URL Resolver & Scraper pricing on Apify
Limits to keep in mind
- HTTP-level only. No JavaScript redirects, meta refresh, or tracking-pixel clicks.
- At most 1,000 URLs per run.
- bit.ly may rate-limit aggressive requests; keep concurrency at 10 or below on shortener-heavy batches.
- Default
maxRedirectsis 10. Increase only if needed. - Required field is
urls. Do not send unpublished aliases such asincludeSafetyAdvisoryormaxRedirectChain. deliverydefaults to dataset; setwebhookpluswebhookUrlfor webhook delivery.dryRunskips saving results.
Open Short URL Resolver & Scraper on Apify
Related pages
- Website Content Extractor — clean the final docs, pricing, product, or policy page
- Article Content Extractor — clean the final news, blog, or press page
- RSS & Atom Feed Extractor — discover item URLs from known publisher feeds
- Google News Scraper — discover article URLs from Google News RSS queries
- Shopify App Store Review Scraper
- Apple Podcasts Scraper
- Tools