{"openapi":"3.0.3","info":{"title":"directory.lgbt Public API","version":"1.6","description":"Read-only, versioned, keyless JSON API over the same published-listings read surface the site itself uses. Search results are NOT synonym-expanded or typo-tolerant (that lives in the on-site search box only, via Meilisearch, Phase 33) — this is a deliberate, documented divergence between the machine surface and the human surface, not a bug.\n\nThis API is versioned in the path. The current version is stable: existing fields will not be removed, renamed or change type or meaning within it. Additive, non-breaking changes — new optional fields, new endpoints — may land at any time; where this specification's version string is a content-revision counter, it moves to record each one. A breaking change will only ever arrive as a new version, never as a change to the current one. If a version is ever withdrawn, we will give at least six months' public notice before it stops responding. Notice appears in the changelog on this page, and scheduled withdrawals are additionally signalled on every response with the standard Deprecation and Sunset HTTP headers. A field may be absent from a response where we withhold the underlying value — for accuracy, privacy or safety — on directory.lgbt itself. Withholding a value we will not stand behind is not a breaking change under this policy, and it applies to every published surface equally.","termsOfService":"/api-usage-terms"},"paths":{"/api/v1":{"get":{"tags":["meta"],"summary":"API root","description":"Self-describing links to the spec, docs UI, usage terms, and every resource.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"links":{"type":"object","properties":{"openapi":{"type":"string"},"docs":{"type":"string"},"terms":{"type":"string"},"listings":{"type":"string"},"organisations":{"type":"string"},"categories":{"type":"string"}},"required":["openapi","docs","terms","listings","organisations","categories"]}},"required":["name","version","description","links"]}}}}}}},"/api/v1/listings":{"get":{"tags":["listings"],"summary":"Search published listings","description":"The same masked read surface as the site. Search results are NOT synonym-expanded or typo-tolerant (that is on-site-only, via Meilisearch); see /api-usage-terms for details.","parameters":[{"in":"query","name":"q","schema":{"type":"string"}},{"in":"query","name":"lat","schema":{"type":"number"}},{"in":"query","name":"lng","schema":{"type":"number"}},{"in":"query","name":"radius","schema":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100}},{"in":"query","name":"category","schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"identity","schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"accessibility","schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"region","schema":{"type":"string","enum":["london","south_east","south_west","east","midlands","north_west","north_east","yorkshire","scotland","wales","northern_ireland","online"]}},{"in":"query","name":"sort","schema":{"type":"string","enum":["relevance","distance","name"],"default":"relevance"}},{"in":"query","name":"cursor","schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"in":"query","name":"include_adult","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"audience_profile":{"nullable":true,"type":"object","properties":{"version":{"type":"number","enum":[1]},"audiences":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"}},"required":["slug","kind"]}},"specialist_focus":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]}},"required":["slug","kind"]}},"participation_note":{"type":"string"}},"required":["version","audiences","specialist_focus"]},"audience_summary":{"type":"object","properties":{"primary":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"},"label":{"type":"string"}},"required":["slug","kind","label"]}},"minimum_age":{"nullable":true,"type":"number"},"maximum_age":{"nullable":true,"type":"number"},"additionalSupport":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"},"label":{"type":"string"}},"required":["slug","kind","label"]}},"focus":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"label":{"type":"string"}},"required":["slug","kind","label"]}},"participation_note":{"type":"string"},"matchReasons":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"matched_by":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"type":{"type":"string","enum":["direct","covered_by_broader_audience","specialist"]},"label":{"type":"string"}},"required":["slug","matched_by","kind","type","label"]}},"source":{"type":"string","enum":["reviewed","legacy"]}},"required":["primary","minimum_age","maximum_age","additionalSupport","focus","matchReasons","source"]},"audience_match_reasons":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"matched_by":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"type":{"type":"string","enum":["direct","covered_by_broader_audience","specialist"]},"label":{"type":"string"}},"required":["slug","matched_by","kind","type","label"]}},"minimum_age":{"nullable":true,"type":"integer","minimum":0,"maximum":120},"maximum_age":{"nullable":true,"type":"integer","minimum":0,"maximum":120},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"short_id":{"type":"string","description":"Stable 8-character listing identifier, immutable even when the listing is renamed. Build the canonical web URL as /listings/{slug}-{short_id} (see /api-usage-terms)."},"short_description":{"nullable":true,"type":"string"},"category_name":{"type":"string"},"category_slug":{"type":"string"},"delivery_mode":{"type":"string","enum":["in_person","online","phone","hybrid"]},"distance_miles":{"nullable":true,"type":"number"},"town_city":{"nullable":true,"type":"string"},"county":{"nullable":true,"type":"string"},"visibility_tier":{"nullable":true,"type":"string","enum":["full_address","area_only","town_only","online_only"]},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"tag_type":{"type":"string","enum":["identity","served_community","accessibility","feature","confidence"]}},"required":["name","slug","tag_type"]}},"relevance_score":{"nullable":true,"type":"number"},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"matched_via_aka":{"type":"boolean"},"matched_aka":{"nullable":true,"type":"string"}},"required":["id","name","slug","short_id","short_description","category_name","category_slug","delivery_mode","distance_miles","town_city","county","visibility_tier","tags","relevance_score","latitude","longitude","matched_via_aka","matched_aka"]}},"meta":{"type":"object","properties":{"total":{"type":"number"},"facets":{"type":"object","properties":{"category":{"type":"object","additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"},"disabled":{"type":"boolean"}},"required":["slug","label","count","disabled"]}},"identity":{"type":"object","additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"},"disabled":{"type":"boolean"}},"required":["slug","label","count","disabled"]}},"accessibility":{"type":"object","additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"},"disabled":{"type":"boolean"}},"required":["slug","label","count","disabled"]}},"confidence":{"type":"object","additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"},"disabled":{"type":"boolean"}},"required":["slug","label","count","disabled"]}}},"required":["category","identity","accessibility","confidence"]}},"required":["total","facets"]},"links":{"type":"object","properties":{"self":{"type":"string"},"next":{"nullable":true,"type":"string"}},"required":["self","next"]}},"required":["data","meta","links"]}}}},"400":{"description":"Invalid query parameters"},"502":{"description":"Upstream read failed"}}}},"/api/v1/listings/{id}":{"get":{"tags":["listings"],"summary":"Fetch a single published listing","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"query","name":"include_adult","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"audience_profile":{"nullable":true,"type":"object","properties":{"version":{"type":"number","enum":[1]},"audiences":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"}},"required":["slug","kind"]}},"specialist_focus":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]}},"required":["slug","kind"]}},"participation_note":{"type":"string"}},"required":["version","audiences","specialist_focus"]},"audience_summary":{"type":"object","properties":{"primary":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"},"label":{"type":"string"}},"required":["slug","kind","label"]}},"minimum_age":{"nullable":true,"type":"number"},"maximum_age":{"nullable":true,"type":"number"},"additionalSupport":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"explicit_includes":{"type":"array","items":{"type":"string"}},"minimum_age":{"type":"integer","minimum":0,"maximum":120},"maximum_age":{"type":"integer","minimum":0,"maximum":120},"eligibility_note":{"type":"string"},"label":{"type":"string"}},"required":["slug","kind","label"]}},"focus":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"label":{"type":"string"}},"required":["slug","kind","label"]}},"participation_note":{"type":"string"},"matchReasons":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"matched_by":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"type":{"type":"string","enum":["direct","covered_by_broader_audience","specialist"]},"label":{"type":"string"}},"required":["slug","matched_by","kind","type","label"]}},"source":{"type":"string","enum":["reviewed","legacy"]}},"required":["primary","minimum_age","maximum_age","additionalSupport","focus","matchReasons","source"]},"audience_match_reasons":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"matched_by":{"type":"string"},"kind":{"type":"string","enum":["primary","additional_support"]},"type":{"type":"string","enum":["direct","covered_by_broader_audience","specialist"]},"label":{"type":"string"}},"required":["slug","matched_by","kind","type","label"]}},"minimum_age":{"nullable":true,"type":"integer","minimum":0,"maximum":120},"maximum_age":{"nullable":true,"type":"integer","minimum":0,"maximum":120},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"short_id":{"type":"string","description":"Stable 8-character listing identifier, immutable even when the listing is renamed. Build the canonical web URL as /listings/{slug}-{short_id} (see /api-usage-terms)."},"short_description":{"nullable":true,"type":"string"},"long_description":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"},"email":{"nullable":true,"type":"string"},"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_type":{"type":"string","enum":["phone","email"]},"purpose":{"type":"string","enum":["support","general"],"description":"What this contact point is for. `support` is the organisation's helpline — the only purpose that should ever be treated as a crisis/support line. `general` is a neutral general-enquiries contact and must never be presented with helpline framing. No other purpose is ever published here."},"value":{"type":"string"}},"required":["id","contact_type","purpose","value"]},"description":"The purpose-classified public contact set for this listing's organisation, ranked support-first (Phase 178). Additive alongside `phone`/`email`, which are unchanged — a consumer that only reads the scalars keeps working."},"website":{"nullable":true,"type":"string"},"social_links":{"nullable":true,"type":"object","additionalProperties":{"type":"string"}},"fees_description":{"nullable":true,"type":"string"},"application_process":{"nullable":true,"type":"string","enum":["drop_in","referral","appointment"]},"opening_hours":{"nullable":true,"description":"This organisation's structured weekly opening hours, or null. A null value means one of TWO things a machine reader cannot distinguish from this field alone: the organisation genuinely has no recorded hours, OR we hold a value we are not currently permitted to publish (Phase 175 D-175-05 — an unprovenanced or Google-sourced value is withheld under the same publish gate every other hours surface on this site uses). Null here is NOT a negative claim that the organisation has no hours; treat it the same way you would treat missing data, never as evidence of closure.","type":"array","items":{"type":"object","properties":{"day":{"anyOf":[{"type":"string"},{"type":"number"}]},"open":{"type":"string"},"close":{"type":"string"},"closed":{"type":"boolean"}},"required":["day"]}},"opening_hours_exceptions":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["date"]},"date":{"type":"string","description":"ISO YYYY-MM-DD this record applies to."},"closed":{"type":"boolean"},"windows":{"type":"array","items":{"type":"object","properties":{"open":{"type":"string"},"close":{"type":"string"}},"required":["open","close"]}},"reason":{"type":"string"},"source":{"type":"string","enum":["curated","org_claimed","enriched"]},"sourceUrl":{"type":"string"},"verifiedOn":{"type":"string"}},"required":["kind","date","closed","source"]},{"type":"object","properties":{"kind":{"type":"string","enum":["range"]},"validFrom":{"type":"string","description":"ISO YYYY-MM-DD, inclusive."},"validThrough":{"type":"string","description":"ISO YYYY-MM-DD, inclusive."},"closed":{"type":"boolean"},"windows":{"type":"array","items":{"type":"object","properties":{"open":{"type":"string"},"close":{"type":"string"}},"required":["open","close"]}},"reason":{"type":"string"},"source":{"type":"string","enum":["curated","org_claimed","enriched"]},"sourceUrl":{"type":"string"},"verifiedOn":{"type":"string"}},"required":["kind","validFrom","validThrough","closed","source"]},{"type":"object","properties":{"kind":{"type":"string","enum":["nthWeekday"]},"weekday":{"type":"string","enum":["sun","mon","tue","wed","thu","fri","sat"]},"nth":{"anyOf":[{"type":"number","enum":[1]},{"type":"number","enum":[2]},{"type":"number","enum":[3]},{"type":"number","enum":[4]},{"type":"number","enum":[-1]}],"description":"1-4 for the Nth occurrence of `weekday` in the month; -1 for the LAST occurrence. Never a literal 5."},"closed":{"type":"boolean"},"windows":{"type":"array","items":{"type":"object","properties":{"open":{"type":"string"},"close":{"type":"string"}},"required":["open","close"]}},"reason":{"type":"string"},"source":{"type":"string","enum":["curated","org_claimed","enriched"]},"sourceUrl":{"type":"string"},"verifiedOn":{"type":"string"}},"required":["kind","weekday","nth","closed","source"]}],"description":"A calendar-date exception to the regular opening_hours above — a one-off closure, a seasonal date range, or a recurring monthly rule. Narrows or closes the regular hours, never widens them."},"description":"Calendar-date exceptions to opening_hours above — a one-off closure, a seasonal date range, or a recurring monthly rule (e.g. \"closed the first Thursday of every month\"). Always an array, never null: an empty array means either \"no exceptions on record\" or \"withheld under the same gate as opening_hours\" — the two are indistinguishable from this field alone, matching opening_hours' own null-means-either-thing posture. An exception NARROWS OR CLOSES the hours in opening_hours and never widens them; when combining the two for a specific date, an exception always wins."},"arrival_notes":{"nullable":true,"description":"Free-text guidance on what to expect on arrival, when the organisation has provided it. Null means none has been recorded — never a claim that none exists.","type":"string"},"content_rating":{"type":"string"},"delivery_mode":{"type":"string","enum":["in_person","online","phone","hybrid"]},"human_verified_at":{"nullable":true,"description":"ISO timestamp this listing was last verify-stamped (D-32), or null if never verify-stamped. Stamped EITHER by a human reviewer's click, OR by an automated dual-AI-agreement pass at high confidence — see automated_verified_at to tell them apart. A positive-only trust signal — a null value means \"not yet reviewed\", never a negative marker.","type":"string"},"automated_verified_at":{"nullable":true,"description":"ISO timestamp an automated dual-AI-agreement review (not a human) verify-stamped this listing, or null. Set ONLY on that path, with the SAME value as human_verified_at when it applies. EQUAL timestamps (or human_verified_at null) means the latest verify was automated; a STRICTLY NEWER human_verified_at means a human has since (re-)reviewed it.","type":"string"},"category":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"}},"required":["id","name","slug","description","icon"]},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"tag_type":{"type":"string","enum":["identity","served_community","accessibility","feature","confidence"]}},"required":["name","slug","tag_type"]}},"locations":{"type":"array","items":{"type":"object","properties":{"semantic_purpose":{"nullable":true,"type":"string","enum":["registered_office","postal_contact","visiting_premises","unknown"]},"visiting_status":{"nullable":true,"type":"string","enum":["unknown","no_visitors","contact_first","appointment","drop_in"]},"visiting_notes":{"nullable":true,"type":"string"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"label":{"nullable":true,"type":"string"},"is_primary":{"type":"boolean"},"location_type":{"nullable":true,"type":"string"},"address_line_1":{"nullable":true,"type":"string"},"address_line_2":{"nullable":true,"type":"string"},"town_city":{"nullable":true,"type":"string"},"county":{"nullable":true,"type":"string"},"postcode":{"nullable":true,"type":"string"},"country":{"type":"string"},"visibility_tier":{"type":"string","enum":["full_address","area_only","town_only","online_only"]}},"required":["semantic_purpose","visiting_status","visiting_notes","id","label","is_primary","location_type","address_line_1","address_line_2","town_city","county","postcode","country","visibility_tier"]}},"organisation":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"logo_url":{"nullable":true,"type":"string"},"rich_summary":{"nullable":true,"description":"Plain-text projection of the organisation rich_summary document, generated from supported scraped website evidence using the shared richSummaryDocumentToText projection. Null when the scrape does not support a summary or the stored document has no valid content; no teaser or invented fallback.","type":"string"}},"required":["id","name","logo_url","rich_summary"]},"provenance":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The allowlisted field key this row describes (e.g. \"description\", \"phone\", \"charity_number\") — matches field_sources.field_name."},"display_name":{"type":"string","description":"Plain-English label for this field, matching the wording the public listing page itself uses (e.g. \"About text\")."},"origin":{"type":"string","enum":["official-register","organisation-website","automated-summary","community-suggested","team-member","unknown"],"description":"Where this fact came from, in the SAME six-value vocabulary the public listing page discloses. \"automated-summary\" is the one D-211-01 exists to disclose: an LLM-written rewrite, checked against the source material it was written from — this field never states, and this API never records per-record, which specific inputs a given rewrite drew on."},"register_name":{"nullable":true,"description":"The named official register (e.g. \"Charity Commission for England and Wales\"), when origin is \"official-register\" AND a single register can be honestly named. Null when the origin is not a register, or when the supplying source cannot name one (a cross-register aggregator, or the record's own identifier vetoes it) — never a guess.","type":"string"},"date_label":{"nullable":true,"description":"ISO 8601 timestamp this fact was last touched in field_sources, or null. A row-touch (any write, including a no-change re-scrape), never a human confirmation — do not present this as \"verified on\" or \"confirmed on\".","type":"string"}},"required":["field","display_name","origin","register_name","date_label"]},"description":"Per-field provenance disclosure for this listing — the same \"how we know this\" facts the public listing page discloses to a visitor (Phase 211, D-211-03/D-211-05), resolved through the identical shared vocabulary and gates. A row is present only when every gate passes; an absent field means no disclosable row passed, never that nothing is known. Always an array, never omitted: an empty array honestly means no field on this listing currently has a disclosable provenance row, distinguishing that from an endpoint that does not support provenance at all."}},"required":["id","name","slug","short_id","short_description","long_description","phone","email","contacts","website","social_links","fees_description","application_process","opening_hours","opening_hours_exceptions","arrival_notes","content_rating","delivery_mode","human_verified_at","automated_verified_at","category","tags","locations","organisation","provenance"]}},"required":["data"]}}}},"400":{"description":"Invalid id or query parameters"},"404":{"description":"Not found or not public (also returned for an adult-rated listing when include_adult is not set)"},"502":{"description":"Upstream read failed"}}}},"/api/v1/organisations/{id}":{"get":{"tags":["organisations"],"summary":"Fetch a single published organisation","description":"Masked per visibility tier per address.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"query","name":"include_adult","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"nullable":true,"type":"string"},"rich_summary":{"nullable":true,"description":"Plain-text projection of the organisation rich_summary document, generated from supported scraped website evidence using the shared richSummaryDocumentToText projection. Null when the scrape does not support a summary or the stored document has no valid content; no teaser or invented fallback.","type":"string"},"logo_url":{"nullable":true,"type":"string"},"charity_number":{"nullable":true,"type":"string"},"company_number":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"email":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"},"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_type":{"type":"string","enum":["phone","email"]},"purpose":{"type":"string","enum":["support","general"],"description":"What this contact point is for. `support` is the organisation's helpline — the only purpose that should ever be treated as a crisis/support line. `general` is a neutral general-enquiries contact and must never be presented with helpline framing. No other purpose is ever published here."},"value":{"type":"string"}},"required":["id","contact_type","purpose","value"]},"description":"The purpose-classified public contact set for this organisation, ranked support-first (Phase 178). Additive alongside `phone`/`email`, which are unchanged — a consumer that only reads the scalars keeps working."},"socials":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"url":{"type":"string"}},"required":["platform","url"]}},"concepts":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"dimension":{"type":"string","enum":["category","tag"]}},"required":["slug","label","dimension"]}},"addresses":{"type":"array","items":{"type":"object","properties":{"semantic_purpose":{"nullable":true,"type":"string","enum":["registered_office","postal_contact","visiting_premises","unknown"]},"visiting_status":{"nullable":true,"type":"string","enum":["unknown","no_visitors","contact_first","appointment","drop_in"]},"visiting_notes":{"nullable":true,"type":"string"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["registered","contact","operating"]},"address_provenance_source":{"nullable":true,"type":"string","enum":["charity_commission","oscr","ccni","companies_house"]},"postal_validation_outcome":{"nullable":true,"type":"string","enum":["unique_delivery_point","shared_premises","no_candidates","no_unique_match","not_independently_validated"]},"address_line_1":{"nullable":true,"type":"string"},"address_line_2":{"nullable":true,"type":"string"},"town_city":{"nullable":true,"type":"string"},"county":{"nullable":true,"type":"string"},"postcode":{"nullable":true,"type":"string"},"country":{"type":"string"},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"visibility_tier":{"type":"string","enum":["full_address","area_only","town_only","online_only"]}},"required":["semantic_purpose","visiting_status","visiting_notes","id","role","address_provenance_source","postal_validation_outcome","address_line_1","address_line_2","town_city","county","postcode","country","latitude","longitude","visibility_tier"]}}},"required":["id","name","slug","description","rich_summary","logo_url","charity_number","company_number","website","email","phone","contacts","socials","concepts","addresses"]}},"required":["data"]}}}},"400":{"description":"Invalid id or query parameters"},"404":{"description":"Not found or not public (also returned when every listing for this organisation is adult-rated and include_adult is not set)"},"502":{"description":"Upstream read failed"}}}},"/api/v1/categories":{"get":{"tags":["categories"],"summary":"The public category taxonomy","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"}},"required":["id","name","slug","description","icon"]}}},"required":["data"]}}}},"502":{"description":"Upstream read failed"}}}}}}