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

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

Open Short URL Resolver & Scraper on Apify

Related pages