Florida Roof APIfloridaroof.com ↗
Search and retrieve FRSA roofing contractor profiles — company name, address, phone, email, website, and category — via two structured endpoints.
What is the Florida Roof API?
The floridaroof.com API provides access to the Florida Roofing and Sheet Metal Contractors Association (FRSA) member directory through 2 endpoints. Use search_members to query contractors by city or company name and get paginated lists of up to 10 results per page, then call get_member_detail with a profile path to retrieve the full contact record including email, fax, website, member category, and description.
curl -X GET 'https://api.parse.bot/scraper/f4dab63c-62b1-4cf3-bada-0166506386a2/search_members?category=16&location=city&searchtext=Tampa' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace floridaroof-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: FRSA member directory — search roofing contractors and retrieve details."""
from parse_apis.floridaroof_com_api import FRSA, MemberCategory, LocationType, MemberNotFound
client = FRSA()
# Search for roofing contractors in Tampa filtered to FL contractors
for member in client.members.search(searchtext="Tampa", category=MemberCategory.CONTRACTOR_IN_FL, limit=5):
print(member.company_name, member.city, member.phone)
# Drill into a single result for full details
member_summary = client.members.search(searchtext="Orlando", location=LocationType.CITY, limit=1).first()
if member_summary:
detail = member_summary.details()
print(detail.company_name, detail.email, detail.website, detail.category)
# Handle member not found
try:
detail = client.members.search(searchtext="Jacksonville", category=MemberCategory.CONTRACTOR_IN_FL, limit=1).first()
if detail:
full = detail.details()
print(full.company_name, full.street_address, full.city, full.state, full.zip_code)
except MemberNotFound as exc:
print(f"Member not found: {exc.profile_path}")
print("exercised: members.search / member_summary.details / MemberCategory enum / LocationType enum / MemberNotFound error")
Search the FRSA member directory by keyword (city, company name, or general term), optionally filtered by location type and member category. Returns paginated results with 10 members per page including company name, address, phone, and profile URL. Results are auto-iterated across pages.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). Each page returns up to 10 results. |
| category | string | Member category filter by numeric ID. Empty string means all categories. |
| location | string | Location type filter for interpreting the search text. Empty string means no filter. |
| searchtextrequired | string | Search keyword — typically a city name, company name, or general roofing term. |
{
"type": "object",
"fields": {
"page": "integer",
"results": "array of member summary objects with company_name, profile_url, street_address, city, state, zip_code, phone",
"source_url": "string",
"total_results": "integer or null"
},
"sample": {
"data": {
"page": 1,
"results": [
{
"city": "Tampa",
"phone": "+1 (555) 012-3456",
"state": "FL",
"zip_code": "33610-4918",
"profile_url": "https://www.floridaroof.com/TAMPA-ROOFING-CO-INC-10-1145.html",
"company_name": "TAMPA ROOFING CO INC",
"street_address": "1700 E Ellicott St"
}
],
"source_url": "https://www.floridaroof.com/member-search/index?searchtext=Tampa&location=&category=16",
"total_results": 39
},
"status": "success"
}
}About the Florida Roof API
What the API Covers
The FRSA member directory lists roofing and sheet metal contractors that hold active association membership in Florida. The API exposes two endpoints that together let you search the full directory and retrieve individual company records. Every search result includes company_name, street_address, city, state, zip_code, phone, and a profile_url that feeds directly into the detail endpoint.
search_members Endpoint
search_members accepts a required searchtext parameter — typically a city name, partial company name, or trade term — and returns paginated results (10 per page, 1-based). Two optional filters narrow the result set: category accepts a numeric ID string to restrict results to a specific FRSA membership category, and location sets how the search text is interpreted geographically. The response includes total_results (integer or null when the count is unavailable) and a source_url for reference.
get_member_detail Endpoint
get_member_detail takes a profile_path — the path string returned in profile_url from a search result — and returns the full company record. Fields include phone, fax, email, website, category, city, state, zip_code, and description. Several fields (fax, email, website, description) are nullable, reflecting what individual members have chosen to publish in their directory listing.
Data Scope and Freshness
Coverage is limited to FRSA members in Florida. The directory reflects current association membership, so contractors who have not renewed or whose listings are incomplete will appear with partial data. The category field in detail responses corresponds to the FRSA membership tier or trade classification the company holds.
The Florida Roof API is a managed, monitored endpoint for floridaroof.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when floridaroof.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official floridaroof.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a contractor finder tool filtered by Florida city using
searchtextandcityfields from search results - Aggregate contact lists of FRSA-member roofers by membership category using the
categoryfilter - Enrich a CRM with verified phone, email, and website data pulled from
get_member_detail - Cross-reference licensed roofing companies against permit records using company name and zip code
- Generate a regional directory of Florida roofing contractors sorted by city and member category
- Monitor association membership changes by periodically querying the directory for new or removed companies
- Identify contractors with published websites for outreach campaigns by filtering on the non-null
websitefield
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does FRSA offer an official developer API for its member directory?+
What does get_member_detail return beyond what search_members provides?+
search_members returns summary fields — company name, address, phone, and a profile URL. get_member_detail adds fax, email, website, category, and description. Fields like email and website are nullable because some members do not publish them in their FRSA listing.Does search_members always return a total result count?+
total_results is typed as integer or null. When the directory does not surface a total count for a given query, the field returns null. Pagination still works via the page parameter; iterate until a page returns fewer than 10 results to detect the final page.Does the API cover roofing contractors outside Florida or members of other state roofing associations?+
Can I filter search results by ZIP code or county rather than city name?+
searchtext parameter accepts a city name, company name, or general term, and location sets geographic interpretation. ZIP code or county-level filtering is not a dedicated parameter. You can fork the API on Parse and revise it to add a ZIP-based or county-based filter endpoint.