Developers
Public data API
The contract is OpenAPI 3.1. Responses use { data, nextCursor, meta: { version: "v1" } }. Errors use { error: { code, message }, meta }.
Every record includes sourceUrl, lastVerifiedAt, and updatedAt. Directory records use a stable public id in id. Events, fish fries, and articles use the slug. Draft and retired records are left out. Email and phone are left out unless that record is marked public contact. Article responses include the title, summary, date, and link. They do not include the article body. Fish-fry phone numbers are not in this API. Long text fields stop at 4,000 characters.
Keys and limits
Send a key as Authorization: Bearer gt_… or X-API-Key. If both are set, Authorization is used. Payload user API keys (users API-Key) are rejected. A missing, unknown, revoked, or suspended key fails on the next request. Anonymous calls need no key.
- Anonymous: 20 requests a minute and 200 a day, per IP address.
- Free key: 60 requests a minute and 1000 a day.
- Paid keys are not offered yet. A key marked paid still uses the free limits.
Over the limit, the API returns 429 with Retry-After and X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Responses are not shared-cached, so each call is counted. Other methods return 405.
curl -H "Authorization: Bearer gt_your_key" "https://greensburgtimes.com/api/v1/organizations?limit=25"Lists default to 25 records and stop at 100. Pass cursor from nextCursor to read the next page.
MCP
The same data is available as a read-only MCP server at POST /api/public-mcp. It uses these keys and limits. Each tool call counts as one request. Setup for Claude Desktop, Cursor, and a generic Streamable HTTP client is on the MCP connection guide.
Routes
GET /api/v1— List the resources in this version.GET /api/v1/openapi.json— OpenAPI 3.1 document for this version.GET /api/v1/events— List events.GET /api/v1/events/search— Search events.GET /api/v1/events/{id}— Get one event by slug.GET /api/v1/fish-fries— List fish fries.GET /api/v1/fish-fries/search— Search fish fries.GET /api/v1/fish-fries/{id}— Get one fish fry by slug.GET /api/v1/officials— List officials.GET /api/v1/officials/search— Search officials.GET /api/v1/officials/{id}— Get one official by slug or public id.GET /api/v1/organizations— List organizations.GET /api/v1/organizations/search— Search organizations.GET /api/v1/organizations/{id}— Get one organization by slug or public id.GET /api/v1/venues— List venues.GET /api/v1/venues/search— Search venues.GET /api/v1/venues/{id}— Get one venue by slug or public id.GET /api/v1/businesses— List businesses.GET /api/v1/businesses/search— Search businesses.GET /api/v1/businesses/{id}— Get one business by slug or public id.GET /api/v1/articles— List articles.GET /api/v1/articles/search— Search articles.GET /api/v1/articles/{id}— Get one article by slug.
Version
curl https://greensburgtimes.com/api/v1events
Published community events. Ordered by start date, then slug.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality of the linked venue. Events with no venue are left out of this filter.
- type. Event type slug.
- from and to. Events that overlap the range. from keeps an event that has not ended before it. to keeps an event that starts on or before it.
- Get one by slug:
/api/v1/events/{id}
List events
curl "https://greensburgtimes.com/api/v1/events?municipality=Greensburg&from=2026-11-01&to=2026-12-31&limit=25"Search events
curl "https://greensburgtimes.com/api/v1/events/search?q=council"Get one event
curl https://greensburgtimes.com/api/v1/events/council-meetingfish fries
Active fish fries. Ordered by slug. Phone numbers are not included.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality name, for example Greensburg.
- type. parish, vfd, club, restaurant, or other.
- Get one by slug:
/api/v1/fish-fries/{id}
List fish fries
curl "https://greensburgtimes.com/api/v1/fish-fries?municipality=Greensburg&type=parish&limit=25"Search fish fries
curl "https://greensburgtimes.com/api/v1/fish-fries/search?q=grace"Get one fish fry
curl https://greensburgtimes.com/api/v1/fish-fries/our-lady-of-graceofficials
Published officials. Ordered by slug. The id is the public id.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality name, for example Greensburg.
- governingBody. Exact name, for example Westmoreland County Board of Commissioners.
- from and to. lastVerifiedAt is on or after from and on or before to. A day (2026-11-01) is that UTC day.
- Get one by slug or public id:
/api/v1/officials/{id}
List officials
curl "https://greensburgtimes.com/api/v1/officials?municipality=Greensburg&governingBody=Westmoreland%20County%20Board%20of%20Commissioners"Search officials
curl "https://greensburgtimes.com/api/v1/officials/search?q=Kertes"Get one official
curl https://greensburgtimes.com/api/v1/officials/sean-kertesorganizations
Published organizations, agencies, schools, and nonprofits. Ordered by slug.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality name, for example Greensburg.
- type. government, agency, school, nonprofit, church, club, or other.
- from and to. lastVerifiedAt is on or after from and on or before to. A day (2026-11-01) is that UTC day.
- Get one by slug or public id:
/api/v1/organizations/{id}
List organizations
curl "https://greensburgtimes.com/api/v1/organizations?municipality=Greensburg&type=government&limit=25"Search organizations
curl "https://greensburgtimes.com/api/v1/organizations/search?q=commissioners"Get one organization
curl https://greensburgtimes.com/api/v1/organizations/westmoreland-countyvenues
Published venues. Ordered by slug.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality name, for example Greensburg.
- type. hall, park, school, church, government, outdoor, or other.
- from and to. lastVerifiedAt is on or after from and on or before to. A day (2026-11-01) is that UTC day.
- Get one by slug or public id:
/api/v1/venues/{id}
List venues
curl "https://greensburgtimes.com/api/v1/venues?municipality=Latrobe&type=other"Search venues
curl "https://greensburgtimes.com/api/v1/venues/search?q=library"Get one venue
curl https://greensburgtimes.com/api/v1/venues/adams-memorial-librarybusinesses
Published businesses. Ordered by slug.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- municipality. Exact municipality name, for example Greensburg.
- type. Directory category, for example restaurant. Exact match.
- from and to. lastVerifiedAt is on or after from and on or before to. A day (2026-11-01) is that UTC day.
- Get one by slug or public id:
/api/v1/businesses/{id}
List businesses
curl "https://greensburgtimes.com/api/v1/businesses?municipality=Greensburg&type=restaurant"Search businesses
curl "https://greensburgtimes.com/api/v1/businesses/search?q=hardware"Get one business
curl https://greensburgtimes.com/api/v1/businesses/example-hardwarearticles
Published articles. Title, summary, and link only. The body is not included. Ordered by published date, newest first.
- limit, default 25, maximum 100.
- cursor, the previous nextCursor.
- type. Article category slug.
- from and to. publishedAt is on or after from and on or before to. A day (2026-11-01) is that UTC day.
- Get one by slug:
/api/v1/articles/{id}
List articles
curl "https://greensburgtimes.com/api/v1/articles?type=government&from=2026-01-01&to=2026-12-31"Search articles
curl "https://greensburgtimes.com/api/v1/articles/search?q=budget"Get one article
curl https://greensburgtimes.com/api/v1/articles/example-brief