GasBuddy Scraper: Fuel Prices, Stations & Reviews avatar

GasBuddy Scraper: Fuel Prices, Stations & Reviews

Pricing

from $1.00 / 1,000 station results

Go to Apify Store
GasBuddy Scraper: Fuel Prices, Stations & Reviews

GasBuddy Scraper: Fuel Prices, Stations & Reviews

Scrape GasBuddy station by station across the US and Canada. Returns brand, address, coordinates, phone, amenities, open status, ratings and reviews, plus the current cash and credit price for every fuel grade with who reported it and when. Incremental mode tracks price changes between runs.

Pricing

from $1.00 / 1,000 station results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

GasBuddy Station and Fuel Price Scraper

Station-by-station fuel prices from GasBuddy, across the United States and Canada.

Most fuel-price datasets stop at a national or state average. This one goes down to the pump: for every station it returns the brand, the full postal address, coordinates, phone, amenities, opening status, member rating and reviews, and the current cash and credit price for every fuel grade the station sells, together with when that price was reported and which member reported it.

Turn on Incremental mode and the same search on a schedule becomes a price history: every run returns only the stations whose prices moved, with changedFields naming exactly what changed.

What you get

CoverageUnited States and Canada
GradesRegular, Midgrade, Premium, Diesel, E85, UNL88 (E15)
Per gradecash price, credit price, formatted price, member discount, reported-at timestamp, reporting member
Stationid, name, brand, brand logo, address, city, state, postal code, country, latitude, longitude, phone
Extrasamenities, opening status and hours, star rating, ratings count, reviews, top price spotters, member discount offers, card payment availability, outage flag
Area contextthe city, state and country price trend GasBuddy publishes beside the station (today's average, today's low, direction)
Change trackingchangeType, changedFields, firstSeenAt, lastSeenAt

Modes

Search by location. List one or more areas under Locations. Each entry can be:

EntryWhat it does
78701every station in that postal code
Austin, TXevery station the site indexes for that city
Texasa state-wide sweep
30.2672,-97.7431a radius search around a point, sorted by distance

Only a coordinate pair makes GasBuddy return a per-station distance, so Max distance (miles) only narrows those entries. A station with no distance is kept, never silently dropped.

Paste links. Switch mode to url and paste station addresses (https://www.gasbuddy.com/station/12345), bare station ids (12345), or a search address (https://www.gasbuddy.com/home?search=78701). A station you paste by hand is always returned, even when the filters below would have excluded it.

Splitting a big sweep across runs. Append &page=2 (or &cursor=50 for an exact row offset) to a pasted search address and the walk starts there instead of at the first result. GasBuddy's own addresses never carry a position, so this is this actor's convention, not the site's. A run that starts deeper is never treated as a complete scan, so Incremental mode can never mark the rows it was told to skip as disappeared.

Filters

InputWhat it narrows
Fuel brandsShell, Costco, BP, ... checked against GasBuddy's own brand list, so a typo is reported by name instead of silently returning everything
Fuel gradewhich grade GasBuddy ranks the area by; every grade the station sells is still returned
Maximum price ageonly stations whose price was confirmed in the last 4 / 8 / 12 / 24 / 36 / 48 hours
Minimum / maximum priceon the station's cheapest reported price
Minimum star ratingmember rating
Required amenitieskeeps only stations that have all of the amenities you pick
Open right now onlycurrent opening status
Only stations with a reported pricedrops stations nobody has priced
Max distance (miles)coordinate searches only

Every input, in one table

SectionInputDefault
ModeWhat do you want to scrape?search
Search modeLocations(empty)
URL modeStation or search links(empty)
FiltersFuel brands(any)
FiltersFuel gradeRegular
FiltersMaximum price age (hours)Any age
FiltersMinimum price(none)
FiltersMaximum price(none)
FiltersMinimum star rating(any)
FiltersRequired amenities(none)
FiltersOpen right now onlyoff
FiltersOnly stations with a reported priceoff
FiltersMax distance (miles)(none)
OutputInclude member reviewsoff
OutputMax reviews per station10
OutputMax stations20
OutputMax pages per location0 (walk to the end)
ResumeResume from a previous run(none)
ResumeIncremental mode (track price changes between runs)off
ResumeState keyderived from the search
ResumeAlso return unchanged stationsoff
ResumeAlso return stations that disappearedoff
ConnectionConnectionApify Proxy, country US (reaches Canada too)

Recurring price monitoring

Set Incremental mode on and schedule the run. The actor remembers the previous run of the same search by itself, so no run id has to be pasted anywhere.

LabelMeaning
NEWfirst time this station appeared in this search
UPDATEDsomething changed; changedFields names what
UNCHANGEDnothing moved. Suppressed by default, so you are not billed for it
REAPPEAREDit was gone, and it is back
EXPIREDit is no longer found. Only after a run that completed a full scan

Also return unchanged stations and Also return stations that disappeared both default to off, because both add extra rows and extra rows are billed like any other result.

Fields that never appear in changedFields, and why. priceTrend is an area aggregate shared by every station in a metro and recomputed continuously, so tracking it would relabel a whole city as changed with no station-level change behind it. offers carries a fresh opaque id on nearly every fetch for the same promotion. reviews and topSpotters are excluded on size, because a busy station's review corpus would not fit in the saved baseline. Nothing is lost: reviewCount, ratingsCount and starRating are all tracked, so a new review still shows up as an UPDATED station naming those fields. distance, searchTerm, searchLocation and scrapedAt describe the search you ran, not the station.

Resuming an interrupted crawl

Resume from a previous run takes one run id (or dataset id) and skips the stations that run already returned. Use it to finish one interrupted crawl. For recurring monitoring use Incremental mode instead, which needs no id at all.

Sample output (abridged)

{
"stationId": "12345",
"name": "Example Fuel",
"url": "https://www.gasbuddy.com/station/12345",
"brand": "Example Fuel",
"brandId": "99",
"addressLine1": "123 Main St",
"city": "Example City",
"state": "TX",
"postalCode": "78701",
"country": "US",
"latitude": 30.27,
"longitude": -97.74,
"openStatus": "open",
"amenities": ["C-Store", "Pay At Pump", "Air Pump"],
"fuels": ["regular_gas", "midgrade_gas", "premium_gas", "diesel"],
"prices": [
{
"fuelType": "regular",
"label": "Regular",
"cashPrice": null,
"creditPrice": 3.47,
"creditPostedAt": "2026-08-27T23:35:40.393Z",
"creditReportedBy": "member-handle",
"formattedPrice": "$3.47",
"memberDiscount": 0
},
{
"fuelType": "midgrade",
"label": "Midgrade",
"cashPrice": null,
"creditPrice": null,
"creditPostedAt": null,
"creditReportedBy": null,
"formattedPrice": null,
"memberDiscount": 0
}
],
"lowestPrice": 3.47,
"lowestPriceFuelType": "regular",
"lastPriceReportedAt": "2026-08-27T23:35:40.393Z",
"lastPriceReportedBy": "member-handle",
"priceUnit": "dollars_per_gallon",
"currency": "USD",
"starRating": 3.4,
"ratingsCount": 80,
"reviewCount": 42,
"priceTrend": [
{ "areaName": "Example City", "todayAverage": 3.5, "todayLow": 3.22, "direction": "falling" }
],
"changeType": "UPDATED",
"changedFields": ["lowestPrice", "prices"]
}

A grade nobody has priced comes back as null, never as 0. GasBuddy itself renders it as - - -, and a zero would poison any average you compute over the dataset.

The reporting member's public handle is kept because a crowd-sourced price feed is exactly what GasBuddy is, and the handle is what links a review to the price reports beside it. Member avatar images are not collected. The sample above uses placeholder handles rather than real ones.

What you are charged for

EventWhen
Actor startonce per run, per GB of memory
Station resulteach station returned in the dataset
Extra review pagesonce per station that needed an extra review request

Reviews are cheap by design: the first page of reviews for every station arrives inside the search request itself and is never charged. Only raising Max reviews per station above what that page already carries buys extra requests, and only those stations are charged.

Limits and honest caveats

  • Price history is per run, not per second. GasBuddy's public data publishes the current reported price per grade plus the area's daily average, low and direction. It does not publish a per-station time series. Incremental mode is how you build one: schedule the run, and every price move arrives as an UPDATED row with changedFields.
  • The site answers North America only. Keep the connection country set to US. A run from anywhere else is refused before it reaches any data, and the run fails with a message that says so rather than reporting an empty search. A US exit reaches the Canadian stations too: a Toronto search returns Canadian rows with currency: CAD and priceUnit: cents_per_liter, so no Canadian exit is needed.
  • brand is null for an unbranded independent station. GasBuddy indexes them with an empty brand list, and a wide sweep will reach them. name is always populated.
  • hours is not published for every station. openStatus is, and is populated far more often.
  • A postal-code search returns only the stations the site indexes inside that code, which is often a handful. Use a coordinate pair, a city, or a state for wider coverage.

Local run

python3.12 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m pytest tests -q
apify run --purge

Verification

2026-09-01: audit re-derived the live behaviour through the actor's own session harness. For an Austin, TX search the site reports 403 stations; the fuel-grade filter narrows the server count to 283 (diesel), the brand filter to 64 (Shell) and 1 (Costco), and the price-age window narrows the walked page from 50 to 25 rows. The local filters narrow monotone on returned rows: a price ceiling keeps 1 then 10 of 50, a floor keeps 49, a 4-star floor keeps 25, and a required amenity keeps 39, each row satisfying the filter. Both URL shapes verified in a cloud run: a station link returns that station and a search link starts the walk at its results.