{"openapi":"3.1.0","info":{"title":"RecraHub Public API","version":"1.0.0","description":"Preview. Public JSON API for property programmes and directory data. Human-readable docs: \/api\/docs. OpenAPI schema: \/api\/v1\/openapi.json."},"servers":[{"url":"\/api\/v1"}],"tags":[{"name":"Properties","description":"Public property directory for integrations."},{"name":"Programmes","description":"Published programme data for one property."},{"name":"Age tags","description":"Age tags used by published programmes for one public property."},{"name":"Areas","description":"Areas used by published programmes for one public property."}],"paths":{"\/properties":{"get":{"summary":"List public properties","tags":["Properties"],"responses":{"200":{"description":"Property list","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/PropertyListItem"}}}}}}}},"\/properties\/{property}":{"get":{"summary":"Get public property by id","tags":["Properties"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"integer"},"description":"Property id."}],"responses":{"200":{"description":"Public property","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PropertyListItem"}}}},"404":{"description":"Property not found or not public."}}}},"\/properties\/by-slug\/{property}":{"get":{"summary":"Get public property by slug","tags":["Properties"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"string"},"description":"Property slug."}],"responses":{"200":{"description":"Public property","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PropertyListItem"}}}},"404":{"description":"Property not found or not public."}}}},"\/properties\/{property}\/age-tags":{"get":{"summary":"List age tags used by published programmes","tags":["Age tags"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"integer"},"description":"Property id."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["nl","en","de","fr"]},"description":"Optional language. Must be enabled for the property. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch."}],"responses":{"200":{"description":"Age tags used by published programmes for a public property.","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/ClassificationItem"}}}}},"404":{"description":"Property not found or not public."},"422":{"description":"Invalid query parameter."}}}},"\/properties\/{property}\/areas":{"get":{"summary":"List areas used by published programmes","tags":["Areas"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"integer"},"description":"Property id."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["nl","en","de","fr"]},"description":"Optional language. Must be enabled for the property. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch."}],"responses":{"200":{"description":"Areas used by published programmes for a public property.","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/ClassificationItem"}}}}},"404":{"description":"Property not found or not public."},"422":{"description":"Invalid query parameter."}}}},"\/properties\/{property}\/programmes\/current-or-next":{"get":{"summary":"Get current or next published programme","tags":["Programmes"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"integer"},"description":"Property id."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["nl","en","de","fr"]},"description":"Optional language. Must be enabled for the property. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch."},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Selection date in YYYY-MM-DD format. Defaults to today."}],"responses":{"200":{"description":"Programme payload","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramPayload"}}}},"404":{"description":"No current or upcoming published programme found."},"422":{"description":"Invalid query parameter."}}}},"\/properties\/{property}\/programmes\/{program}":{"get":{"summary":"Get published programme by id","tags":["Programmes"],"parameters":[{"name":"property","in":"path","required":true,"schema":{"type":"integer"},"description":"Property id."},{"name":"program","in":"path","required":true,"schema":{"type":"integer"},"description":"Programme id."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["nl","en","de","fr"]},"description":"Optional language. Must be enabled for the property. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch."}],"responses":{"200":{"description":"Programme payload","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramPayload"}}}},"404":{"description":"Property or published programme not found."},"422":{"description":"Invalid query parameter."}}}}},"components":{"schemas":{"PropertyCoordinates":{"type":["object","null"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},"PropertyListItem":{"type":"object","required":["id","slug","name","formatted_address","coordinates","url","logo_url","header_image_url"],"properties":{"id":{"type":"integer"},"slug":{"type":"string"},"name":{"type":"string"},"formatted_address":{"type":["string","null"]},"coordinates":{"$ref":"#\/components\/schemas\/PropertyCoordinates"},"url":{"type":"string","format":"uri"},"logo_url":{"type":["string","null"],"format":"uri"},"header_image_url":{"type":["string","null"],"format":"uri"}}},"TranslatableValue":{"type":"object","required":["nl","en","de","fr","localized"],"properties":{"nl":{"type":["string","null"]},"en":{"type":["string","null"]},"de":{"type":["string","null"]},"fr":{"type":["string","null"]},"localized":{"type":["string","null"]}},"example":{"nl":"Kinderdisco","en":"Kids disco","de":null,"fr":null,"localized":"Kids disco"}},"ProgramPayload":{"type":"object","required":["id","name","title","status","start_date","end_date","duration_days","activity_count","days","highlights","more_info"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"title":{"$ref":"#\/components\/schemas\/TranslatableValue"},"theme_name":{"$ref":"#\/components\/schemas\/TranslatableValue"},"status":{"type":"string","example":"published"},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"duration_days":{"type":"integer"},"activity_count":{"type":"integer"},"theme":{"type":["object","null"],"properties":{"id":{"type":"integer"},"name":{"$ref":"#\/components\/schemas\/TranslatableValue"},"description":{"$ref":"#\/components\/schemas\/TranslatableValue"},"image_url":{"type":["string","null"],"format":"uri"},"highlighted":{"type":"boolean"}}},"urls":{"type":"object","properties":{"iframe":{"type":"string","format":"uri"},"public_embed":{"type":"string","format":"uri"},"api":{"type":"string","format":"uri"}}},"days":{"type":"array","items":{"type":"object","properties":{"day":{"type":"integer"},"date":{"type":"string","format":"date"},"activities":{"type":"array","items":{"$ref":"#\/components\/schemas\/Activity"}}}}},"highlights":{"type":"array","items":{"$ref":"#\/components\/schemas\/Highlight"}},"more_info":{"type":"object","properties":{"explanation_categories":{"type":"array","items":{"$ref":"#\/components\/schemas\/Classification"}},"explanation_footer_text":{"$ref":"#\/components\/schemas\/TranslatableValue"},"online":{"type":"object","properties":{"enabled":{"type":"boolean"},"url":{"type":["string","null"],"format":"uri"},"show_recrateam_logo":{"type":"boolean"},"recrateam_logo_url":{"type":["string","null"],"format":"uri"}}},"practical_information":{"type":"array","items":{"type":"object","properties":{"icon":{"type":["string","null"]},"text":{"$ref":"#\/components\/schemas\/TranslatableValue"}}}}}}}},"Activity":{"type":"object","properties":{"id":{"type":"integer"},"activity_id":{"type":["integer","null"]},"date":{"type":"string","format":"date"},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"},"start_time":{"type":"string","example":"10:00"},"end_time":{"type":"string","example":"11:00"},"duration_minutes":{"type":"integer"},"time_display":{"type":"object","properties":{"mode":{"type":"string","enum":["full","start_only","end_only","hidden","custom_text"]},"text":{"type":["string","null"]}}},"name":{"$ref":"#\/components\/schemas\/TranslatableValue"},"short_description":{"$ref":"#\/components\/schemas\/TranslatableValue"},"long_description":{"$ref":"#\/components\/schemas\/TranslatableValue"},"image_url":{"type":["string","null"],"format":"uri"},"category":{"$ref":"#\/components\/schemas\/Classification"},"age_tag":{"$ref":"#\/components\/schemas\/Classification"},"area":{"$ref":"#\/components\/schemas\/Classification"},"price":{"type":["number","null"]},"show_on_books":{"type":"boolean"},"signup":{"type":"object","properties":{"enabled":{"type":"boolean"},"url":{"type":["string","null"],"format":"uri"},"status":{"type":["string","null"],"enum":["open","not_open","closed","full",null]},"opens_at":{"type":["string","null"],"format":"date-time"},"closes_at":{"type":["string","null"],"format":"date-time"},"max_persons":{"type":["integer","null"]},"registered_persons":{"type":"integer"},"available_spots":{"type":["integer","null"]}}}}},"Classification":{"type":["object","null"],"properties":{"id":{"type":"integer"},"name":{"$ref":"#\/components\/schemas\/TranslatableValue"},"explanation":{"$ref":"#\/components\/schemas\/TranslatableValue"},"cta":{"$ref":"#\/components\/schemas\/TranslatableValue"},"image_url":{"type":["string","null"],"format":"uri"}}},"ClassificationItem":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"$ref":"#\/components\/schemas\/TranslatableValue"}}},"Highlight":{"type":"object","properties":{"type":{"type":"string","enum":["theme","activity"]},"id":{"type":["integer","null"]},"name":{"$ref":"#\/components\/schemas\/TranslatableValue"},"header":{"$ref":"#\/components\/schemas\/TranslatableValue"},"description":{"$ref":"#\/components\/schemas\/TranslatableValue"},"image_url":{"type":["string","null"],"format":"uri"},"program_activity_id":{"type":["integer","null"]}}}}}}