Uline Products Scraper

One category URL in,
a priced row per item out.

Uline publishes its prices openly, in whole dollars, on category pages that list dozens of sizes at once. Submit one of those pages and you get a row per item - the S-number, the size in the name, and the price.

one-time 500 free rowsthen $0.002 per rowa category URL fans out to many rowsCSV · JSON · Excel
How it works

A list of URLs in, a spreadsheet out.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Uline Products Scraper.
  3. STEP 3Paste the Uline URLs you want, one per line - a category listing returns a row for every item on it, a product page returns one row.
  4. STEP 4Choose your output format (CSV / JSON / XLSX).
  5. STEP 5Run the job.
  6. STEP 6Download the results - seventeen columns per row.
What to expect

The things worth knowing before you run it.

One category URL, ninety-nine rows

Our run submitted a single reclosable-bags category page and got back 99 rows, every one reporting ok, every one with its own product URL and its own S-number. The vendor's published testing example for this service is itself a category listing, so this is the intended shape of a job rather than a trick.

The S-number is the whole identity

Every row carried an item number of the form S-1306, and all 99 were distinct. Unlike our reseller catalogues, where a vendor number and a manufacturer number sit in different columns, here sku and sku_code hold the same value on every row. Uline is its own brand, so there is one number and it is the one to order, quote and reconcile against.

Prices arrive, and the unit does not

Every product row carried parsed_price, price and currency - whole dollars, no cents. But the figure is a pack price, and the pack is not a column. On the one listing we checked directly, the amount our export holds as $90 is printed on the page as $90 per carton any quantity. The quantity is usually in the item name; read it there before comparing two rows.

The image column names the category, not the item

Worth knowing before you build a feed from it. All 100 rows of our category runs carry the same image URL, and the id inside it tracks the category rather than the item. Fetch a product page directly and you find the same URL template with the item's own S-number in it - so a per-item image exists; it is simply not what a category run returns.

Four columns came back empty on every row

brand, availability, rating and reviews were empty on all 103 rows. That is what a single-brand industrial catalogue looks like: there is no manufacturer to name because Uline is the manufacturer, and a supplier listing carries stock levels and consumer ratings far less often than a consumer store does. And description, while populated, repeats name exactly on all 99 product rows.

Nothing of ours was blocked here

Across five runs the only non-ok rows were two 404s from a placeholder address that does not exist. The vendor's catalogue records this service as done with no blocker noted, and the site's robots.txt read cleanly for us. That is a calmer picture than several of our other catalogue pages, and we would rather say so than imply difficulty that we did not meet.

What you get back

Seventeen columns, thirteen of them populated.

Read from a real export, in sheet order. The counts below come from our 99-row category run, so where this says a column carried a value it is describing rows we actually hold.

query
The Uline URL you submitted. On a category run this is the same value on all 99 rows, which is what groups one listing apart from another in a combined export. Keep it - with a fan-out it is the only thing tying the rows together.
sku_code
The Uline item number, of the form S-1306. Populated on all 99 rows, all distinct, and it is also a path segment of product_url, so a row can be checked against itself.
product_url
The item's own page. 99 rows, 99 distinct values - that is what makes a category run useful rather than merely long. The item number and a readable size description are both in the path.
name
The item as the listing prints it, with the dimensions and the gauge in the text - 12 x 15" 4 Mil Reclosable Bags. Since the pack quantity is not its own column, the name is where you read what a price refers to.
description
Populated on every product row - and on all 99 it is identical to name. A category listing has no longer text to give, so do not budget for prose here.
parsed_price
The price as a bare number. Populated on all 99 rows. This is the one to compute on, bearing in mind the note below about what the figure covers.
price
The same price as displayed, with the symbol, in whole dollars - Uline's listings did not carry cents in our run. Use it to show what the page showed; use parsed_price to do arithmetic.
currency
The currency the price is quoted in, USD on every product row of our run. Read it rather than assuming - the same catalogue is published for other markets.
availability
Treat its absence as the listing not publishing a stock figure rather than as the item being unavailable.
rating
An industrial supply listing aimed at buyers does not generally carry consumer ratings.
reviews
Intended to carry the review count, with the same caveat as rating.
images
The listing's images. One URL per row in our run - no semicolon splitting needed - and see the note below: on a category run that URL identifies the category rather than the item.
brand
Uline sells under its own name, so there is no separate manufacturer to record. If you are merging this with a multi-brand catalogue, fill the column yourself at import.
sku
The item number again. On every row we hold it is the same value as sku_code - unlike our reseller catalogues, where the two columns deliberately carry different numbering. Use either.
url
The address the row was produced from. On our category run this equalled product_url rather than query - the row points at its own item, not at the listing it came from.
image
The primary image on its own. Identical to images on every row we hold, since Uline returned a single image per row.
status
A per-row flag written by our exporter, not by Uline. Across our five runs it took two values: ok on 101 rows and http 404 on 2, the latter from a placeholder address that does not exist. Reconcile on this column rather than on row count.

Seventeen columns per row · CSV, JSON or Excel

Two practical notes. First, on the price. Every product row carried a number, a formatted price and a currency, which makes this one of the few catalogues in this family whose money columns arrive full - but the figure is a pack price and the pack is not a column of its own. On the one item we checked against the live page, the amount our export holds as $90 is printed there as $90 per carton any quantity, and the quantity itself sits in the item name. Compare two rows on price alone and you may be comparing a carton of 500 against a carton of 1,000. Second, on the image. All 100 rows of our category runs carry one identical image URL whose embedded id tracks the category, not the item; a direct fetch of a product page shows the same URL template carrying that item's own number. A per-item image exists. A category run is not where you get it.

Common workflows

What a priced category is good for.

Supply cost tracking

Price a whole packaging category weekly

One URL returned 99 priced rows in our run, so a weekly sweep of the categories you actually buy from is a small job that produces a real price series. Keep sku, parsed_price and the date, and a price change announces itself.

Procurement · Monitoring
Quote checking

Reconcile a quote against the list price

The S-number is the same identifier Uline uses on a quote and an invoice, and it arrived on every row. Line your purchase records up against a category export and the discount you are actually getting stops being a matter of memory.

Purchasing · Records
Size laddering

Find the size that costs least per unit

A reclosable-bag category is the same product in dozens of dimensions. With the size in name and the pack price in parsed_price, one export gives you the whole ladder - provided you read the pack quantity out of the name first, since the price is per pack.

Cost analysis · Sourcing
Catalogue mirroring

Keep an internal catalogue in step

99 rows, 99 item numbers, each with its own URL. That is enough to mirror a category into an internal ordering system and re-run it monthly to catch new items and withdrawn ones - with status telling you which rows are real.

Systems · Data
Pricing

Pay only for what you actually use.

Free tier

First 500 rows are free

One time, on signup. No card, and nothing to cancel afterwards.

One-time, on signup
Rate

then $0.002 per row

Billed on rows actually returned - which matters here, because one category URL can produce a hundred rows. Our 99-row run cost 99 rows, not one.

Billed on rows returned
No subscription

Nothing recurring

Credits do not expire on a monthly cycle. Sweep your categories at quarter end and nothing in between if that is the shape of the work.

No monthly expiry
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Register
Pairs well with

Other suppliers, the same seventeen columns.

The legal bit

Is it legal to scrape Uline?

List prices and item numbers on a public catalogue page are ordinary commercial facts. The caveats worth naming here are about rate and about what the price actually means.

A price, an item name and a catalogue number are facts about goods offered for sale. Reading them from a page served to any visitor is the same activity a buyer performs by hand, at a useful speed. Nothing in the seventeen columns describes a person: no name, no email address, no phone number, no account - so the data-protection questions that shape our people-facing services do not arise here. Nor is anything behind a login: Uline publishes its list prices openly, which is precisely why this export has a full price column when several of our other supplier pages do not.

Two things are specific to this site, and neither is an obstacle so much as a caution. The first is rate: a category URL that returns ninety-nine rows is one request doing a lot of work, so we run at a considerate pace and you should schedule accordingly rather than treating a fan-out as a free multiplier. The second is interpretation. The price is per pack, and the pack quantity is in the item name rather than in a column - so a comparison built on the price column alone can be a comparison of two different quantities. That is a caveat about your analysis rather than about the site. For completeness: none of our runs here were blocked, the vendor's catalogue records no blocker for this service, and the site's robots.txt read cleanly for us.

Our own terms are the same as on every other service here. Publicly available pages only, nothing behind a login, no third-party trackers on the data layer, and exports auto-delete after 30 days. Your first 500 rows are free and need no credit card.

livescraper.app · what shapes a run
A category URL can become a hundred rows
Prices are published openly, in whole dollars
The price is per pack - the quantity is in the name
Anonymous access only
Exports auto-delete after 30 days
No run of ours was blocked; the only non-ok rows came from a placeholder URL.
Common questions

What people ask before signing up.

Can I submit a category URL instead of individual products?+
Yes, and that is the intended use. Our run submitted one reclosable-bags category page and received 99 rows - all reporting ok, all sharing the same query, each with its own product URL and item number. The vendor's published testing example for this service is itself a category listing.
Does the export include prices?+
Yes. Every product row carried parsed_price, price and currency. Uline publishes its list prices on the page, so unlike some supplier catalogues there is nothing behind a login to work around.
Is the price per item or per pack?+
Per pack. On the one listing we checked against the live page, the figure our export holds as $90 is printed there as $90 per carton any quantity - and the quantity is not a column of its own. It is generally in the item name, so read it there before comparing two rows.
Why do sku and sku_code hold the same value?+
Because Uline is its own brand. On our reseller pages those two columns deliberately carry different numbering - the seller's part number and the manufacturer's. Here there is one S-number and both columns hold it, on every row.
Why is the same image URL on every row?+
Because on a category run the image identifies the category rather than the item - the id embedded in the URL tracks the listing you submitted. A per-item image does exist: fetch a product page directly and the same URL template appears carrying that item's own number. So build a feed from product URLs if the picture matters.
Which columns come back empty?+
brand, availability, rating and reviews were empty on all 103 of our rows. And while description is populated, on all 99 product rows it repeats name exactly, so do not plan on prose.
Was anything blocked?+
Not in our five runs. The only non-ok rows are two 404s from a placeholder address that does not exist. The vendor's catalogue records this service as done with no blocker noted, and the site's robots.txt read cleanly for us.
How much does it cost?+
Your first 500 rows are free, one time, no card. After that it is $0.002 per row, billed on rows actually returned. With a fan-out that is worth planning for: our single category URL produced 99 rows, and 99 rows is what it would cost.
What formats can I export?+
CSV, JSON or Excel. The seventeen columns and their order are the same in all three.

Price a category, not a product.

One category URL, a row for every item on it, with the S-number and the price on each. Your first 500 rows are free, then $0.002 each.

Activates instantly · no card required

Scrape Uline product data

Uline is a distributor of shipping, packaging and industrial supplies, and it is an unusually straightforward source to read. Prices are published openly on the category pages rather than hidden behind an account, the catalogue is single-brand, and one listing page carries dozens of sizes of the same item. Our run submitted a single reclosable-bags category URL and received ninety-nine rows, every one reporting success, every one with its own product page and its own S-number - ninety-nine rows, ninety-nine distinct item numbers. The vendor's published testing example for this service is itself a category listing, so submitting a whole shelf is the intended workflow rather than a shortcut.

The identifier story is simpler here than on our reseller pages, and it is worth knowing why. On a distributor that carries other people's products, our exports keep two numbers apart: the seller's own part number and the manufacturer's. Uline sells under its own name, so there is one number - the familiar S-1306 form - and sku and sku_code hold the same value on every row we have. That number is also a path segment of the product URL, so each row can be checked against itself, and it is the same identifier that appears on a Uline quote or invoice, which makes reconciliation against purchase records a join rather than a project.

The price column arrives full, which is not something we can say about every supplier catalogue in this family, but it needs one caveat stated plainly rather than buried. The figure is a pack price. On the one item we fetched directly from the live site, the amount our export records as ninety dollars is printed on the page as ninety dollars per carton, any quantity - and the carton quantity is not a column of its own. It generally sits in the item name, alongside the dimensions and the gauge. Compare two rows on the price column alone and you may be comparing a carton of five hundred against a carton of a thousand, so parse the name first. The same fetch corroborated the rest: the page returned successfully at around a hundred kilobytes, its title carried both the item name and the S-number exactly as our export holds them, and the price matched.

Two more things to design around. Four columns came back empty on every row - brand, availability, rating and reviews - which is what a single-brand industrial catalogue looks like: no third-party manufacturer to name, and a buyer-facing listing that carries neither stock levels nor consumer ratings. And the image column identifies the category rather than the item on a category run: all hundred rows of our category runs carry one identical image URL whose embedded id tracks the listing, while a direct fetch of a product page shows the same URL template carrying that item's own number. A per-item image exists; a category run is not where it comes from. Finally, the calm part: none of our five runs were blocked, the only non-successful rows are 404s from a placeholder address, the vendor catalogue records no blocker, and the site's robots.txt read cleanly for us. Publicly available pages only, no third-party trackers on the data layer, exports auto-delete after 30 days, and your first 500 rows are free with no credit card.