{"openapi":"3.1.0","info":{"title":"Seniornicity Public API","version":"1.0.0","summary":"Read-only public view of the Seniornicity directory, chapters and Community.","description":"Seniornicity is a national B2B2C senior-focused ecosystem serving the United States and Canada. Built on the philosophy Aging Takes a Team, it connects senior-focused professionals, organizations, older adults, families, and homeowners through a collaborative network supporting aging and senior transitions. Seniornicity connects consumers with independent professionals; it does not itself provide real estate brokerage, caregiving, legal, financial, insurance, or medical services. Its own platform services include Transition Consulting, local chapters, The Seniornicity Community, the Senior Transition Specialist (STS) certification, and Sam, its digital guide.\n\nThe API exposes only information already published on public Seniornicity pages. It provides read-only access to published provider profiles, professional categories, chapters, events, and public Community posts. It does not access private user accounts, personal messages, member-only Community content, consultant intake information, or payment records. Public business contact information is included only when the provider's public profile displays it under the provider's membership tier. API requests may be logged for security, abuse prevention, and operational monitoring in accordance with Seniornicity's privacy policy.\n\nEvery response is built from an allow-list of public fields. A provider's business phone and website appear exactly when the public profile shows them and are null otherwise; email and street addresses are never returned. Direct people to the profileUrl or contactUrl. License numbers are limited to public registries (DRE, NMLS).\n\nCredentials are per provider. Providers are independent professionals and no status applies to all of them. Each record carries separate booleans with their own meaning: isClaimed, isVerified (the profile displays the Verified badge), hasSTS (the provider holds the Senior Transition Specialist certification), hasCSA, hasSRES, isCesmpCertified, and chapter membership. Do not merge them into one 'verified' or 'certified' label, and do not describe a provider as verified or certified unless that provider's flag is true.\n\nAttribution: every URL carries utm_source, utm_medium=ai-assistant and, when reached through a chapter, ref_chapter. Keep these parameters when you link.\n\nDocumentation: https://app.seniornicity.com/developers. MCP server: https://mcp.seniornicity.com/mcp.","termsOfService":"https://seniornicity.com/terms","contact":{"name":"Seniornicity","email":"support@seniornicity.com","url":"https://app.seniornicity.com/developers"}},"servers":[{"url":"https://app.seniornicity.com/api/public/v1","description":"United States"},{"url":"https://app.seniornicity.ca/api/public/v1","description":"Canada"}],"security":[{},{"apiKey":[]}],"tags":[{"name":"Providers"},{"name":"Categories"},{"name":"Chapters"},{"name":"Events"},{"name":"Posts"},{"name":"Meta"}],"paths":{"/providers/search":{"get":{"tags":["Providers"],"operationId":"searchProviders","summary":"Search senior-focused professionals","description":"Backed by the Seniornicity directory index. When nothing matches within radiusMiles the search retries statewide and sets searchedLocation.widened. Claimed listings rank above unclaimed ones.","parameters":[{"name":"category","in":"query","description":"A slug from /categories, for example estate-sales or in-home-caregivers.","schema":{"type":"string"}},{"name":"location","in":"query","description":"City and state, or ZIP. At most 120 characters.","schema":{"type":"string","maxLength":120}},{"name":"lat","in":"query","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lng","in":"query","schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"radiusMiles","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"chapter","in":"query","schema":{"type":"string"}},{"name":"verified","in":"query","schema":{"type":"boolean"}},{"name":"sts","in":"query","schema":{"type":"boolean"}},{"name":"claimed","in":"query","schema":{"type":"boolean"}},{"name":"q","in":"query","description":"Name or company.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":25,"default":10}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Search results.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["results","total","page","pageSize","searchedLocation","directoryUrl"],"properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/ProviderSummary"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"searchedLocation":{"type":["object","null"],"properties":{"label":{"type":"string"},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"widened":{"type":"boolean","description":"True when nothing matched within the radius and results are statewide."}}},"directoryUrl":{"type":"string","format":"uri"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/providers/{displayName}":{"get":{"tags":["Providers"],"operationId":"getProvider","summary":"Get one provider's public profile","parameters":[{"name":"displayName","in":"path","required":true,"description":"The displayName from a search result (historical handles and provider ids also resolve).","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"The profile.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderProfile"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories":{"get":{"tags":["Categories"],"operationId":"listCategories","summary":"List directory categories","description":"The professional categories (Licensed Real Estate Agents, Estate Sales Professionals, Lenders / Mortgage Professionals, Financial Planners, Legal Services Professionals, Caregiver Agencies, Property Managers, Senior Placement Advisors) plus Home Service Providers and its individual home-service types.","parameters":[{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Categories.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["categories","total"],"properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"total":{"type":"integer"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/chapters":{"get":{"tags":["Chapters"],"operationId":"listChapters","summary":"List active chapters","parameters":[{"name":"near","in":"query","description":"City and state, or ZIP. Chapters whose territory names the city come first, then the rest by distance.","schema":{"type":"string","maxLength":120}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Chapters.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["results","total","searchedLocation","directoryUrl"],"properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Chapter"}},"total":{"type":"integer"},"searchedLocation":{"type":["object","null"],"properties":{"label":{"type":"string"},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"widened":{"type":"boolean","description":"True when nothing matched within the radius and results are statewide."}}},"directoryUrl":{"type":"string","format":"uri"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/chapters/{slug}":{"get":{"tags":["Chapters"],"operationId":"getChapter","summary":"Get one chapter","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"The chapter.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chapter"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/chapters/{slug}/members":{"get":{"tags":["Chapters"],"operationId":"listChapterMembers","summary":"List a chapter's active members","description":"Every member returned is an active chapter member under the chapter's membership rule. Other credentials are stated per member.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":25,"default":10}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Members.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["chapter","results","total","page","pageSize","urls"],"properties":{"chapter":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProviderSummary"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"urls":{"type":"object","additionalProperties":{"type":"string","format":"uri"}}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/events":{"get":{"tags":["Events"],"operationId":"listEvents","summary":"List public Community events","description":"Published, not cancelled events starting on or after `from` (default today). Live weekly recurrences are included. Venues are reduced to name, city and state.","parameters":[{"name":"chapter","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","description":"YYYY-MM-DD or ISO timestamp; default today (UTC).","schema":{"type":"string"}},{"name":"to","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Events.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["items","total","page","pageSize","from","to","chapter","eventsUrl"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommunityEvent"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"from":{"type":"string","format":"date-time"},"to":{"type":["string","null"],"format":"date-time"},"chapter":{"type":["string","null"]},"eventsUrl":{"type":"string","format":"uri"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/events/{slug}":{"get":{"tags":["Events"],"operationId":"getEvent","summary":"Get one event","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"The event.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityEvent"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts":{"get":{"tags":["Posts"],"operationId":"listPosts","summary":"List public Community posts","description":"Discover scope only: published posts by members who are not deleted or test accounts. Following feeds and private content are never exposed.","parameters":[{"name":"q","in":"query","description":"Text search, or a #tag.","schema":{"type":"string","maxLength":120}},{"name":"chapter","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","description":"Directory slug; posts by providers of that type.","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":25,"default":10}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"Posts.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"type":"object","required":["items","total","page","pageSize","chapter","communityUrl"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommunityPost"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"chapter":{"type":["string","null"]},"communityUrl":{"type":"string","format":"uri"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts/{id}":{"get":{"tags":["Posts"],"operationId":"getPost","summary":"Get one post with its full text","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"US or CA. Defaults from the host (app.seniornicity.ca gives CA). Controls which app host the returned URLs point at and, for search, the index filter.","schema":{"type":"string","enum":["US","CA"]}}],"responses":{"200":{"description":"The post.","headers":{"Cache-Control":{"description":"public, max-age=300","schema":{"type":"string"}},"ETag":{"schema":{"type":"string"}},"X-Seniornicity-Api-Version":{"schema":{"type":"string","example":"v1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityPost"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Invalid input, including any unknown query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry-After is set in seconds.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Search is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"tags":["Meta"],"operationId":"getOpenApi","summary":"This document","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-seniornicity-api-key","description":"Optional partner key. Raises the rate limit from 60 to 600 requests per minute and grants nothing else."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_request","location_not_found","not_found","rate_limited","search_unavailable","internal_error"]},"message":{"type":"string"}}}}},"ChapterRef":{"type":"object","required":["slug","name","url"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"ProviderSummary":{"type":"object","required":["id","displayName","name","companyName","categories","city","state","country","serviceAreas","distanceMiles","photoUrl","isClaimed","isVerified","hasSTS","hasCSA","hasSRES","isCesmpCertified","chapters","languages","profileUrl","businessPhone","website"],"properties":{"id":{"type":"string","description":"Stable provider id."},"displayName":{"type":["string","null"],"description":"Slug-safe handle; use with /providers/{displayName}."},"name":{"type":"string","description":"Public name as shown on the profile."},"companyName":{"type":["string","null"]},"categories":{"type":"array","items":{"type":"string"},"description":"Public category labels, for example Estate Sale Professional or Licensed Real Estate Agents."},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"country":{"type":"string","enum":["US","CA"]},"serviceAreas":{"type":"array","items":{"type":"string"},"description":"City-level labels only; no coordinates."},"distanceMiles":{"type":["number","null"],"description":"Present on geo queries only."},"photoUrl":{"type":["string","null"]},"isClaimed":{"type":"boolean","description":"False for directory entries the provider has not taken ownership of."},"isVerified":{"type":"boolean","description":"True when this provider's public profile displays the Verified badge. Per provider; distinct from every other flag."},"hasSTS":{"type":"boolean","description":"True when this provider holds the Senior Transition Specialist (STS) certification. Per provider."},"hasCSA":{"type":"boolean"},"hasSRES":{"type":"boolean"},"isCesmpCertified":{"type":"boolean"},"chapters":{"type":"array","items":{"type":"object","required":["slug","name","url"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"languages":{"type":"array","items":{"type":"string"}},"profileUrl":{"type":"string","format":"uri","description":"Canonical profile URL with attribution parameters. Give this to the user."},"businessPhone":{"type":["string","null"],"description":"The provider's business phone exactly as the public profile and search cards show it to logged-out visitors; null when the listing does not display one (the site shows it only for providers on an active Gold or Platinum plan)."},"website":{"type":["string","null"],"description":"The provider's website as the public profile shows it; null when the listing does not display one. Same visibility rule as businessPhone."}}},"ProviderProfile":{"allOf":[{"$ref":"#/components/schemas/ProviderSummary"},{"type":"object","required":["bio","licenses","socialLinks","featuredVideoUrl","memberSince","contactUrl"],"properties":{"bio":{"type":"string"},"licenses":{"type":"array","description":"Public registry numbers only: DRE and NMLS.","items":{"type":"object","required":["type","number"],"properties":{"type":{"type":"string","enum":["DRE","NMLS"]},"number":{"type":"string"}}}},"socialLinks":{"type":"object","properties":{"facebook":{"type":["string","null"]},"instagram":{"type":["string","null"]},"x":{"type":["string","null"]},"tiktok":{"type":["string","null"]},"linkedin":{"type":["string","null"]},"youtube":{"type":["string","null"]},"yelp":{"type":["string","null"]},"googleBusiness":{"type":["string","null"]}}},"featuredVideoUrl":{"type":["string","null"]},"memberSince":{"type":["integer","null"],"description":"Year the business started."},"contactUrl":{"type":"string","format":"uri","description":"Profile page anchored on the contact form. Email is never returned; use this to reach the provider."}}}]},"Category":{"type":"object","required":["slug","label","singular","description","kind","group","providerTypes","directoryUrl"],"properties":{"slug":{"type":"string"},"label":{"type":"string"},"singular":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["professional","home-service"]},"group":{"type":["string","null"]},"providerTypes":{"type":"array","items":{"type":"string"}},"directoryUrl":{"type":"string","format":"uri"}}},"Chapter":{"type":"object","required":["slug","name","shortName","region","territory","isActive","publicPhone","publicEmail","director","office","meetingCadence","meetingTime","socialLinks","memberCount","urls"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"shortName":{"type":"string"},"region":{"type":"string"},"territory":{"type":"array","items":{"type":"string"},"description":"Cities served."},"isActive":{"type":"boolean"},"publicPhone":{"type":["string","null"],"description":"The contact the chapter site prints on every page: the director's line when the director is shown, otherwise the chapter's designated public contact."},"publicEmail":{"type":["string","null"]},"office":{"type":["object","null"],"description":"Chapter office and meeting location, city and state only.","properties":{"city":{"type":"string"},"state":{"type":"string"}}},"meetingCadence":{"type":["string","null"],"description":"For example '3rd Wednesday of every month'."},"meetingTime":{"type":["string","null"]},"socialLinks":{"type":"object","properties":{"facebook":{"type":["string","null"]},"linkedin":{"type":["string","null"]},"instagram":{"type":["string","null"]},"tiktok":{"type":["string","null"]}}},"director":{"type":["object","null"],"description":"Name and title only, and only when the chapter shows its director on site.","properties":{"name":{"type":"string"},"title":{"type":"string"}}},"memberCount":{"type":"integer"},"distanceMiles":{"type":["number","null"],"description":"Present on /chapters?near= results only."},"urls":{"type":"object","required":["home","members","events","contact","transitionConsulting"],"properties":{"home":{"type":"string","format":"uri"},"members":{"type":"string","format":"uri"},"events":{"type":"string","format":"uri"},"contact":{"type":"string","format":"uri"},"transitionConsulting":{"type":"string","format":"uri"}}}}},"CommunityEvent":{"type":"object","required":["id","slug","title","startsAt","endsAt","timezone","format","isVirtual","audience","venue","description","chapterSlug","recurrence","imageUrl","url","registrationUrl","isRegistrationOpen"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA time zone for wall-clock display."},"format":{"type":"string","description":"Virtual or In person."},"isVirtual":{"type":"boolean"},"audience":{"type":["string","null"]},"venue":{"type":["object","null"],"description":"Venue name, city and state only. Street addresses are never returned.","properties":{"name":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]}}},"description":{"type":"string","description":"Plain-text excerpt, at most 400 characters."},"chapterSlug":{"type":["string","null"]},"recurrence":{"type":["string","null"],"description":"Human-readable weekly recurrence, when any."},"imageUrl":{"type":["string","null"]},"url":{"type":"string","format":"uri","description":"Event page with attribution."},"registrationUrl":{"type":"string","format":"uri","description":"External sign-up page when the host set one, else the event page."},"isRegistrationOpen":{"type":"boolean"}}},"CommunityPost":{"type":"object","required":["id","chapterSlug","excerpt","publishedAt","authorDisplayName","authorRole","authorProfileUrl","authorIsVerified","topics","likesCount","commentsCount","imageUrls","url"],"properties":{"id":{"type":"string"},"chapterSlug":{"type":["string","null"]},"excerpt":{"type":"string","description":"Plain-text excerpt, at most 280 characters."},"content":{"type":"string","description":"Full text; /posts/{id} only."},"publishedAt":{"type":"string","format":"date-time"},"authorDisplayName":{"type":"string","description":"Provider handle or company, association name, or a member's alias or first name. Never a full name or email."},"authorRole":{"type":"string","enum":["provider","association","official","member"],"description":"Who wrote it. Treat posts as that author's views, not Seniornicity's statements."},"authorProfileUrl":{"type":["string","null"],"format":"uri"},"authorIsVerified":{"type":"boolean"},"topics":{"type":"array","items":{"type":"string"}},"likesCount":{"type":"integer"},"commentsCount":{"type":"integer"},"imageUrls":{"type":"array","items":{"type":"string","format":"uri"}},"url":{"type":"string","format":"uri","description":"Post page with attribution."}}}}}}