endpoint
GET https://howfar.dev/events
header X-API-Key: <your key>
parameters
all optional. combine freely.
whennatural-language date, resolved server-side:
this halloween 路 this weekend 路 tonight 路 tomorrow 路 a weekday. explicit from/to override it.fromYYYY-MM-DD, on/after this event-local date (a Sat 11pm party counts as Saturday).
toYYYY-MM-DD, on/before this event-local date.
locationcity substring, e.g.
new york. NYC-only today, here so queries read the same as more cities land.neighborhoodblanket sub-area: a granular hood (
lower east side, bushwick) or, in NYC, a borough name (brooklyn). matches either field, and not every city has boroughs.boroughexact NYC bucket if you want it precise:
Manhattan 路 Brooklyn 路 Queens 路 Bronx 路 Staten Island.genresubstring, e.g.
afrobeats, amapiano, house.max_pricedollars. compares the all-in price when the source shows one, else the advertised price. free and unknown-price events stay included.
sourcepartiful 路 posh 路 dice 路 web.sold_outfalse hides sold-out events, true returns only those.limitmax rows. default 200, cap 1000.
example
curl -H "X-API-Key: $KEY" \
"https://howfar.dev/events?location=new+york&when=this+weekend&neighborhood=brooklyn&genre=afrobeats&max_price=30"
response
{
"events": [{
"source": "partiful", "title": "...", "venue": "...",
"neighborhood": "Bushwick", "borough": "Brooklyn", "city": "New York",
"startsLocal": "2026-11-01T01:00:00-04:00", "localDate": "2026-10-31",
"priceCents": 2000, "priceIncludesFees": false, "genre": "afrobeats",
"soldOut": false, "url": "https://partiful.com/e/...",
"sources": [
{"source": "partiful", "url": "https://partiful.com/e/..."},
{"source": "dice", "url": "https://dice.fm/event/..."}
],
"lastChecked": "2026-10-31T09:00:00Z"
}],
"count": 1
}
every number either came from the source or is labeled as ours. localDate / startsLocal are the event's own wall-clock (ET for NYC), and date filters use localDate. a set that starts after midnight counts as the night before: a party at 1am on Nov 1 has a localDate of Oct 31, so "friday night" and "this weekend" catch the after-hours sets you would expect. an event posted on multiple platforms is one row, and every link lands in sources (url is the primary one).
prices
priceCentsminimum advertised price at the link, what a buyer sees going in.
priceIncludesFeeswhat that number means per source:
true (dice advertises all-in), false (posh advertises face), null (unknown).priceFaceCentsprice before fees, filled only when the source shows it.
priceAllInCentswhat the buyer actually pays, filled only when the source shows it.
priceSourceadvertised = read off the page; estimated = computed by us (not produced today).freshness
price and sold-out are re-pulled on a tiered cadence; every row carries lastChecked so you always know how current it is.
3 days or less outrechecked daily.
4 to 14 days outrechecked every 3 days.
further outrechecked weekly.
lastCheckedUTC timestamp of the most recent recheck on that row.
errors
standard HTTP codes. the body is JSON with a detail string.
200ok.
events may be an empty array when nothing matches.401missing or invalid
X-API-Key.429rate limit. back off and retry. the ceiling is generous, well above normal polling.
404the API is turned off (maintenance). rare, and announced.