{"id":9603,"date":"2026-06-15T12:10:40","date_gmt":"2026-06-15T12:10:40","guid":{"rendered":"https:\/\/perma.earth\/join-us-in-shaping-this-map\/"},"modified":"2026-07-03T14:55:41","modified_gmt":"2026-07-03T14:55:41","slug":"join-us-in-shaping-this-map","status":"publish","type":"page","link":"https:\/\/perma.earth\/de\/join-us-in-shaping-this-map\/","title":{"rendered":"Ver\u00f6ffentlichen Sie Ihr Profil"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Most organisations join the map the easy way \u2014 by <a href=\"https:\/\/perma.earth\/add-your-organisation\/\">adding your organisation<\/a> through our form, with no code at all. This page is for the permaculture networks and developers who would rather publish and host their own <a href=\"https:\/\/murmurations.network\">Murmurations<\/a> profiles, and keep their data entirely in their own hands.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This guide is for the regional permaculture networks and organisations who would like their data to appear on the International Permaculture CoLab map \u2014 and, because of the way it works, on any other map built on the <a href=\"https:\/\/murmurations.network\">Murmurations<\/a> protocol at the same time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The idea behind it is a simple one. You publish your data once, in an open format, and you keep hold of it. We (and anyone else) gather it onto our maps. When you change your data, every map that lists you changes too. You never end up filling in someone else&#8217;s database.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"how-it-works-in-three-steps\" class=\"wp-block-heading\">How it works, in three steps<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>1. Describe each organisation as a Murmurations PROFILE (a small JSON document)\n2. HOST that profile at a stable URL you control\n3. SUBMIT the profile's URL to the Murmurations INDEX\n                        \u2502\n                        \u25bc\n   We query the index for the tags we trust \u2192 fetch your profile \u2192 it appears on our map<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There is no account to open with us, and no API key to look after. You stay the source of truth, and the index simply points back to you.<\/p>\n\n\n\n<h3 id=\"the-one-thing-that-links-you-to-our-map-a-tag\" class=\"wp-block-heading\">The one thing that links you to our map: a tag<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Our map gathers the profiles that carry a tag we have agreed with you. <a href=\"https:\/\/perma.earth\/connect\/\">Ask us<\/a> for your network&#8217;s tag \u2014 something along the lines of <code>pc-network:permaculture-britain<\/code> \u2014 and add it to your profile&#8217;s <code>tags<\/code> array. That tag is what tells our aggregator, &#8220;this profile belongs on the permaculture map.&#8221;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Do you hold data that no schema covers yet, such as soil type or average rainfall? Have a look at <a href=\"#extending-with-your-own-data\">Extending with your own data<\/a> further down. Our map renders any documented field automatically, and we are glad to help you standardise it so that other networks settle on the same approach.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"would-you-rather-not-hand-write-json\" class=\"wp-block-heading\">Would you rather not hand-write JSON?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You do not have to write JSON or run a server to take part. There are several gentler ways in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest is our own <a href=\"https:\/\/perma.earth\/add-your-organisation\/\">Add your organisation<\/a> form. Fill it in, and once one of our moderators has had a look, your organisation appears on the map. No code, no hosting, and nothing to maintain afterwards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you would rather use the wider Murmurations tooling (part of <strong>MurmurMaps<\/strong>), there are hosted options too:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>One organisation \u2014 the Profile Generator.<\/strong> Fill in the web form at <a href=\"https:\/\/murmurmaps.murmurations.network\/profile-generator\">https:\/\/murmurmaps.murmurations.network\/profile-generator<\/a>, choose the schemas, and it both hosts the profile and submits it to the index for you. You get an editable profile you can return to and update, with no website or server of your own required.<\/li>\n\n\n\n<li><strong>A whole network at once \u2014 the Batch Importer.<\/strong> Upload a CSV at <a href=\"https:\/\/murmurmaps.murmurations.network\/batch-importer\">https:\/\/murmurmaps.murmurations.network\/batch-importer<\/a> and it validates, hosts and submits every row. A few rules apply:\n<ul class=\"wp-block-list\">\n<li>Up to <strong>1,000 rows<\/strong> per batch.<\/li>\n\n\n\n<li>The <strong>first column must be <code>oid<\/code><\/strong> \u2014 a stable, unique ID for each organisation that you never reassign, since it is how later updates are matched.<\/li>\n\n\n\n<li><strong>Column headers must match schema field names<\/strong> exactly. Nested fields use dot notation (<code>geolocation.lat<\/code>); arrays use bracket notation (<code>tags[0]<\/code>, <code>urls[0].url<\/code>).<\/li>\n\n\n\n<li>To update later, re-upload a revised CSV with the same <code>oid<\/code>s.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Already have JSON hosted? \u2014 the Index Updater.<\/strong> Paste a profile URL at <a href=\"https:\/\/murmurmaps.murmurations.network\/index-updater\">https:\/\/murmurmaps.murmurations.network\/index-updater<\/a> to submit it or refresh it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">These hosted tools are the easiest way to begin, though they do mean that someone else holds your data. Hosting the JSON on your own domain \u2014 which is what the rest of this guide covers \u2014 gives you the most control, and the strongest claim to your own organisation&#8217;s entry. Choose whichever fits your network&#8217;s capacity.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"the-schemas\" class=\"wp-block-heading\">The schemas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A profile declares which <strong>schemas<\/strong> it follows in <code>linked_schemas<\/code>. A permaculture organisation should link <strong>both<\/strong> of these:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Schema<\/th><th>Purpose<\/th><th>Library URL<\/th><\/tr><\/thead><tbody><tr><td><code>organizations_schema-v1.0.0<\/code><\/td><td>The base identity of any group, project or organisation<\/td><td><a href=\"https:\/\/library.murmurations.network\/v2\/schemas\/organizations_schema-v1.0.0\">https:\/\/library.murmurations.network\/v2\/schemas\/organizations_schema-v1.0.0<\/a><\/td><\/tr><tr><td><code>permaculture_addon_schema-v1.0.0<\/code><\/td><td>Permaculture-specific fields<\/td><td><a href=\"https:\/\/library.murmurations.network\/v2\/schemas\/permaculture_addon_schema-v1.0.0\">https:\/\/library.murmurations.network\/v2\/schemas\/permaculture_addon_schema-v1.0.0<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 id=\"organizations-schema-v100-fields\" class=\"wp-block-heading\"><code>organizations_schema-v1.0.0<\/code> fields<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Required:<\/strong> <code>linked_schemas<\/code>, <code>name<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Type<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td><code>linked_schemas<\/code><\/td><td>array&lt;string&gt;<\/td><td><strong>Required.<\/strong> List every schema you link, e.g. <code>[\"organizations_schema-v1.0.0\",\"permaculture_addon_schema-v1.0.0\"]<\/code><\/td><\/tr><tr><td><code>name<\/code><\/td><td>string<\/td><td><strong>Required.<\/strong> The organisation&#8217;s name<\/td><\/tr><tr><td><code>nickname<\/code><\/td><td>string<\/td><td>Short or alternate name<\/td><\/tr><tr><td><code>primary_url<\/code><\/td><td>string<\/td><td>Your website. <strong>Strongly recommended<\/strong> \u2014 we use it to recognise the same organisation across networks (deduplication)<\/td><\/tr><tr><td><code>tags<\/code><\/td><td>array&lt;string&gt;<\/td><td>Keywords and types. <strong>Put your agreed network tag here<\/strong> so that we gather you<\/td><\/tr><tr><td><code>urls<\/code><\/td><td>array&lt;object&gt;<\/td><td>Other links: <code>{ \"name\": \"Facebook\", \"url\": \"https:\/\/\u2026\" }<\/code><\/td><\/tr><tr><td><code>description<\/code><\/td><td>string<\/td><td>A paragraph about the organisation<\/td><\/tr><tr><td><code>mission<\/code><\/td><td>string<\/td><td>Mission or purpose<\/td><\/tr><tr><td><code>status<\/code><\/td><td>string (enum)<\/td><td><code>active<\/code> \u00b7 <code>completed<\/code> \u00b7 <code>cancelled<\/code> \u00b7 <code>on_hold<\/code> \u00b7 <code>in_planning<\/code><\/td><\/tr><tr><td><code>full_address<\/code><\/td><td>string<\/td><td>Postal address<\/td><\/tr><tr><td><code>country_iso_3166<\/code><\/td><td>string (enum)<\/td><td>Two-letter country code, e.g. <code>GB<\/code>, <code>KE<\/code>, <code>IN<\/code><\/td><\/tr><tr><td><code>geolocation<\/code><\/td><td>object<\/td><td><code>{ \"lat\": &lt;number&gt;, \"lon\": &lt;number&gt; }<\/code> \u2014 <strong>needed to appear on the map<\/strong><\/td><\/tr><tr><td><code>image<\/code><\/td><td>string<\/td><td>Logo URL<\/td><\/tr><tr><td><code>header_image<\/code><\/td><td>string<\/td><td>Banner URL<\/td><\/tr><tr><td><code>images<\/code><\/td><td>array&lt;object&gt;<\/td><td>More images<\/td><\/tr><tr><td><code>rss<\/code><\/td><td>string<\/td><td>RSS feed URL<\/td><\/tr><tr><td><code>relationships<\/code><\/td><td>array&lt;object&gt;<\/td><td>Links to other Murmurations profiles<\/td><\/tr><tr><td><code>starts_at<\/code> \/ <code>ends_at<\/code><\/td><td>number<\/td><td>Unix timestamps (for time-bound entities)<\/td><\/tr><tr><td><code>contact_details<\/code><\/td><td>object<\/td><td><code>{ \"email\": \"hi@org.example\", \"contact_form\": \"https:\/\/org.example\/contact\" }<\/code><\/td><\/tr><tr><td><code>telephone<\/code><\/td><td>string<\/td><td>Phone number<\/td><\/tr><tr><td><code>geographic_scope<\/code><\/td><td>string (enum)<\/td><td><code>local<\/code> \u00b7 <code>regional<\/code> \u00b7 <code>national<\/code> \u00b7 <code>international<\/code><\/td><\/tr><tr><td><code>unique_id<\/code><\/td><td>string<\/td><td>A stable ID you control. If present, we use it as the strongest deduplication key<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 id=\"permaculture-addon-schema-v100-fields\" class=\"wp-block-heading\"><code>permaculture_addon_schema-v1.0.0<\/code> fields<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Required:<\/strong> <code>linked_schemas<\/code> (already covered above).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Type<\/th><th>Notes \/ allowed values<\/th><\/tr><\/thead><tbody><tr><td><code>org_type<\/code><\/td><td>array&lt;string&gt; (enum)<\/td><td><code>Association<\/code> \u00b7 <code>Network<\/code> \u00b7 <code>Group<\/code> \u00b7 <code>Project<\/code> \u00b7 <code>Permaculture school or academy<\/code> \u00b7 <code>Permaculture designers' organisation or cooperative<\/code> \u00b7 <code>Other organisation<\/code><\/td><\/tr><tr><td><code>permaculture_domains<\/code><\/td><td>array&lt;string&gt; (enum)<\/td><td><code>Built Environment<\/code> \u00b7 <code>Culture and Education<\/code> \u00b7 <code>Health and Wellbeing<\/code> \u00b7 <code>Finance and Economics<\/code> \u00b7 <code>Land and Nature Stewardship<\/code> \u00b7 <code>Land Tenure and Community Governance<\/code> \u00b7 <code>Tools and Technology<\/code><\/td><\/tr><tr><td><code>ways_to_get_involved<\/code><\/td><td>array&lt;string&gt; (enum)<\/td><td><code>Join as a member<\/code> \u00b7 <code>Volunteer<\/code> \u00b7 <code>Donate<\/code> \u00b7 <code>Visit us<\/code> \u00b7 <code>Buy our products or services<\/code> \u00b7 <code>Enrol in our activities<\/code> \u00b7 <code>Other - see our website or social media for details<\/code><\/td><\/tr><tr><td><code>purpose<\/code><\/td><td>string<\/td><td>Free text<\/td><\/tr><tr><td><code>number_of_members<\/code><\/td><td>number<\/td><\/tr><tr><td><code>number_of_beneficiaries<\/code><\/td><td>number<\/td><\/tr><tr><td><code>geographic_scope_description<\/code><\/td><td>string<\/td><td>Free text describing your reach<\/td><\/tr><tr><td><code>leadership_tags<\/code><\/td><td>array&lt;string&gt;<\/td><td>Free tags describing leadership<\/td><\/tr><tr><td><code>date_added<\/code><\/td><td>number<\/td><td>Unix timestamp<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Enum values must match <strong>exactly<\/strong>, including the capitalisation and the apostrophe in <code>designers'<\/code>. Anything outside the list will fail validation.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"a-complete-example-profile\" class=\"wp-block-heading\">A complete example profile<\/h2>\n\n\n\n<pre class=\"wp-block-code language-json\"><code class=\"language-json\">{\n  &quot;linked_schemas&quot;: [\n    &quot;organizations_schema-v1.0.0&quot;,\n    &quot;permaculture_addon_schema-v1.0.0&quot;\n  ],\n  &quot;name&quot;: &quot;Permaculture Association Britain&quot;,\n  &quot;nickname&quot;: &quot;PAB&quot;,\n  &quot;primary_url&quot;: &quot;https:\/\/www.permaculture.org.uk&quot;,\n  &quot;description&quot;: &quot;The membership charity supporting permaculture across Britain.&quot;,\n  &quot;tags&quot;: [&quot;permaculture&quot;, &quot;pc-network:permaculture-britain&quot;],\n  &quot;urls&quot;: [\n    { &quot;name&quot;: &quot;Forum&quot;, &quot;url&quot;: &quot;https:\/\/www.permaculture.org.uk\/forums&quot; }\n  ],\n  &quot;country_iso_3166&quot;: &quot;GB&quot;,\n  &quot;geolocation&quot;: { &quot;lat&quot;: 51.5074, &quot;lon&quot;: -0.1278 },\n  &quot;image&quot;: &quot;https:\/\/www.permaculture.org.uk\/logo.png&quot;,\n  &quot;contact_details&quot;: { &quot;email&quot;: &quot;hello@permaculture.org.uk&quot; },\n  &quot;geographic_scope&quot;: &quot;national&quot;,\n  &quot;status&quot;: &quot;active&quot;,\n  &quot;unique_id&quot;: &quot;pab-uk&quot;,\n  &quot;org_type&quot;: [&quot;Association&quot;, &quot;Network&quot;],\n  &quot;permaculture_domains&quot;: [&quot;Culture and Education&quot;, &quot;Land and Nature Stewardship&quot;],\n  &quot;ways_to_get_involved&quot;: [&quot;Join as a member&quot;, &quot;Volunteer&quot;, &quot;Donate&quot;]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The two linked schemas are merged into one flat object, which is why the organisation fields and the permaculture addon fields sit side by side.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"hosting-the-profile\" class=\"wp-block-heading\">Hosting the profile<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Serve that JSON at a <strong>stable, publicly reachable URL<\/strong> that you control, with <code>Content-Type: application\/json<\/code>. Any of these will do:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A static file on your site, such as <code>https:\/\/your-org.example\/murmurations.json<\/code><\/li>\n\n\n\n<li>A CMS endpoint or serverless function that returns the JSON<\/li>\n\n\n\n<li>A file generated in your CI\/CD pipeline<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you publish <strong>many<\/strong> organisations \u2014 a network with dozens of members \u2014 give each one its own URL, for example <code>https:\/\/your-network.example\/murmurations\/{slug}.json<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"submitting-to-the-index\" class=\"wp-block-heading\">Submitting to the index<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tell the Murmurations Index where your profile lives. It will fetch it, validate it, and begin serving it to aggregators, ourselves included.<\/p>\n\n\n\n<pre class=\"wp-block-code language-http\"><code class=\"language-http\">POST https:\/\/index.murmurations.network\/v2\/nodes\nContent-Type: application\/json\n{ &quot;profile_url&quot;: &quot;https:\/\/your-org.example\/murmurations.json&quot; }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful response returns a <code>node_id<\/code> (the SHA-256 of your <code>profile_url<\/code>) and a <code>status<\/code>. You can check it at any time:<\/p>\n\n\n\n<pre class=\"wp-block-code language-http\"><code class=\"language-http\">GET https:\/\/index.murmurations.network\/v2\/nodes\/{node_id}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Validate first \u2014 it saves a lot of bother.<\/strong> You can check a profile <em>before<\/em> you host or submit anything by sending the <strong>full profile JSON<\/strong> (not a URL) to the validator:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code language-http\"><code class=\"language-http\">  POST https:\/\/index.murmurations.network\/v2\/validate\n  Content-Type: application\/json\n  { \u2026your full profile JSON, including linked_schemas\u2026 }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It returns either success or a list of precise, field-level errors, each with a JSON Pointer such as <code>\/geolocation\/lat<\/code>. No hosting is required.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Updating.<\/strong> Edit your hosted JSON, then <strong>submit the same <code>profile_url<\/code> again<\/strong> \u2014 re-submitting is what makes the index re-fetch. This matters: the index does not poll healthy profiles on a schedule, so an edit to your file is not picked up until you re-submit. Re-submitting unchanged content does no harm, and will not bump your timestamp.<\/li>\n\n\n\n<li><strong>Removing.<\/strong> Take the profile offline so that its URL stops returning the JSON (a <code>404<\/code> is the usual way), <strong>then<\/strong> call <code>DELETE https:\/\/index.murmurations.network\/v2\/nodes\/{node_id}<\/code>. The index checks the URL first and will refuse while the profile is still being served. Alternatively, set an <code>expires<\/code> field (a Unix timestamp) in the profile, and the index removes it automatically once that time passes. Either way, it then disappears from the maps that aggregate it, ours included.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">You can rehearse all of this safely. There is a full test environment \u2014 <code>https:\/\/test-index.murmurations.network\/v2<\/code> for validating and submitting, and <code>https:\/\/test-library.murmurations.network\/v2<\/code> for schemas \u2014 so you can try things out without touching production. No account or API key is needed anywhere.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"code-snippets\" class=\"wp-block-heading\">Code snippets<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each snippet (a) builds a profile object and (b) submits its hosted URL to the index. Adapt the <code>profile<\/code> to your own data, and host the serialised JSON at <code>profileUrl<\/code>.<\/p>\n\n\n\n<h3 id=\"typescript-node\" class=\"wp-block-heading\">TypeScript \/ Node<\/h3>\n\n\n\n<pre class=\"wp-block-code language-typescript\"><code class=\"language-typescript\">type Geo = { lat: number; lon: number };\ninterface PermacultureProfile {\n  linked_schemas: string[];\n  name: string;\n  primary_url?: string;\n  tags?: string[];\n  country_iso_3166?: string;\n  geolocation?: Geo;\n  org_type?: string[];\n  permaculture_domains?: string[];\n  ways_to_get_involved?: string[];\n  unique_id?: string;\n}\nconst profile: PermacultureProfile = {\n  linked_schemas: [&quot;organizations_schema-v1.0.0&quot;, &quot;permaculture_addon_schema-v1.0.0&quot;],\n  name: &quot;Permaculture Association Britain&quot;,\n  primary_url: &quot;https:\/\/www.permaculture.org.uk&quot;,\n  tags: [&quot;permaculture&quot;, &quot;pc-network:permaculture-britain&quot;],\n  country_iso_3166: &quot;GB&quot;,\n  geolocation: { lat: 51.5074, lon: -0.1278 },\n  org_type: [&quot;Association&quot;, &quot;Network&quot;],\n  permaculture_domains: [&quot;Culture and Education&quot;],\n  ways_to_get_involved: [&quot;Join as a member&quot;, &quot;Volunteer&quot;],\n  unique_id: &quot;pab-uk&quot;,\n};\n\/\/ 1. Host JSON.stringify(profile) at this URL yourself, then:\nconst profileUrl = &quot;https:\/\/www.permaculture.org.uk\/murmurations.json&quot;;\n\/\/ 2. Register it with the index.\nconst res = await fetch(&quot;https:\/\/index.murmurations.network\/v2\/nodes&quot;, {\n  method: &quot;POST&quot;,\n  headers: { &quot;Content-Type&quot;: &quot;application\/json&quot; },\n  body: JSON.stringify({ profile_url: profileUrl }),\n});\nconsole.log(res.status, await res.json());<\/code><\/pre>\n\n\n\n<h3 id=\"python\" class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<pre class=\"wp-block-code language-python\"><code class=\"language-python\">import json\nimport requests\nprofile = {\n    &quot;linked_schemas&quot;: [\n        &quot;organizations_schema-v1.0.0&quot;,\n        &quot;permaculture_addon_schema-v1.0.0&quot;,\n    ],\n    &quot;name&quot;: &quot;Permaculture Association Britain&quot;,\n    &quot;primary_url&quot;: &quot;https:\/\/www.permaculture.org.uk&quot;,\n    &quot;tags&quot;: [&quot;permaculture&quot;, &quot;pc-network:permaculture-britain&quot;],\n    &quot;country_iso_3166&quot;: &quot;GB&quot;,\n    &quot;geolocation&quot;: {&quot;lat&quot;: 51.5074, &quot;lon&quot;: -0.1278},\n    &quot;org_type&quot;: [&quot;Association&quot;, &quot;Network&quot;],\n    &quot;permaculture_domains&quot;: [&quot;Culture and Education&quot;],\n    &quot;ways_to_get_involved&quot;: [&quot;Join as a member&quot;, &quot;Volunteer&quot;],\n    &quot;unique_id&quot;: &quot;pab-uk&quot;,\n}\n# 1. Host this JSON at a URL you control:\nwith open(&quot;murmurations.json&quot;, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:\n    json.dump(profile, f, ensure_ascii=False, indent=2)\nprofile_url = &quot;https:\/\/www.permaculture.org.uk\/murmurations.json&quot;\n# 2. Submit it to the index:\nres = requests.post(\n    &quot;https:\/\/index.murmurations.network\/v2\/nodes&quot;,\n    json={&quot;profile_url&quot;: profile_url},\n    timeout=15,\n)\nprint(res.status_code, res.json())<\/code><\/pre>\n\n\n\n<h3 id=\"php\" class=\"wp-block-heading\">PHP<\/h3>\n\n\n\n<pre class=\"wp-block-code language-php\"><code class=\"language-php\">&lt;?php\n$profile = [\n    &#039;linked_schemas&#039; =&gt; [\n        &#039;organizations_schema-v1.0.0&#039;,\n        &#039;permaculture_addon_schema-v1.0.0&#039;,\n    ],\n    &#039;name&#039; =&gt; &#039;Permaculture Association Britain&#039;,\n    &#039;primary_url&#039; =&gt; &#039;https:\/\/www.permaculture.org.uk&#039;,\n    &#039;tags&#039; =&gt; [&#039;permaculture&#039;, &#039;pc-network:permaculture-britain&#039;],\n    &#039;country_iso_3166&#039; =&gt; &#039;GB&#039;,\n    &#039;geolocation&#039; =&gt; [&#039;lat&#039; =&gt; 51.5074, &#039;lon&#039; =&gt; -0.1278],\n    &#039;org_type&#039; =&gt; [&#039;Association&#039;, &#039;Network&#039;],\n    &#039;permaculture_domains&#039; =&gt; [&#039;Culture and Education&#039;],\n    &#039;ways_to_get_involved&#039; =&gt; [&#039;Join as a member&#039;, &#039;Volunteer&#039;],\n    &#039;unique_id&#039; =&gt; &#039;pab-uk&#039;,\n];\n\/\/ 1. Host this JSON at a URL you control:\nfile_put_contents(&#039;murmurations.json&#039;, json_encode($profile, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));\n$profileUrl = &#039;https:\/\/www.permaculture.org.uk\/murmurations.json&#039;;\n\/\/ 2. Submit it to the index:\n$ch = curl_init(&#039;https:\/\/index.murmurations.network\/v2\/nodes&#039;);\ncurl_setopt_array($ch, [\n    CURLOPT_POST =&gt; true,\n    CURLOPT_HTTPHEADER =&gt; [&#039;Content-Type: application\/json&#039;],\n    CURLOPT_POSTFIELDS =&gt; json_encode([&#039;profile_url&#039; =&gt; $profileUrl]),\n    CURLOPT_RETURNTRANSFER =&gt; true,\n]);\n$response = curl_exec($ch);\necho curl_getinfo($ch, CURLINFO_HTTP_CODE) . &quot;n&quot; . $response . &quot;n&quot;;\ncurl_close($ch);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"deduplication-and-hand-overs\" class=\"wp-block-heading\">Deduplication and hand-overs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If two networks both list the same organisation, our map collapses them into a single entry and shows the <strong>most recently updated<\/strong> profile. It matches them on a shared <code>primary_url<\/code> (normalised) or a shared <code>unique_id<\/code>. A few things follow from that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Always set <code>primary_url<\/code>, and ideally <code>unique_id<\/code> too. It is how we know two entries are the same organisation.<\/li>\n\n\n\n<li>When a regional network takes over an organisation that the CoLab had been listing as a placeholder, the network simply publishes a fresher profile, and it becomes the canonical entry on its own.<\/li>\n\n\n\n<li>If two networks disagree about who should list an organisation, there is no central authority to settle it. The CoLab can help you talk it through, but it cannot overrule a network. In practice the mechanism above tends to settle things: whoever the organisation itself recognises keeps its profile fresh, and the freshest profile is the one shown. If need be, an operator can also pin a particular profile as the canonical one on our own map.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"extending-with-your-own-data\" class=\"wp-block-heading\">Extending with your own data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do you hold data that no existing schema covers \u2014 soil type, average rainfall, climate zone? You have three options, in order of preference.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">A quick note: today&#8217;s <code>permaculture_addon_schema-v1.0.0<\/code> has no environmental or quantitative fields at all \u2014 no soil, rainfall or climate. For data like that there is genuinely no field yet, so option 2 or 3 applies.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Reuse a shared schema if one already exists.<\/strong> Browse the <a href=\"https:\/\/library.murmurations.network\/v2\/schemas\">library<\/a> first. If the field is already standardised, just add that schema to your <code>linked_schemas<\/code>. Our map renders any documented field automatically, so nothing changes on our side.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Propose a new shared schema \u2014 the right long-term path.<\/strong> This is how <code>average_annual_rainfall_mm<\/code> becomes <em>one<\/em> agreed field rather than five incompatible ones. In short: <a href=\"https:\/\/perma.earth\/connect\/\">talk to us<\/a> first, since we steward the permaculture schemas and help the networks converge on shared names; then fork <a href=\"https:\/\/github.com\/MurmurationsNetwork\/MurmurationsLibrary\">MurmurationsLibrary<\/a>, add a draft-07 schema file under <code>\/schemas\/<\/code>, and open a pull request against the <code>test<\/code> branch. It goes live in the test environment when merged, and the maintainers then promote <code>test \u2192 main<\/code> for production. One thing to know: you cannot self-host a schema and point <code>linked_schemas<\/code> at your own URL. <code>linked_schemas<\/code> holds bare schema <em>names<\/em>, which the index resolves only against the central library, so a new shared field always goes through that pull request.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">If you would like a worked example \u2014 taking a soil or rainfall field all the way from &#8220;no field exists&#8221; to &#8220;live on the map&#8221;, with the actual schema file and the steps to test it first \u2014 <a href=\"https:\/\/perma.earth\/connect\/\">get in touch<\/a> and we will walk you through it.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">**3. Need a field on the map <em>today<\/em>, before any schema exists?** Because the schemas do not forbid extra properties, you can add your own fields to a profile (use lowercase, underscore-separated names, e.g. <code>\"average_annual_rainfall_mm\": 850<\/code>) and they will pass validation and be stored. Our detail pages already render any such field with a readable label. Treat this as a stop-gap only: these fields are not schema-validated, other aggregators that read only declared fields will ignore them, and it leans on current index behaviour that is not a guaranteed feature. Tell us which extra fields you are using and we will fast-track standardising them under option 2.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Convergence \u2014 everyone reaching for the same shared schema \u2014 is the whole point. Publish openly, link shared schemas, and your data becomes useful well beyond our one map.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"questions-networks-often-ask\" class=\"wp-block-heading\">Questions networks often ask<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How quickly does my data show up, and how quickly do updates appear?<\/strong> There are two hops, and both are pull-based. First, the index only learns of a change when you re-submit your <code>profile_url<\/code>, since it does not poll healthy profiles. Second, each map re-queries the index on its own schedule \u2014 ours syncs hourly \u2014 so an update reaches our map within roughly an hour of you re-submitting. There is no global push; every aggregator pulls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How do I remove someone, or honour a &#8220;delete my data&#8221; request?<\/strong> Take the profile offline and call <code>DELETE \u2026\/v2\/nodes\/{node_id}<\/code> (see <a href=\"#submitting-to-the-index\">Submitting to the index<\/a>). Deletion stops <em>new<\/em> aggregation and clears the index, but it cannot retract copies a map has already pulled \u2014 those clear when each map next re-syncs. Bear that in mind before publishing people.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can I publish people, projects or events, not just organisations?<\/strong> Yes. Murmurations has other schemas, such as <code>people_schema<\/code>, and our map is schema-agnostic: it will show any profile type, filterable. But personal data is sensitive. The index is fully public, so only publish a person&#8217;s name, contact details or address <strong>with their explicit consent<\/strong>, and publish the minimum needed. Organisation data is unrestricted; member and people data is the publishing network&#8217;s legal responsibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">**How does the CoLab handle privacy and GDPR for the data <em>it<\/em> publishes?** We keep a GDPR policy and a consent tick-box. The CoLab only publishes the personal data of CoLab members who have actively opted in, and only the fields they agreed to. Withdrawing consent is the off-switch: when someone opts out we stop publishing them, take the profile offline, and \u2014 because the whole pipeline refreshes hourly \u2014 their data drops off the maps within about an hour. We can only speak for the slice <em>we<\/em> publish; every other network that publishes people has to run its own equivalent \u2014 a lawful basis to publish, a clear consent step, and a quick way to withdraw. Murmurations itself gives you none of that scaffolding, since the index is just public, so it has to live with the publishing network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Will the CoLab publish my organisation without me asking?<\/strong> No. The CoLab only publishes an organisation&#8217;s profile when the organisation asks us to, and only when it is permaculture-related \u2014 the kind of thing this map is for. We do not scrape or list groups uninvited. (Your own network can of course publish its members under its own tag \u2014 that is between you and them.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What of my data actually appears?<\/strong> On the <a href=\"https:\/\/perma.earth\/global-map\/\">map<\/a>: a pin (which needs <code>geolocation<\/code>) with the name, locality and links. In the directory and on the organisation&#8217;s detail page: every field from your linked schemas, plus any extra fields, each with a readable label.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What if your map \u2014 or the index \u2014 disappears?<\/strong> Your data is portable by design. You host it, and you own it. Any Murmurations-based map can aggregate the same profiles, so you are never locked into us. That is the main reason to publish in this open format rather than fill in someone&#8217;s private database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Who decides my network&#8217;s tag?<\/strong> Nobody owns the tag namespace \u2014 Murmurations tags are just free text, and we cannot (and would not want to) police them. What the CoLab does is recommend a convention, <code>pc-network:&lt;your-network&gt;<\/code> (for example <code>pc-network:permaculture-britain<\/code>), and keep an informal register so that two networks do not accidentally pick the same one. <a href=\"https:\/\/perma.earth\/connect\/\">Ask us<\/a> which tag to use before you publish. The more networks that adopt the convention, the better everyone&#8217;s data lines up. It works by collaboration, not by enforcement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do I need an account or an API key?<\/strong> No \u2014 not with us, and not with the index. Control is proven by your control of the profile&#8217;s URL.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"checklist\" class=\"wp-block-heading\">Checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2610 The profile links <strong>both<\/strong> schemas in <code>linked_schemas<\/code><\/li>\n\n\n\n<li>\u2610 <code>name<\/code> is set; <code>primary_url<\/code> is set (for deduplication); <code>geolocation<\/code> is set (for the map)<\/li>\n\n\n\n<li>\u2610 Your <strong>network tag<\/strong> is in <code>tags<\/code><\/li>\n\n\n\n<li>\u2610 Enum values match exactly (<code>org_type<\/code>, <code>permaculture_domains<\/code>, <code>ways_to_get_involved<\/code>, <code>country_iso_3166<\/code>, <code>status<\/code>, <code>geographic_scope<\/code>)<\/li>\n\n\n\n<li>\u2610 Validated via <code>POST \/v2\/validate<\/code>, to catch errors before going live<\/li>\n\n\n\n<li>\u2610 The profile is hosted at a stable public URL returning <code>application\/json<\/code><\/li>\n\n\n\n<li>\u2610 The <code>profile_url<\/code> is submitted to <code>https:\/\/index.murmurations.network\/v2\/nodes<\/code><\/li>\n\n\n\n<li>\u2610 (Optional) verified via <code>GET \/v2\/nodes\/{node_id}<\/code><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Most organisations join the map the easy way \u2014 by adding your organisation through our form, with no code at all. This page is for the permaculture networks and developers who would rather publish and host their own Murmurations profiles, and keep their data entirely in their own hands. This guide is for the regional [&hellip;]<\/p>\n","protected":false},"author":294,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-9603","page","type-page","status-publish","hentry"],"acf":[],"featured_image_urls":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","trp-custom-language-flag":"","et-pb-post-main-image":"","et-pb-post-main-image-fullwidth":"","et-pb-portfolio-image":"","et-pb-portfolio-module-image":"","et-pb-portfolio-image-single":"","et-pb-gallery-module-image-portrait":"","et-pb-post-main-image-fullwidth-large":"","et-pb-image--responsive--desktop":"","et-pb-image--responsive--tablet":"","et-pb-image--responsive--phone":"","mailpoet_newsletter_max":"","woocommerce_thumbnail":"","woocommerce_single":"","woocommerce_gallery_thumbnail":""},"post_excerpt_stackable":"<p>Most organisations join the map the easy way \u2014 by adding your organisation through our form, with no code at all. This page is for the permaculture networks and developers who would rather publish and host their own Murmurations profiles, and keep their data entirely in their own hands. This guide is for the regional permaculture networks and organisations who would like their data to appear on the International Permaculture CoLab map \u2014 and, because of the way it works, on any other map built on the Murmurations protocol at the same time. The idea behind it is a simple&hellip;<\/p>\n","category_list":"","author_info":{"name":"antonoussik","url":"https:\/\/perma.earth\/de\/author\/antonoussik\/"},"comments_num":"0 comments","featured_image_urls_v2":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","trp-custom-language-flag":"","et-pb-post-main-image":"","et-pb-post-main-image-fullwidth":"","et-pb-portfolio-image":"","et-pb-portfolio-module-image":"","et-pb-portfolio-image-single":"","et-pb-gallery-module-image-portrait":"","et-pb-post-main-image-fullwidth-large":"","et-pb-image--responsive--desktop":"","et-pb-image--responsive--tablet":"","et-pb-image--responsive--phone":"","mailpoet_newsletter_max":"","woocommerce_thumbnail":"","woocommerce_single":"","woocommerce_gallery_thumbnail":""},"post_excerpt_stackable_v2":"<p>Most organisations join the map the easy way \u2014 by adding your organisation through our form, with no code at all. This page is for the permaculture networks and developers who would rather publish and host their own Murmurations profiles, and keep their data entirely in their own hands. This guide is for the regional permaculture networks and organisations who would like their data to appear on the International Permaculture CoLab map \u2014 and, because of the way it works, on any other map built on the Murmurations protocol at the same time. The idea behind it is a simple&hellip;<\/p>\n","category_list_v2":"","author_info_v2":{"name":"antonoussik","url":"https:\/\/perma.earth\/de\/author\/antonoussik\/"},"comments_num_v2":"0 comments","_links":{"self":[{"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/pages\/9603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/users\/294"}],"replies":[{"embeddable":true,"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/comments?post=9603"}],"version-history":[{"count":5,"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/pages\/9603\/revisions"}],"predecessor-version":[{"id":9800,"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/pages\/9603\/revisions\/9800"}],"wp:attachment":[{"href":"https:\/\/perma.earth\/de\/wp-json\/wp\/v2\/media?parent=9603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}