GasBuddy Fuel Prices — Drop-in, No Proxy Needed
Pricing
from $1.00 / 1,000 station with prices
GasBuddy Fuel Prices — Drop-in, No Proxy Needed
Drop-in compatible with memo23/gasbuddy-fuel-prices-scraper — half the cost, no CAPTCHA fee. US & Canada gas-station prices from GasBuddy: every grade incl. E85 and UNL88, cash and credit, posted time, brands, ratings, offers, phone, coordinates, area price trends. Batch many ZIPs per run. No proxy.
Pricing
from $1.00 / 1,000 station with prices
Rating
0.0
(0)
Developer
DIOPSIDE AI
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
GasBuddy Fuel Prices Scraper ⛽
Drop-in compatible with memo23/gasbuddy-fuel-prices-scraper — less than half the cost per run, and no CAPTCHA fee.
Gas-station fuel prices from GasBuddy across the US and Canada: every grade a station reports
(Regular, Midgrade, Premium, Diesel, E85 and UNL88), cash and credit, the time each price was
posted, plus brands, ratings, offers, Pay-with-GasBuddy availability, outage status, phone,
coordinates, and the city / state / national price trend the station sits in.
Batch dozens of ZIP codes or cities in one run. No residential proxy. No headless browser. No CAPTCHA solver.
Why this one
The leading GasBuddy actor charges $0.07 per run start to cover, in its own words, "a managed CAPTCHA solve + residential proxy", on top of $0.0015 per station — and still fails about 16% of its public runs.
None of that is necessary. GasBuddy gates on the TLS fingerprint, not the exit IP: a Chrome
fingerprint gets a clean 200 from a plain datacenter IP where curl and requests get
Cloudflare's "Just a moment…". The 429 that follows about 15 requests is counted per
connection — not per IP and not per cookie — so a free reconnect resets it. This actor was built
from those two measurements, and prices accordingly.
| This actor | memo23/gasbuddy-fuel-prices-scraper | |
|---|---|---|
| Run start | $0.00005 | $0.07 |
| Per station | $0.001 | $0.0015 |
| 100-station run | $0.10 | $0.22 |
| Proxy | none needed | residential, mandatory |
| Grades | 6 — incl. E85, UNL88 | 4 |
| Price freshness filter | yes, on the posted time actually read | no |
| Brand filter | yes, resolved from GasBuddy's live brand table | no |
| Canada | yes (CAD, cents/litre) | US only |
| Station phone / coordinates | yes | no |
| Area price trends | yes (city, state, national) | no |
| Unreported grade | null | — |
Switching from memo23/gasbuddy-fuel-prices-scraper
Change the actor id. Nothing else. The search, fuel, lat, lng, maxStationsPerSearch,
maxPages, maxItems and maxRetries inputs have the same names and meanings, proxy is still
accepted as an alias for proxyConfiguration, and every output field that actor emits is emitted
here under the same name and in the same shape. The new fields are added alongside; nothing is
renamed.
You can delete the proxy block while you are there — this actor does not need one.
📥 Input
| Field | Type | Description |
|---|---|---|
search | array | Locations — US ZIP codes, city names, "city, ST", Canadian cities. One run covers every entry. |
fuel | select | Grade that drives GasBuddy's ranking — Regular (default), Midgrade, Premium, Diesel, E85, UNL88. Every grade is still returned per station regardless. |
brand | string | New. Only stations of one brand, e.g. "Costco", "Shell". Matched against GasBuddy's own 663-brand table, read at run time. |
maxPriceAgeHours | integer | New. Drop stations whose newest price is older than this. Skipped stations are not charged for. |
includeStationsWithoutPrices | boolean | New. Keep stations nobody has posted a price for. Off by default; those rows are never charged for when dropped. |
lat / lng | number | Optional coordinate search (provide both). Also fills distance on every row. |
maxStationsPerSearch | integer | Cap per search location. Default 100. |
maxPages | integer | Cap on cursor pages per location. Default 10 (≈20–25 stations per page). |
maxItems | integer | Hard cap on total rows. Default 1000. |
maxRetries | integer | Retries per request, each on a fresh connection. Default 5. |
maxRequestsPerMinute / maxConcurrency | integer | Politeness controls. Default 60 / 2. |
proxyConfiguration | proxy | Optional and off by default — see above. Also accepted as proxy. |
{"search": ["Austin, TX", "90210", "Toronto, ON"],"fuel": "Regular","maxStationsPerSearch": 50,"maxPages": 3,"maxItems": 500}
A note on ZIP searches
A ZIP search returns only stations inside that ZIP boundary. Dense urban ZIPs legitimately
have none — 10001 (Manhattan) really does contain zero gas stations, on gasbuddy.com as much as
here. Use "New York, NY" or a lat/lng pair for a radius search.
📤 Output
One flat row per station; prices nested under prices, keyed by grade, and mirrored into flat
regularPrice / midgradePrice / … columns so the CSV export needs no post-processing.
{"searchTerm": "Austin, TX","primaryFuel": "Regular","stationId": "81445","name": "Valero","brand": "Valero","brands": [{ "brandId": 142, "name": "Valero", "imageUrl": "https://images.gasbuddy.io/b/142.png", "brandingType": "fuel" },{ "brandId": 32, "name": "Circle K", "imageUrl": "https://images.gasbuddy.io/b/32.png", "brandingType": "cstore" }],"address": {"line1": "1706 E William Cannon Dr", "line2": null, "city": "Austin","state": "TX", "postalCode": "78744", "country": "US","full": "1706 E William Cannon Dr, Austin, TX, 78744"},"distance": null,"starRating": 3.8,"ratingsCount": 43,"payAvailable": true,"offers": [{ "id": "H581445-2-0", "types": ["gasbuddy"], "use": ["strike", "sort"],"highlight": "Flash Deal: Save 2¢ per gallon","discounts": [{ "grades": ["regular_gas", "diesel"], "pwgbDiscount": 0.02, "receiptDiscount": null }] }],"emergencyStatus": { "hasGas": null, "hasDiesel": null, "hasPower": null },"hasActiveOutage": false,"enterprise": false,"fuels": ["regular_gas", "diesel"],"priceUnit": "dollars_per_gallon","prices": {"Regular": {"fuelProduct": 1, "grade": "Regular", "cash": null,"credit": { "price": 3.49, "formattedPrice": "$3.49", "postedTime": "2026-09-22T03:24:00.328Z", "member": "DataFeed" },"discount": 0}},"searchCentroid": { "displayName": "Austin, TX", "latitude": 30.2989, "longitude": -97.7643, "regionCode": "TX", "countryCode": "US" },"stationUrl": "https://www.gasbuddy.com/station/81445","phone": "512-444-0405","latitude": 30.18937248975,"longitude": -97.767173051834,"countryCode": "US","currency": "USD","regularPrice": 3.49,"midgradePrice": null,"premiumPrice": null,"dieselPrice": null,"e85Price": null,"unl88Price": null,"pricesUpdatedAt": "2026-09-22T03:24:00.328Z","priceAgeHours": 1.87,"areaTrends": {"city": { "areaName": "Austin", "today": 3.89, "todayLow": 3.49, "trend": "down" },"region": { "areaName": "Texas", "today": 3.96, "todayLow": 3.25, "trend": "up" },"country": { "areaName": "United States", "today": 4.46, "todayLow": 0, "trend": "up" }},"scrapedAt": "2026-09-22T05:16:19Z"}
Export as JSON, CSV or Excel from the run's dataset.
null is not $0.00
GasBuddy returns an entry for every grade a station sells, and fills the ones nobody has
reported with price: 0 and formattedPrice: "- - -". Those are absences, not observations. This
actor emits them as null and leaves the grade out of prices — passed through verbatim they
read as diesel at $0.00 and quietly drag down any market average a buyer computes.
⚙️ How it works
GasBuddy serves its stations and prices from one GraphQL operation, LocationBySearchTerm, behind
three gates. This actor clears all three with plain HTTP:
- Cloudflare TLS fingerprinting.
curlandhttpxget403 cf-mitigated: challengeon the first request from any IP.curl_cffiwith a Chrome fingerprint gets200from the same IP in the same second — no challenge, nocf_clearance, no CAPTCHA. - An Apollo CSRF preflight. Without the
apollo-require-preflightheader,/graphqlanswers400 Bad Requestas 11 bytes of plain text — which looks like a block and is not one. Thegbcsrftoken the site's own page carries is minted per session and sent alongside it. - A per-connection rate limit. After ~15 calls the endpoint answers
429. Re-minting the token does not clear it; replaying the cookie in a new session does not trigger it; a new connection from the same IP in the same second is clean. So the counter is on the connection. The actor retires each connection at 12 calls and rotates instantly on a429— which costs a TCP handshake, not a residential IP.
Pagination follows GasBuddy's own stations.cursor.next, stations are de-duplicated by id across
overlapping searches so a shared station is never charged for twice, and a location that fails
does not take the rest of the run with it — what was collected is kept and the failure is named in
the run's status message.
💵 Pricing
Pay per event: $0.00005 per run start and $0.001 per station row. You pay for stations you actually receive — stations skipped as priceless, stale, or as duplicates of one already returned are never charged for. No monthly rental, no per-grade multiplication: one run returns every grade.
A 100-station run is $0.10.
❓ FAQ
Do I need a proxy? No. Leave proxyConfiguration off. GasBuddy gates on the TLS fingerprint
and rate-limits per connection, so an exit IP buys nothing here. The input is still there if your
network needs one.
Which grades come back? All six GasBuddy reports — Regular (87), Midgrade (89), Premium
(91–93), Diesel, E85 and UNL88 (E15) — per station, in one pass. The fuel input only sets which
stations GasBuddy ranks and returns first.
Does it work in Canada? Yes. Canadian stations come back with countryCode: "CA",
currency: "CAD" and priceUnit: "cents_per_liter".
Can I scrape many cities at once? Yes — that is the point. Put every ZIP and city in search;
one run covers them all and de-duplicates by station id.
Why did my ZIP return nothing? A ZIP search covers only stations inside that ZIP. See the note under Input.
How fresh are the prices? Each observation carries its own postedTime, and every row carries
priceAgeHours for its newest price. Use maxPriceAgeHours to keep only recent ones — it filters
on the time actually read from the station, not on GasBuddy's own maxAge parameter, which their
API accepts and does not apply.
Public, non-personal listing data only: station prices, locations and brands. Member and account
pages, which robots.txt disallows, are not touched.