API Documentation
The Firehouse Solutions Application Programming Interface (API) gives your developers
read-only access to your website data as JSON over HTTPS. Nothing can be created,
changed, or deleted through the API. Use it to feed station display boards, mobile apps, reporting tools, or any
in-house software with live data from your website: news stories with photos, calendar events, training records,
member rosters, custom databases, and more.
Getting Started
The API is available to every Firehouse Solutions website, but it must first be
activated for your website by the Firehouse Solutions team. Contact
Support@FirehouseSolutions.com to request activation.
Once the API is active, a website manager creates an
API Project in the Members Area under Manage > API. Each project receives its own
refresh token and its own settings: status, allowed endpoints, and IP address lockdown. Create one project per
application so each can be monitored and revoked independently.
All calls go to your own website's address. Throughout these pages, replace
the example domain with your department's domain.
Base Address
https://www.YourDepartment.com/apps/api/
Quick Start
1. POST your project's refresh token to the refresh endpoint to receive an access token:
POST https://www.YourDepartment.com/apps/api/refresh/
Authorization: Bearer {refresh_token}
2. GET any data endpoint with the access token from that response:
GET https://www.YourDepartment.com/apps/api/announce/?MaxRows=5
Authorization: Bearer {access_token}
That is the whole flow. The access token lasts 24 hours; when it expires, repeat step 1. The sections below cover the details.
Authentication
Authentication uses two tokens:
1. Refresh Token - created with your API Project, valid for
1 year. Keep it secret; treat it like a password.
2. Access Token - obtained from the refresh endpoint, valid for 24 hours.
Send it on every data request in the Authorization header: Authorization: Bearer {access_token}
Obtain an access token
| HTTP Request Type | POST |
| Calling URI | https://www.YourDepartment.com/apps/api/refresh/ |
| Request Header | Authorization: Bearer {refresh_token} |
| Request Body | None required; the refresh token travels in the header |
Response JSON structure
{
"status": 200,
"endpoint": "refresh",
"domain": "www.YourDepartment.com",
"project": "Your Project Name",
"token_type": "Bearer",
"access_token": "d99ce419-53b8-40f2-a747-...",
"expires_in": 86400,
"access_token_expire": "2026-09-06 14:00:00"
}
Security
Token Regeneration - regenerate a project's refresh token at any time; all active access tokens are revoked immediately.
Failed-Authentication Lockout - 10 failed token requests from one IP within 10 minutes blocks that IP for 60 minutes.
IP Address Lockdown - each API Project lists the IP addresses allowed to use it; all other addresses receive 403.
Endpoint Access - limit a project to specific endpoints.
Throttling - each project is limited to 30 calls per minute and
5000 calls per day. Exceeding a limit returns 429 with a Retry-After header. Check your
consumption anytime on your API Project statistics page.
Call Logging - every call (including failures) is logged for 90 days and shown on your API Project statistics page.
Passwords - passwords and account credentials are never available through the API.
Responses
Every successful data response uses this JSON structure. Some endpoints add extra
properties (noted per endpoint), and items holds the records:
{
"status": 200,
"endpoint": "announce",
"domain": "www.YourDepartment.com",
"generated": "2026-09-06 09:15:00",
"startRow": 1,
"maxRows": 100,
"count": 2,
"totalCount": 57,
"items": [ { ... }, { ... } ]
}
count is the number of records in this response;
totalCount is all matching records regardless of paging. Page with StartRow and MaxRows until
count + startRow exceeds totalCount.
Common parameters (all data endpoints)
| Parameter | Description |
StartRow | First row to return (1-based). Combine with MaxRows to page through results. |
MaxRows | Rows to return. Default 100, maximum 1000. |
Response Codes
| Code | Meaning |
| 200 OK | Success; JSON body returned |
| 400 Bad Request | A parameter is invalid |
| 401 Unauthorized | Missing, invalid, or expired token |
| 403 Forbidden | API or project disabled, refresh token expired, HTTPS not used, IP address not allowed, or endpoint not allowed |
| 404 Not Found | The requested record or endpoint does not exist |
| 405 Method Not Allowed | Wrong HTTP request type (data endpoints are GET only) |
| 429 Too Many Requests | Throttle limit reached; retry after the Retry-After header |
| 500 Internal Server Error | Unexpected failure; automatically reported to Firehouse Solutions |
Every failure code returns this JSON structure. Branch on the machine-readable
code value, not the message text:
{
"status": 401,
"error": "Unauthorized",
"code": "token_expired",
"message": "Access token expired. Request a new one from /apps/api/refresh using your refresh token."
}
Error codes
| Status | code | Cause |
| 400 | invalid_parameter | A parameter is non-numeric, a date is invalid or reversed, or MaxRows / StartRow is out of range |
| 401 | token_missing | The Authorization header is missing |
| 401 | token_invalid | The supplied token is not recognized |
| 401 | token_expired | The access token has expired; request a new one from the refresh endpoint |
| 401 | refresh_token_supplied | A refresh token was sent to a data endpoint; data endpoints need an access token |
| 403 | api_disabled | The API is not enabled for the website |
| 403 | https_required | The request was made over plain HTTP |
| 403 | project_disabled | The API Project's status is Disabled |
| 403 | refresh_expired | The refresh token has passed its expire date; regenerate it on the API Project page |
| 403 | ip_not_allowed | The caller's IP address is not on the API Project's allowed list |
| 403 | endpoint_not_allowed | Endpoint Access excludes the endpoint called |
| 404 | not_found | An ID was requested that does not exist or is not available |
| 404 | unknown_endpoint | The URI is not an endpoint |
| 405 | method_not_allowed | Wrong HTTP request type for the endpoint |
| 429 | rate_limited | A throttle limit was reached; wait the number of seconds in the Retry-After header |
| 429 | too_many_failures | 10 or more failed token requests from one IP within 10 minutes; the IP is blocked for 60 minutes |
| 500 | server_error | Unhandled exception; details are reported to Firehouse Solutions automatically |
Data Endpoints
All data endpoints are HTTP GET and require the
Authorization: Bearer {access_token} header. All accept the common StartRow and MaxRows parameters.
Click an endpoint for its parameters, response properties, and a sample request and response.
| Endpoint | Description |
Announcements /apps/api/announce/ |
Announcements in any status. The default listing is unexpired only; All=1 includes expired announcements. |
Calendar /apps/api/calendar/ |
Events on the members-area calendar, in any status. Defaults to today through the next 30 days; All=1 lists every event with no date window. |
Databases /apps/api/databases/ |
Member-built custom databases. Without DatabaseID, lists the databases. With DatabaseID, returns that database's records with every field; archived records are included and flagged. |
Discussion Forum /apps/api/discuss/ |
Forum topics in any status. Pass ID to get a single topic with its replies (returned in items[]; the topic itself is returned in a topic object). |
Document Library /apps/api/documents/ |
Documents in any status with their categories and attached files. |
Public Events /apps/api/events/ |
Public events in any status. Without a date range, returns current and upcoming events; All=1 lists every event past and future. |
Guestbook /apps/api/guestbook/ |
Guestbook entries in any status. |
Meeting Minutes /apps/api/minutes/ |
Meeting minutes in any status with their categories and attached files. |
News /apps/api/news/ |
All news stories, deployed or not, with their photos, attachments, and videos. |
Online Members /apps/api/members/ |
The active member roster: rank, member type, three phone numbers with types, email, and mailing address. |
Rental Calendar /apps/api/rental/ |
Facility rental bookings with renter details. Defaults to today through the next 90 days; All=1 lists every booking with no date window. The response also includes a rentalTypes array for mapping TypeID. |
Sign Up Sheets /apps/api/signup/ |
Sign up sheets in any status. Pass ID for one sheet's groups, slots and who has signed up (groups are returned in items[]; the sheet itself in a sheet object). |
Training /apps/api/training/ |
Training Center data in any status. The Type parameter selects the record set. Items restricted to specific members are excluded. |
Questions about the API? Contact us at
Support@FirehouseSolutions.com.
|