{ "$schema": "http://json-schema.org/draft-07/schema", "description": "Freifunk Community API 0.5.2", "type": "object", "definitions": { "city": { "type": "string", "title": "City", "description": "Name of the city" }, "country": { "type": "string", "title": "Country", "description": "Your country, list has been taken from http://countrylist.net/de/", "enum": ["", "AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AC","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","IO","BN","BG","BF","BI","KH","CM","CA","IC","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DG","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","EU","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","AN","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","SH","KN","LC","PM","VC","WS","SM","ST","SA","NT","SN","CS","SC","SL","SG","SK","SI","SB","SO","ZA","GS","SU","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TA","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"] }, "address": { "type":"object", "description": "The address of the place you meet", "properties": { "name": { "type": "string", "title": "Name of your place", "description": "The name of the place you meet" }, "street": { "type": "string", "title": "Street", "description": "The street address of your meeting place" }, "zipcode": { "type": "string", "title": "ZIP", "description": "The zip code of your meeting place" } }, "additionalProperties": false }, "geoCode" :{ "type": "object", "properties":{ "lat": { "type": "number", "title": "Latitude", "description": "Lattitude of your city in decimal degrees" }, "lon": { "type": "number", "title": "Longitude", "description": "Longitude of your city in decimal degrees" } }, "required": ["lat", "lon"], "additionalProperties": false }, "email": { "type": "string", "title": "Email", "format": "email", "pattern": "^[A-Za-z0-9äöüÄÖUß_\\-\\.]+@[A-Za-z0-9äöüÄÖUß_\\-\\.]+\\.[A-Za-z]{2,}$" }, "url": { "type": "string", "pattern": "^(http|https)://[A-Za-z0-9ÄÖÜäöüß\\-_\\./]+" }, "phone": { "type": "string", "title": "Phone" } }, "properties": { "api": { "type": "string", "title": "API", "description": "The Freifunk Community API version you use", "enum": ["0.1", "0.2.0", "0.2.1", "0.3.0", "0.3.1", "0.3.2", "0.4.0", "0.4.1", "0.4.2", "0.4.3", "0.4.4", "0.4.5", "0.4.6", "0.4.7", "0.4.8", "0.4.9", "0.4.10", "0.4.11", "0.4.12", "0.4.13", "0.4.14", "0.4.15", "0.4.16", "0.5.0", "0.5.1", "0.5.2"], "default": "0.5.2" }, "name": { "type": "string", "title": "Name", "description": "The name of your community" }, "metacommunity": { "type": "string", "title": "Metacommunity", "description": "The name of your metacommunity, if your local community belongs to a bigger one" }, "location": { "title": "Primary Location", "type": "object", "description": "Position data such as a postal address or geographic coordinates", "properties": { "city": { "$ref": "#/definitions/city" }, "country": { "$ref": "#/definitions/country" }, "address": { "$ref": "#/definitions/address" }, "geoCode": { "$ref": "#/definitions/geoCode" }, "additionalLocations": { "type": "array", "title": "Additional Locations", "description": "Add some more locations where your community is active.", "items": { "title": "Location", "type": "object", "properties": { "city": { "$ref": "#/definitions/city" }, "country": { "$ref": "#/definitions/country" }, "address": { "$ref": "#/definitions/address" }, "geoCode": { "$ref": "#/definitions/geoCode" } }, "required": ["city", "geoCode"], "additionalProperties": false } } }, "required": ["city", "geoCode"], "additionalProperties": false }, "contact": { "type": "object", "minProperties": 1, "properties": { "email": { "$ref": "#/definitions/email", "title": "Email", "description": "Email address to which other people can contact your community (user@domain.com)" }, "facebook": { "type": "string", "title": "facebook", "description": "URL to your community's facebook account (https://facebook.com/...)", "pattern": "^(http|https)://([a-z\\-]*\\.|)facebook\\.com/[A-Za-z0-9ÄÖÜäöüß\\-_\\.]+" }, "identica": { "type": "string", "title": "identica", "description": "URL to your community's identica account (https://identi.ca/...)", "pattern": "^(http|https)://([a-z\\-]*\\.|)identi\\.ca/[A-Za-z0-9ÄÖÜäöüß\\-_\\.]+" }, "irc": { "type":"string", "title": "IRC", "description": "Your community's ICR channel; starts with irc://", "pattern": "^(irc|ircs)://.*" }, "jabber": { "type": "string", "title": "Jabber", "description": "A jabber account someone reads (account@jabberserver.tld)", "pattern": "^[A-Za-z0-9äöüÄÖUß_\\-\\.]+@[A-Za-z0-9äöüÄÖUß_\\-\\.]+\\.[A-Za-z]{2,}(\\?join){0,1}$" }, "ml": { "type": "string", "title": "Mailinglist", "description": "The email address (user@domain.com) of your mailing list or a link to the mailinglist info page (http{s}://...)", "pattern": "^([A-Za-z0-9äöüÄÖUß_\\-\\.]+@[A-Za-z0-9äöüÄÖUß_\\-\\.]+\\.[A-Za-z]{2,}|(http|https)://[A-Za-z0-9ÄÖÜäöüß\\-_\\./]+)$" }, "googleplus": { "type": "string", "title": "Google+", "description": "URL to your community's g+ account (https://plus.google.com/...)", "pattern": "^(http|https)://plus\\.google\\.com/[A-Za-z0-9ÄÖÜäöüß\\+\\-\\./_]+" }, "matrix": { "type": "string", "title": "Matrix", "description": "URL to your community's matrix channel (https://matrix.to/#/!...)", "pattern": "^https://matrix\\.to/#/" }, "mastodon": { "title": "Mastodon", "$ref": "#/definitions/url", "description": "URL to your community's mastodon profile (https://...)" }, "twitter": { "type": "string", "title": "Twitter", "description": "Your community's Twitter name (starts with @)", "pattern": "^@[A-Za-z0-9_\\-]{1,15}" }, "webform": { "$ref": "#/definitions/url", "title": "Webform", "description": "URL to your community's contact form (http{s}://...)" }, "phone": { "$ref": "#/definitions/phone", "title": "Phone", "description": "If your community has a phone number (e.g. +49 1234 567890 based on the E.123 notation)" } }, "additionalProperties": false }, "url": { "title": "HomePage", "$ref": "#/definitions/url", "description": "The main website (http{s}://...)" }, "timeline": { "type": "array", "description": "These are lifetime events something like date of birth (and rebirth :-) of your community or other important milestones", "items": { "type": "object", "properties": { "description": { "type": "string", "title": "Description", "description": "Description of your lifetime event" }, "timestamp": { "type": "string", "title": "Timestamp", "format": "date", "description": "ISO 8601 timestamp of the event's date (format yyyy-mm-dd)", "pattern": "^([0-9]{4})(?:-?W([0-9]+)(?:-?([0-9]+)D?)?|(?:-([0-9]+))?-([0-9]+))(?:[T ]([0-9]+):([0-9]+)(?::([0-9]+)(?:\\.([0-9]+))?)?)?(?:Z(-?[0-9]*))?" }, "url": { "$ref": "#/definitions/url", "title": "URL", "description": "URL to details of this timeline-element" } }, "additionalProperties": false } }, "feeds": { "type": "array", "title": "Feeds", "description": "Feeds you provide your community", "items": { "type": "object", "properties": { "name": { "type": "string", "title": "Feed name", "description": "Name of the feed" }, "category": { "type": "string", "title": "Feed category", "description": "Category of the feed like blog entries, calendars, forum messages, wiki articles, ...", "enum": ["blog", "forum", "ics", "podcast", "wiki", "others", ""], "default": "" }, "type": { "type": "string", "title": "Feed Type", "description": "Type of the feed like RSS, Atom, XML" }, "url": { "$ref": "#/definitions/url", "title": "URL", "description": "URL of the feed" } }, "additionalProperties": false } }, "state": { "type": "object", "title": "States", "description": "A collection of status-related data. Actual open/closed status, icons, last change timestamp etc.", "properties": { "nodes": { "type": "integer", "minimum": 0, "title": "Active Nodes", "description": "Number of active nodes. This field is predestined to be updated regularly, please see sample solutions for Gluon or OLSR" }, "lastchange": { "type":"string", "title": "Last Change", "format": "date-time", "description": "At what ISO 8601 timestamp has your community status lastly changed?", "default": 0 }, "message": { "type": "string", "title": "Message", "description": "A free-form string something like 'open for public', 'members only' or whatever you want it to be)" }, "description": { "type":"string", "title": "Description", "description": "Describe your community in a few lines" }, "focus": { "type": "array", "title": "Focus", "description": "What's the focus of your local community?", "items": { "type": "string", "title": "option", "enum": ["infrastructure/backbone", "Public Free Wifi", "Social Community Building", "Local services and content", "Free internet access" ] } } }, "required": [ "lastchange" ], "additionalProperties": false }, "nodeMaps": { "type": "array", "title": "Nodes", "description": "Maps of nodes or topology your community provides", "items": { "type": "object", "title": "node", "properties": { "url": { "$ref": "#/definitions/url", "title": "URL of the map", "description": "The URL where the map is located" }, "interval": { "type": "string", "title": "interval", "description": "How often the map will be refreshed" }, "technicalType": { "type": "string", "title": "map techincal type", "description": "The kind of map is used", "enum": [ "", "ffmap", "ffsomething", "olsr-dot", "openwifimap", "netmon", "libremap", "nodewatcher", "kml", "nodelist", "meshviewer", "hopglass" ], "default": "" }, "mapType": { "type": "string", "title": "Maptype", "description": "", "enum": [ "", "geographical", "structural", "list/status" ], "default": "" } }, "additionalProperties": false } }, "services": { "type": "array", "title": "Services", "description": "Services Provided by your community", "items": { "type": "object", "properties": { "serviceName": { "type": "string", "title": "Service Name", "description": "Name of your service (e.g. jabber...)" }, "serviceDescription": { "type": "string", "title": "Service Description", "description": "Describe your service" }, "externalUri": { "type": "string", "title": "External URI", "description": "URI to use your service from the internet" }, "internalUri": { "type": "string", "title": "Internal URI", "description": "URI to use your service from Freifunk or icvpn-networks" } }, "additionalProperties": false } }, "support": { "type": "object", "title": "Support for your community", "properties": { "club": { "type": "object", "title": "Supporting Club", "properties": { "name": { "type": "string", "title": "Club Name", "description": "Name of the Club" }, "street": { "type": "string", "title": "Street", "description": "Address - Street" }, "zip": { "type": "string", "title": "ZIP", "description": "Address - ZIP" }, "city": { "$ref": "#/definitions/city" }, "url": { "$ref": "#/definitions/url", "title": "HomePage", "description": "The club's website (http{s}://...)" }, "email": { "$ref": "#/definitions/email", "description": "Email address to contact the club (user@domain.com)" }, "board": { "type": "array", "title": "Board Members", "description": "Who are the board members of the club?", "items": { "type": "string", "title": "Name" } } }, "additionalProperties": false }, "donations": { "type": "object", "title": "Donations", "properties": { "bankaccount": { "type": "object", "title": "Bank Account", "properties": { "IBAN": { "type": "string", "title": "IBAN" }, "BIC": { "type": "string", "title": "BIC" }, "usage": { "type": "string", "title": "Usage of the donations", "description": "Please use this string as transfer-purpose to define a special usage of your donation." } }, "additionalProperties": false }, "campaigns": { "type": "array", "title": "Campaigns", "items": { "type": "object", "title": "campaign", "properties": { "provider": { "type": "string", "title": "Campaign Providers", "description": "Where do you host your donations?", "enum": [ "", "betterplace", "boost" ], "default": "" }, "projectid": { "type": "string", "title": "Project ID", "description": "ID of your project, Betterplace-IDs are multiple digits and can be found within the URL" } }, "additionalProperties": false } } }, "additionalProperties": false } }, "additionalProperties": false }, "socialprojects": { "type": "object", "title": "", "properties": { "number": { "type": "integer", "mininum": 0, "title": "Number of Projects", "description": "Number of projects supported by your Community" }, "website": { "$ref": "#/definitions/url", "title": "URL of your page", "description": "A link to a web site where people can find an overview over your projects" }, "contact": { "$ref": "#/definitions/email", "title": "Contact Email", "description": "Please provide an email address to contact you on refugees and social projects" } }, "additionalProperties": false }, "privacy": { "type": "object", "title": "Privacy Policy", "properties": { "policyurl": { "$ref": "#/definitions/url", "title": "Privacy Policy URL", "description": "URL to your privacy policy description" } }, "additionalProperties": false }, "techDetails": { "type": "object", "description": "Technical details of your community's Freifunk implementation", "properties": { "firmware": { "type": "object", "properties": { "url": { "$ref": "#/definitions/url", "title": "Firmware download", "description": "Link to your firmware images" }, "docs": { "$ref" : "#/definitions/url", "title": "Firmware Document", "description": "Link to your firmware docs" }, "vpnaccess": { "type": "string", "title": "VPN Access", "description": "How to access your VPN services", "enum": [ "", "automatic", "fwimage", "mail", "webform", "else" ], "default": "" }, "registrationurl": { "$ref": "#/definitions/url", "title": "VPN Registration URL", "description": "link to your website to request a new VPN key" }, "orgrestrictions": { "type": "string", "title": "Organizational Restrictions", "description": "Are there any organizational restrictions when using/installing your firmware?" }, "techrestrictions": { "type": "string", "title": "Technical Restriction", "description": "Are there any technical restrictions like hardware?" }, "name": { "type":"string", "title": "Firmware Name", "description": "Name of your firmware" } }, "additionalProperties": false }, "dns": { "type": "array", "title": "DNS Servers", "description": "DNS servers for domains used by your community", "items": { "type": "object", "title": "dns", "properties": { "domainname": { "type": "string", "title": "Domain Name", "description": "The domain name (e.g. ffhh, ffol)", "pattern": "^[A-Za-z0-9äöüÄÖÜß\\.\\-\\_]{2,}$" }, "nameserver": { "type": "array", "title": "Nameserver", "description": "Nameservers servings zones of your domain", "items": { "type": "string", "pattern": "^[A-Za-z0-9äöüÄÖÜß_\\-\\.:]*$" } } }, "additionalProperties": false } }, "networks": { "type": "object", "description": "Networks used by your community", "properties": { "ipv6": { "type": "array", "title": "IPv6 networks", "description": "IPv6 networks used by your community", "items": { "type": "object", "title": "ipv6 network object", "properties": { "network": { "type": "string", "description": "IPv6 network network (e.g.2620:0:2d0:200::7/32) in CIDR notation", "pattern": "^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*(\\/(\\d|\\d\\d|1[0-1]\\d|12[0-8]))$" } }, "additionalProperties": false } }, "ipv4": { "type": "array", "description": "IPv4 networks used by your community", "items": { "type": "object", "title": "ipv4 network object", "properties": { "network": { "type": "string", "description": "IPv4 network name (e.g. 10.w.x.y/z) in CIDR notation", "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(\\d|[1-2]\\d|3[0-2]))$" } }, "additionalProperties": false } } }, "additionalProperties": false }, "routing": { "type": "array", "title": "Routing protocols", "description": "Routing protocols used within your community", "items": { "type": "string", "title": "option", "enum": [ "802.11s", "Babel", "batman-adv", "bmx6", "bmxd", "cjdns", "OLSR", "OLSRv2" ] } }, "legals": { "type": "array", "title": "Legal Issues", "description": "What do you use to handle legal issues, e.g. the German Störerhaftung or restrictions in your country?", "items": { "type": "string", "title": "option", "enum": [ "nothing", "vpnnational", "vpninternational", "zappscript", "p2pblock", "splashpage", "termsconditions", "anonymizer", "institutions" ] } }, "updatemode": { "type": "array", "title": "Updatemode", "description": "How do you deploy firmware updates?", "items": { "type": "string", "title": "option", "enum": [ "none", "manual", "autoupdate" ] } } }, "additionalProperties": false } }, "required": ["name", "location", "contact", "url", "state", "techDetails" ], "additionalProperties": false }