Firehouse Solutions
Web Design and Data Management for Firefighters, Rescue Techs, EMTS, Medics, and All Others Who Save Lives
Phone 301.475.1900
Web Design and Data Management for Firefighters, Rescue Techs, EMTS, Medics, and All Others Who Save Lives Phone 301.475.1900   
Firehouse Solutions Firehouse Solutions


September 21, 2026:
What's New: Upgraded HTML Editor and the Firehouse Solutions API
August 15, 2026:
Training Center Now Available
April 20, 2026:
Release of AI Writing Tool and Two-Factor Authentication
October 30, 2025:
Schedule News Posts for Automated Go Live and Come Down
August 30, 2025:
Light and Dark Mode, Calendar Email Reminders, Emoji Support, and Video Galleries
October 17, 2024:
Why Your Organization Needs Email Archiving
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 TypePOST
Calling URIhttps://www.YourDepartment.com/apps/api/refresh/
Request HeaderAuthorization: Bearer {refresh_token}
Request BodyNone 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)
ParameterDescription
StartRowFirst row to return (1-based). Combine with MaxRows to page through results.
MaxRowsRows to return. Default 100, maximum 1000.

Response Codes
CodeMeaning
200 OKSuccess; JSON body returned
400 Bad RequestA parameter is invalid
401 UnauthorizedMissing, invalid, or expired token
403 ForbiddenAPI or project disabled, refresh token expired, HTTPS not used, IP address not allowed, or endpoint not allowed
404 Not FoundThe requested record or endpoint does not exist
405 Method Not AllowedWrong HTTP request type (data endpoints are GET only)
429 Too Many RequestsThrottle limit reached; retry after the Retry-After header
500 Internal Server ErrorUnexpected 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
StatuscodeCause
400invalid_parameterA parameter is non-numeric, a date is invalid or reversed, or MaxRows / StartRow is out of range
401token_missingThe Authorization header is missing
401token_invalidThe supplied token is not recognized
401token_expiredThe access token has expired; request a new one from the refresh endpoint
401refresh_token_suppliedA refresh token was sent to a data endpoint; data endpoints need an access token
403api_disabledThe API is not enabled for the website
403https_requiredThe request was made over plain HTTP
403project_disabledThe API Project's status is Disabled
403refresh_expiredThe refresh token has passed its expire date; regenerate it on the API Project page
403ip_not_allowedThe caller's IP address is not on the API Project's allowed list
403endpoint_not_allowedEndpoint Access excludes the endpoint called
404not_foundAn ID was requested that does not exist or is not available
404unknown_endpointThe URI is not an endpoint
405method_not_allowedWrong HTTP request type for the endpoint
429rate_limitedA throttle limit was reached; wait the number of seconds in the Retry-After header
429too_many_failures10 or more failed token requests from one IP within 10 minutes; the IP is blocked for 60 minutes
500server_errorUnhandled 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.

EndpointDescription
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.