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. 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 optional 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/
The base address returns a catalog of the available endpoints and requires no token.
Not a customer yet? See our features overview or contact
Sales@FirehouseSolutions.com.
Authentication
Authentication uses two tokens:
1. Refresh Token - created with your API Project, valid for
1 year. Regenerating it, or deleting or disabling the project, ends it sooner. 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 |
| Success Codes | 200 OK |
| Failure Codes | 401 Unauthorized (missing or invalid refresh token), 403 Forbidden (project disabled or IP not allowed), 405 Method Not Allowed (not a POST), 429 Too Many Requests |
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
HTTPS only - requests over plain HTTP receive 403; tokens never travel in cleartext.
Read-only by design - data endpoints reject anything but GET with a 405.
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 15 minutes blocks that IP for 15 minutes.
IP Address Lockdown - optionally list allowed IP addresses on your API Project; all other addresses receive 403.
Endpoint Access - limit a project to specific endpoints; others return 403.
Project Status - disable a project at any time; all its calls return 403 immediately.
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 with the usage endpoint or 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.
Privacy - member contact details require an explicit parameter, guestbook visitor email and IP addresses are never returned, and rental bookings never include renter names. Passwords and account credentials are never available through the API.
Responses & Paging
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-05 14:00: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 |
MaxRows | Rows to return. Default 100, maximum 500. |
StartRow | First row to return (1-based). Combine with MaxRows to page through results. |
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 | Project disabled, 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 | https_required | The request was made over plain HTTP |
| 403 | project_disabled | The API Project's status is Disabled |
| 403 | ip_not_allowed | IP Address Lockdown is set and the caller's IP is not listed |
| 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; the response includes the endpoints list |
| 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 15 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 MaxRows and StartRow parameters.
Click an endpoint for its parameters, response properties, and sample code.
| Endpoint | Description |
Announcements
/apps/api/announce/ |
Live announcements (approved and not expired). |
Calendar
/apps/api/calendar/ |
Events on the members-area calendar. Defaults to today through the next 30 days. |
Databases
/apps/api/databases/ |
Member-built custom databases. Without DatabaseID, lists the databases. With DatabaseID, returns that database's records (primary display fields only). Archived and No Access databases are never returned. |
Discussion Forum
/apps/api/discuss/ |
Online and locked topics. 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/ |
Online documents with their categories. |
Public Events
/apps/api/events/ |
Published public events. Without a date range, returns current and upcoming events. |
Guestbook
/apps/api/guestbook/ |
Approved guestbook entries. Visitor email and IP address are never returned. |
Meeting Minutes
/apps/api/minutes/ |
Online meeting minutes with their categories. |
News
/apps/api/news/ |
Published news stories with their photos, attachments, and videos. |
Online Members
/apps/api/members/ |
The active member roster. Phone and email are only included when IncludeContact=1 is passed. |
Rental Calendar
/apps/api/rental/ |
Facility rental bookings (availability). Renter names are never returned. Defaults to today through the next 90 days. The response also includes a rentalTypes array for mapping TypeID. |
Sign Up Sheets
/apps/api/signup/ |
Online sign up sheets. 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. The Type parameter selects the record set. Items restricted to specific members are excluded. |
Usage / Throttle Statistics
/apps/api/usage/ |
Your project's current rate-limit consumption. Always available, regardless of endpoint access settings. |
Questions about the API? Contact us at
Support@FirehouseSolutions.com.
|