GasBuddy Scraper: Fuel Prices, Stations & Reviews
Pricing
from $1.00 / 1,000 station results
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
Maintained by CommunityActor 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
| Coverage | United States and Canada |
| Grades | Regular, Midgrade, Premium, Diesel, E85, UNL88 (E15) |
| Per grade | cash price, credit price, formatted price, member discount, reported-at timestamp, reporting member |
| Station | id, name, brand, brand logo, address, city, state, postal code, country, latitude, longitude, phone |
| Extras | amenities, opening status and hours, star rating, ratings count, reviews, top price spotters, member discount offers, card payment availability, outage flag |
| Area context | the city, state and country price trend GasBuddy publishes beside the station (today's average, today's low, direction) |
| Change tracking | changeType, changedFields, firstSeenAt, lastSeenAt |
Modes
Search by location. List one or more areas under Locations. Each entry can be:
| Entry | What it does |
|---|---|
78701 | every station in that postal code |
Austin, TX | every station the site indexes for that city |
Texas | a state-wide sweep |
30.2672,-97.7431 | a 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
| Input | What it narrows |
|---|---|
| Fuel brands | Shell, Costco, BP, ... checked against GasBuddy's own brand list, so a typo is reported by name instead of silently returning everything |
| Fuel grade | which grade GasBuddy ranks the area by; every grade the station sells is still returned |
| Maximum price age | only stations whose price was confirmed in the last 4 / 8 / 12 / 24 / 36 / 48 hours |
| Minimum / maximum price | on the station's cheapest reported price |
| Minimum star rating | member rating |
| Required amenities | keeps only stations that have all of the amenities you pick |
| Open right now only | current opening status |
| Only stations with a reported price | drops stations nobody has priced |
| Max distance (miles) | coordinate searches only |
Every input, in one table
| Section | Input | Default |
|---|---|---|
| Mode | What do you want to scrape? | search |
| Search mode | Locations | (empty) |
| URL mode | Station or search links | (empty) |
| Filters | Fuel brands | (any) |
| Filters | Fuel grade | Regular |
| Filters | Maximum price age (hours) | Any age |
| Filters | Minimum price | (none) |
| Filters | Maximum price | (none) |
| Filters | Minimum star rating | (any) |
| Filters | Required amenities | (none) |
| Filters | Open right now only | off |
| Filters | Only stations with a reported price | off |
| Filters | Max distance (miles) | (none) |
| Output | Include member reviews | off |
| Output | Max reviews per station | 10 |
| Output | Max stations | 20 |
| Output | Max pages per location | 0 (walk to the end) |
| Resume | Resume from a previous run | (none) |
| Resume | Incremental mode (track price changes between runs) | off |
| Resume | State key | derived from the search |
| Resume | Also return unchanged stations | off |
| Resume | Also return stations that disappeared | off |
| Connection | Connection | Apify 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.
| Label | Meaning |
|---|---|
NEW | first time this station appeared in this search |
UPDATED | something changed; changedFields names what |
UNCHANGED | nothing moved. Suppressed by default, so you are not billed for it |
REAPPEARED | it was gone, and it is back |
EXPIRED | it 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
| Event | When |
|---|---|
| Actor start | once per run, per GB of memory |
| Station result | each station returned in the dataset |
| Extra review pages | once 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
UPDATEDrow withchangedFields. - 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 withcurrency: CADandpriceUnit: cents_per_liter, so no Canadian exit is needed. brandis null for an unbranded independent station. GasBuddy indexes them with an empty brand list, and a wide sweep will reach them.nameis always populated.hoursis not published for every station.openStatusis, 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 -qapify 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.