{
  "info": {
    "name": "C21 Global API",
    "description": "Complete test collection for the C21 Global platform API.\n\n**Setup (collection → Variables tab):**\n- `baseUrl` — already set to production (`https://api.cservices.au`)\n- `adminToken` — the ADMIN_TOKEN from the box `.env` (for the Admin folders)\n- `clientKey` — a feed API key. Create one via *Admin · API clients → Create client*: the response contains the key and a script saves it into this variable automatically.\n\n**Notes**\n- Feed pushes and validation REQUIRE `?currency=<ISO-4217>` — neither REAXML nor RESO carries a currency.\n- `POST /v1/leads` will be rejected in production without a real Turnstile token (the API fails closed — this is correct behaviour; test enquiries through the website UI instead).\n- Public read endpoints need no auth. Rate limit: 120 req/min/IP.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.cservices.au"
    },
    {
      "key": "adminToken",
      "value": "PASTE_ADMIN_TOKEN_HERE"
    },
    {
      "key": "clientKey",
      "value": "CREATED_VIA_ADMIN_CLIENTS_CREATE"
    }
  ],
  "item": [
    {
      "name": "Public — listings & directory",
      "item": [
        {
          "name": "Search listings",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/listings?country=AU&saleMode=sale&minBedrooms=2&limit=24",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "listings"
              ],
              "query": [
                {
                  "key": "country",
                  "value": "AU",
                  "description": "ISO-3166 alpha-2"
                },
                {
                  "key": "saleMode",
                  "value": "sale",
                  "description": "sale | rent"
                },
                {
                  "key": "minBedrooms",
                  "value": "2"
                },
                {
                  "key": "limit",
                  "value": "24",
                  "description": "max 100"
                },
                {
                  "key": "office",
                  "value": "",
                  "description": "source office id",
                  "disabled": true
                },
                {
                  "key": "category",
                  "value": "residential",
                  "disabled": true
                },
                {
                  "key": "maxPrice",
                  "value": "2000000",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "disabled": true
                },
                {
                  "key": "region",
                  "value": "NSW",
                  "description": "state/province, case-insensitive exact",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "bondi",
                  "description": "place text (locality/postcode/region)",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "price_asc",
                  "description": "newest | price_asc | price_desc",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Listing detail",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/listings/AU-DEMO-01/DEMO-0001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "listings",
                "AU-DEMO-01",
                "DEMO-0001"
              ]
            },
            "description": "Path: /v1/listings/:officeId/:uniqueId"
          }
        },
        {
          "name": "Agents directory",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/agents?limit=20",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "agents"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20"
                },
                {
                  "key": "country",
                  "value": "AU",
                  "disabled": true
                },
                {
                  "key": "office",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "smith",
                  "description": "name search",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Offices directory",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/offices?limit=20",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "offices"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20"
                },
                {
                  "key": "country",
                  "value": "AU",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Countries with listing counts",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/countries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "countries"
              ]
            }
          }
        },
        {
          "name": "Search development projects",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/projects?stage=offThePlan&country=AU",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects"
              ],
              "query": [
                {
                  "key": "stage",
                  "value": "offThePlan",
                  "description": "proposed|approved|offThePlan|underConstruction|nearingCompletion|completed"
                },
                {
                  "key": "country",
                  "value": "AU"
                }
              ]
            }
          }
        },
        {
          "name": "Project detail with child listings",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/projects/Century 21 Coastal/AU-PRJ-9001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects",
                "Century 21 Coastal",
                "AU-PRJ-9001"
              ]
            }
          }
        },
        {
          "name": "Regions of a country with listing counts",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/regions?country=AU",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "regions"
              ],
              "query": [
                {
                  "key": "country",
                  "value": "AU",
                  "description": "ISO 3166-1 alpha-2, case-insensitive"
                }
              ]
            }
          }
        },
        {
          "name": "FX rates snapshot",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/fx",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "fx"
              ]
            }
          }
        },
        {
          "name": "Site chrome (settings, nav, pages)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/site",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "site"
              ]
            }
          }
        },
        {
          "name": "Site page by slug",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/site/pages/about",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "site",
                "pages",
                "about"
              ]
            }
          }
        },
        {
          "name": "Destination suggestions (places)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/places?q=ns",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "places"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "ns",
                  "description": "place text, 1-100 chars (required)"
                },
                {
                  "key": "limit",
                  "value": "6",
                  "description": "max 20",
                  "disabled": true
                }
              ]
            },
            "description": "Typeahead: distinct regions + localities with listing counts. Countries are matched web-side against localized names."
          }
        }
      ]
    },
    {
      "name": "Feeds (client key)",
      "description": "Push and validate listing feeds. Auth: Bearer {{clientKey}} (create one in Admin · API clients). The operator FEED_TOKEN works here too.\n\nA currency query/context is REQUIRED. Scoped keys get 403 when the feed contains offices outside their scope.",
      "item": [
        {
          "name": "Request a feed key (self-serve, no auth)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/clients/request",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "clients",
                "request"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Vault CRM — Century 21 Bondi\",\n  \"email\": \"dev@yourcrm.com\",\n  \"offices\": [\n    \"AU-BONDI-01\"\n  ],\n  \"note\": \"expected volume ~200 listings\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a SUSPENDED client scoped to the given offices and returns the key ONCE. It activates when the operator approves — poll GET /v1/feeds/whoami (401 while pending, 200 once live). Rate-limited 5/hour/IP."
          }
        },
        {
          "name": "Who am I (key self-check)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{clientKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/feeds/whoami",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "feeds",
                "whoami"
              ]
            },
            "description": "Verify your feed key before the first push: 200 returns the client name + the office IDs the key may push for (null = unrestricted); 401 means the key is wrong or revoked."
          }
        },
        {
          "name": "Validate feed (dry-run, no auth, persists nothing)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/xml"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/validate?currency=AUD&country=AU",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "validate"
              ],
              "query": [
                {
                  "key": "currency",
                  "value": "AUD"
                },
                {
                  "key": "country",
                  "value": "AU"
                },
                {
                  "key": "format",
                  "value": "reso",
                  "description": "default reaxml",
                  "disabled": true
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "<?xml version=\"1.0\"?>\n<propertyList>\n  <residential modTime=\"2026-07-05-10:00:00\" status=\"current\">\n    <agentID>AU-DEMO-01</agentID>\n    <uniqueID>DEMO-0001</uniqueID>\n    <price display=\"yes\">1850000</price>\n    <listingAgent id=\"1\"><name>Sarah Mitchell</name><email>sarah.mitchell@example.com</email><telephone type=\"mobile\">0412 345 678</telephone></listingAgent>\n    <address display=\"yes\"><streetNumber>42</streetNumber><street>Ocean View Parade</street><suburb>Bondi Beach</suburb><state>NSW</state><postcode>2026</postcode><country>AUS</country></address>\n    <category name=\"House\"/>\n    <headline>Sunlit family home moments from the sand</headline>\n    <description>Four bedrooms, two living areas and a north-facing entertainer's deck — a rare beachside offering with district views.</description>\n    <features><bedrooms>4</bedrooms><bathrooms>2</bathrooms><garages>2</garages></features>\n    <landDetails><area unit=\"squareMeter\">560</area></landDetails>\n    <objects><img id=\"1\" url=\"https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=1200&amp;q=80\"/><img id=\"2\" url=\"https://images.unsplash.com/photo-1600585154340-be6161a56a0c?w=1200&amp;q=80\"/><img id=\"3\" url=\"https://images.unsplash.com/photo-1600607687939-ce8a6c25118c?w=1200&amp;q=80\"/></objects>\n  </residential>\n</propertyList>"
            },
            "description": "The CRM onboarding funnel — same validation path as the real ingest, returns the canonical preview + issues. Open by design."
          }
        },
        {
          "name": "Push feed (incremental)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/xml"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{clientKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/feeds?currency=AUD&country=AU",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "feeds"
              ],
              "query": [
                {
                  "key": "currency",
                  "value": "AUD"
                },
                {
                  "key": "country",
                  "value": "AU"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "<?xml version=\"1.0\"?>\n<propertyList>\n  <residential modTime=\"2026-07-05-10:00:00\" status=\"current\">\n    <agentID>AU-DEMO-01</agentID>\n    <uniqueID>DEMO-0001</uniqueID>\n    <price display=\"yes\">1850000</price>\n    <listingAgent id=\"1\"><name>Sarah Mitchell</name><email>sarah.mitchell@example.com</email><telephone type=\"mobile\">0412 345 678</telephone></listingAgent>\n    <address display=\"yes\"><streetNumber>42</streetNumber><street>Ocean View Parade</street><suburb>Bondi Beach</suburb><state>NSW</state><postcode>2026</postcode><country>AUS</country></address>\n    <category name=\"House\"/>\n    <headline>Sunlit family home moments from the sand</headline>\n    <description>Four bedrooms, two living areas and a north-facing entertainer's deck — a rare beachside offering with district views.</description>\n    <features><bedrooms>4</bedrooms><bathrooms>2</bathrooms><garages>2</garages></features>\n    <landDetails><area unit=\"squareMeter\">560</area></landDetails>\n    <objects><img id=\"1\" url=\"https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=1200&amp;q=80\"/><img id=\"2\" url=\"https://images.unsplash.com/photo-1600585154340-be6161a56a0c?w=1200&amp;q=80\"/><img id=\"3\" url=\"https://images.unsplash.com/photo-1600607687939-ce8a6c25118c?w=1200&amp;q=80\"/></objects>\n  </residential>\n  <rental modTime=\"2026-07-05-10:05:00\" status=\"current\">\n    <agentID>AU-DEMO-01</agentID>\n    <uniqueID>DEMO-0002</uniqueID>\n    <rent period=\"week\" display=\"yes\">1200</rent>\n    <listingAgent id=\"1\"><name>James Chen</name><email>james.chen@example.com</email><telephone type=\"mobile\">0423 456 789</telephone></listingAgent>\n    <address display=\"yes\"><streetNumber>7</streetNumber><street>Harbour Lane</street><suburb>Kirribilli</suburb><state>NSW</state><postcode>2061</postcode><country>AUS</country></address>\n    <category name=\"Apartment\"/>\n    <headline>Designer two-bedroom with bridge views</headline>\n    <description>Floor-to-ceiling glass frames the harbour from every room. Two bedrooms, study nook, secure parking.</description>\n    <features><bedrooms>2</bedrooms><bathrooms>2</bathrooms><garages>1</garages></features>\n    <objects><img id=\"1\" url=\"https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=1200&amp;q=80\"/><img id=\"2\" url=\"https://images.unsplash.com/photo-1600566753086-00f18fb6b3ea?w=1200&amp;q=80\"/></objects>\n  </rental>\n</propertyList>",
              "options": {
                "raw": {
                  "language": "xml"
                }
              }
            },
            "description": "Validates + persists. Two demo listings (1 sale, 1 rental) for office AU-DEMO-01 — pushing this seeds the live site with visible demo content. Re-pushing unchanged content is a no-op (content hash). 403 if your key isn't scoped for AU-DEMO-01."
          }
        },
        {
          "name": "Push project feed (new-development JSON)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{clientKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/feeds",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "feeds"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"format\": \"project\",\n  \"context\": { \"currency\": \"AUD\", \"defaultCountry\": \"AU\", \"sourceLocale\": \"en-AU\" },\n  \"xml\": \"{\\\"projects\\\":[{\\\"uniqueId\\\":\\\"PRJ-001\\\",\\\"sourceOfficeId\\\":\\\"AU-DEMO-01\\\",\\\"name\\\":\\\"Horizon Residences\\\",\\\"description\\\":\\\"120 architect-designed apartments above the beach.\\\",\\\"status\\\":\\\"current\\\",\\\"address\\\":{\\\"country\\\":\\\"AU\\\",\\\"state\\\":\\\"NSW\\\",\\\"suburb\\\":\\\"Bondi\\\",\\\"postcode\\\":\\\"2026\\\",\\\"streetNumber\\\":\\\"1\\\",\\\"street\\\":\\\"Campbell Parade\\\",\\\"lat\\\":-33.8908,\\\"lng\\\":151.2743},\\\"price\\\":{\\\"min\\\":650000,\\\"max\\\":1200000,\\\"display\\\":\\\"From $650,000\\\"},\\\"media\\\":[{\\\"url\\\":\\\"https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=1200&q=80\\\",\\\"order\\\":0,\\\"hero\\\":true}],\\\"developer\\\":{\\\"name\\\":\\\"Horizon Development Group\\\"},\\\"constructionStage\\\":\\\"offThePlan\\\",\\\"expectedCompletion\\\":\\\"2027-06\\\",\\\"totalUnits\\\":120,\\\"childListingKeys\\\":[\\\"DEMO-0001\\\"],\\\"agents\\\":[{\\\"name\\\":\\\"Sarah Mitchell\\\",\\\"email\\\":\\\"sarah.mitchell@example.com\\\",\\\"phone\\\":\\\"0412 345 678\\\"}],\\\"office\\\":{\\\"name\\\":\\\"Century 21 Demo\\\"},\\\"modTime\\\":\\\"2026-08-01T09:00:00Z\\\"}]}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Pushes a new-home development project (format=project — our CRM-facing JSON; no industry standard exists). The project appears at /projects on the site; childListingKeys links its unit listings (bare id = same office, or full OFFICE:UNIQUEID). Dry-run first via POST /v1/validate with the same body."
          }
        },
        {
          "name": "Push feed (mode=full — reconcile, circuit-breaker)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/xml"
              },
              {
                "key": "Authorization",
                "value": "Bearer {{clientKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/feeds?currency=AUD&country=AU&mode=full",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "feeds"
              ],
              "query": [
                {
                  "key": "currency",
                  "value": "AUD"
                },
                {
                  "key": "country",
                  "value": "AU"
                },
                {
                  "key": "mode",
                  "value": "full",
                  "description": "snapshot: absent listings archived (guarded)"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "<?xml version=\"1.0\"?>\n<propertyList>\n  <residential modTime=\"2026-07-05-10:00:00\" status=\"current\">\n    <agentID>AU-DEMO-01</agentID>\n    <uniqueID>DEMO-0001</uniqueID>\n    <price display=\"yes\">1850000</price>\n    <address display=\"yes\"><streetNumber>42</streetNumber><street>Ocean View Parade</street><suburb>Bondi Beach</suburb><state>NSW</state><postcode>2026</postcode><country>AUS</country></address>\n    <category name=\"House\"/>\n    <headline>Sunlit family home moments from the sand</headline>\n    <features><bedrooms>4</bedrooms><bathrooms>2</bathrooms></features>\n  </residential>\n</propertyList>",
              "options": {
                "raw": {
                  "language": "xml"
                }
              }
            },
            "description": "A FULL snapshot: listings absent from it get archived (mass-delete circuit breaker quarantines suspicious drops). Use carefully."
          }
        }
      ]
    },
    {
      "name": "Admin · API clients",
      "description": "Manage per-account feed access. All requests need x-admin-token.",
      "item": [
        {
          "name": "List clients",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/clients",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "clients"
              ]
            }
          }
        },
        {
          "name": "Create client (key shown ONCE — auto-saved to {{clientKey}})",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json.key) {",
                  "  pm.collectionVariables.set('clientKey', json.key);",
                  "  pm.collectionVariables.set('clientId', json.client.id);",
                  "  console.log('Saved clientKey + clientId to collection variables');",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/clients",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "clients"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Postman testing\",\n  \"allowedOffices\": [\"AU-DEMO-01\"],\n  \"note\": \"created from the Postman collection\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "allowedOffices: null or omit = unrestricted (any office). The response key is saved into {{clientKey}} automatically so the Feeds folder just works."
          }
        },
        {
          "name": "Update client (suspend / scope / rename)",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/clients/{{clientId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "clients",
                "{{clientId}}"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"active\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Any subset of: name, allowedOffices (array or null), active, note. active:false blocks the key instantly."
          }
        },
        {
          "name": "Rotate key (old key dies immediately)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const json = pm.response.json();",
                  "if (json.key) { pm.collectionVariables.set('clientKey', json.key); console.log('clientKey updated'); }"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/clients/{{clientId}}/rotate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "clients",
                "{{clientId}}",
                "rotate"
              ]
            }
          }
        },
        {
          "name": "Delete client",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/clients/{{clientId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "clients",
                "{{clientId}}"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Admin · operations",
      "item": [
        {
          "name": "Dashboard stats",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/stats",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "stats"
              ]
            }
          }
        },
        {
          "name": "List leads",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/leads?limit=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "leads"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50"
                },
                {
                  "key": "status",
                  "value": "failed",
                  "description": "pending|delivered|failed|purged|dead_letter",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Retry failed lead",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/leads/LEAD_UUID_HERE/retry",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "leads",
                "LEAD_UUID_HERE",
                "retry"
              ]
            }
          }
        },
        {
          "name": "Browse listings (incl. hidden)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/listings?limit=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "listings"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50"
                },
                {
                  "key": "q",
                  "value": "bondi",
                  "description": "listing key or locality",
                  "disabled": true
                },
                {
                  "key": "hidden",
                  "value": "true",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Hide / show a listing",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/listings/visibility",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "listings",
                "visibility"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"officeId\": \"AU-DEMO-01\",\n  \"uniqueId\": \"DEMO-0001\",\n  \"hidden\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Operator override — survives feed re-ingests. hidden:false to show again."
          }
        },
        {
          "name": "List quarantine (circuit-breaker events)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/quarantine",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "quarantine"
              ],
              "query": [
                {
                  "key": "includeResolved",
                  "value": "true",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Resolve quarantine item",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/quarantine/QUARANTINE_UUID_HERE/resolve",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "quarantine",
                "QUARANTINE_UUID_HERE",
                "resolve"
              ]
            }
          }
        },
        {
          "name": "List blocklist",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/blocklist",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "blocklist"
              ]
            }
          }
        },
        {
          "name": "Block a sender",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/blocklist",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "blocklist"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kind\": \"email\",\n  \"value\": \"spammer@example.com\",\n  \"reason\": \"testing\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "kind: email (stored hashed, 365-day TTL) or domain (permanent; freemail domains refused unless force:true)."
          }
        },
        {
          "name": "Unblock",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/blocklist",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "blocklist"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kind\": \"email\",\n  \"value\": \"spammer@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "By {id} (from the list) or by {kind, value}."
          }
        }
      ]
    },
    {
      "name": "Admin · site content",
      "item": [
        {
          "name": "Set identity",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/settings",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "settings"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"key\": \"identity\",\n  \"value\": {\n    \"name\": \"Century 21 Global\",\n    \"tagline\": \"Find your extraordinary.\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "key: identity | seo | favicon. Live on the site within ~30s."
          }
        },
        {
          "name": "List pages (drafts included)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages"
              ]
            }
          }
        },
        {
          "name": "Create page",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slug\": \"about\",\n  \"title\": { \"en\": \"About us\" },\n  \"body\": { \"en\": \"## One global network\\n\\nCentury 21 Global brings together listings from offices in **80+ countries**.\" },\n  \"description\": { \"en\": \"Who is behind Century 21 Global.\" },\n  \"published\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "title/body/description are per-locale maps (en required; es/fr/ar/zh optional). Markdown-lite body: # headings, - lists, **bold**, [links](url)."
          }
        },
        {
          "name": "Update page",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages/id/PAGE_UUID_HERE",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages",
                "id",
                "PAGE_UUID_HERE"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"published\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Replace navigation",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/nav",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "nav"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"links\": [\n    { \"kind\": \"builtin\", \"ref\": \"buy\" },\n    { \"kind\": \"builtin\", \"ref\": \"rent\" },\n    { \"kind\": \"builtin\", \"ref\": \"agents\" },\n    { \"kind\": \"builtin\", \"ref\": \"offices\" },\n    { \"kind\": \"page\", \"ref\": \"about\", \"label\": { \"en\": \"About us\" } },\n    { \"kind\": \"builtin\", \"ref\": \"list\" }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Empty links array restores the default nav. kinds: builtin (buy|rent|agents|offices|list), page (ref = slug), custom (ref = URL, label.en required)."
          }
        }
      ]
    },
    {
      "name": "Launch prep — create pages",
      "description": "One-click publication of the three launch pages (About, Privacy DRAFT, List-with-us). Content lives in docs/LAUNCH-PAGES.md — review the privacy draft before serious public launch. Re-running returns 409 (already exists).",
      "item": [
        {
          "name": "Create /about (5 languages)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slug\": \"about\",\n  \"title\": {\n    \"en\": \"About us\",\n    \"es\": \"Sobre nosotros\",\n    \"fr\": \"À propos\",\n    \"ar\": \"من نحن\",\n    \"zh\": \"关于我们\"\n  },\n  \"description\": {\n    \"en\": \"One global Century 21 network — listings from independently owned offices in 80+ countries, in your language and currency.\"\n  },\n  \"body\": {\n    \"en\": \"## One global network\\n\\nCentury 21 Global brings together property listings from Century 21 offices in **80+ countries** — in one place, in your language and your currency.\\n\\n## Straight from the source\\n\\nListings arrive directly from each office's own systems and are updated as the office updates them. What you see is what the office publishes — no scraping, no stale copies.\\n\\n## Independently owned\\n\\nEach office is independently owned and operated by people who know their local market. When you enquire about a property, your message goes straight to the agent responsible for it.\\n\\n## Explore\\n\\n- [Search all listings](/)\\n- [Find an agent](/agents)\\n- [Find an office](/offices)\",\n    \"es\": \"## Una red global\\n\\nCentury 21 Global reúne propiedades de oficinas Century 21 en **más de 80 países**, en un solo lugar, en tu idioma y tu moneda.\\n\\n## Directo de la fuente\\n\\nLas propiedades llegan directamente desde los sistemas de cada oficina y se actualizan cuando la oficina las actualiza.\\n\\n## Oficinas independientes\\n\\nCada oficina es de propiedad y gestión independientes, dirigida por personas que conocen su mercado local. Tu consulta llega directamente al agente responsable.\\n\\n## Explora\\n\\n- [Buscar propiedades](/)\\n- [Encuentra un agente](/agents)\\n- [Encuentra una oficina](/offices)\",\n    \"fr\": \"## Un réseau mondial\\n\\nCentury 21 Global rassemble les annonces des agences Century 21 dans **plus de 80 pays** — au même endroit, dans votre langue et votre devise.\\n\\n## Directement à la source\\n\\nLes annonces proviennent directement des systèmes de chaque agence et sont mises à jour en même temps qu'elles.\\n\\n## Des agences indépendantes\\n\\nChaque agence est détenue et exploitée de façon indépendante, par des experts de leur marché local. Votre demande arrive directement à l'agent responsable du bien.\\n\\n## Explorer\\n\\n- [Rechercher un bien](/)\\n- [Trouver un agent](/agents)\\n- [Trouver une agence](/offices)\",\n    \"ar\": \"## شبكة عالمية واحدة\\n\\nتجمع سنشري 21 العالمية عقارات من مكاتب سنشري 21 في **أكثر من 80 دولة** — في مكان واحد، بلغتك وعملتك.\\n\\n## من المصدر مباشرة\\n\\nتصل العقارات مباشرة من أنظمة كل مكتب ويتم تحديثها فور تحديث المكتب لها.\\n\\n## مكاتب مستقلة\\n\\nكل مكتب مملوك ومُدار بشكل مستقل من قبل أشخاص يعرفون سوقهم المحلي. عند الاستفسار عن عقار، تصل رسالتك مباشرة إلى الوكيل المسؤول عنه.\\n\\n## استكشف\\n\\n- [تصفح جميع العقارات](/)\\n- [ابحث عن وكيل](/agents)\\n- [ابحث عن مكتب](/offices)\",\n    \"zh\": \"## 一个全球网络\\n\\n世纪21全球汇聚了**80多个国家**世纪21门店的房源——一站浏览，支持您的语言和货币。\\n\\n## 直接来自源头\\n\\n房源直接来自每家门店自己的系统，并随门店更新而更新。\\n\\n## 独立经营\\n\\n每家门店均由熟悉当地市场的人士独立拥有和经营。您咨询房源时，信息会直接送达负责该房源的经纪人。\\n\\n## 探索\\n\\n- [搜索全部房源](/)\\n- [寻找经纪人](/agents)\\n- [寻找门店](/offices)\"\n  },\n  \"published\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Prepared launch page (see docs/LAUNCH-PAGES.md). Idempotence: creating an existing slug returns 409 — edit via the console instead."
          }
        },
        {
          "name": "Create /privacy (EN, draft — review!)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slug\": \"privacy\",\n  \"title\": {\n    \"en\": \"Privacy policy\"\n  },\n  \"description\": {\n    \"en\": \"What Century 21 Global collects, why, how long it is kept, and your rights.\"\n  },\n  \"body\": {\n    \"en\": \"*Last updated: July 2026 — draft for review.*\\n\\n## What we collect\\n\\n**Property enquiries.** When you enquire about a listing we collect your name, email address, optional phone number, your message, and a record of your consent (including the time and network address it was given from).\\n\\n**Preferences.** Two functional cookies remember your chosen language (c21_locale) and display currency (c21_currency). We use no advertising or tracking cookies and no third-party analytics.\\n\\n**Technical logs.** Our servers keep short-lived request logs for security and reliability.\\n\\n## Why we collect it\\n\\nYour enquiry exists to be delivered: it is routed to the agent or office responsible for the listing so they can respond to you. Consent records exist to prove you asked us to do that. We do not sell personal information or use it for advertising.\\n\\n## How long we keep it\\n\\nEnquiry details are **deleted from our systems once delivery to the office is confirmed**, with a 30-day retention backstop after which they are purged regardless. Anonymized delivery statistics (which listing, when, no personal details) are retained. Senders blocked for spam are stored as one-way cryptographic hashes, not addresses, and expire after 12 months.\\n\\n## Who we share it with\\n\\n- **The office or agent** responsible for the listing you enquired about — that is the purpose of the enquiry.\\n- **Mailgun** (email delivery processor) transmits the enquiry email.\\n- **Cloudflare Turnstile** performs a privacy-preserving bot check on the enquiry form.\\n- **Amazon Web Services (Sydney, Australia)** hosts the platform.\\n\\nWe share nothing else with anyone else.\\n\\n## Security\\n\\nAll traffic is encrypted in transit (TLS). Databases are encrypted at rest, access-restricted, and backed up automatically. Spam-blocklist email addresses are stored hashed.\\n\\n## Your rights\\n\\nYou may request access to, correction of, or deletion of your personal information. Because enquiry details are purged on delivery, in most cases the office you contacted holds the live copy — we will help you reach them. Contact details for privacy requests will be published here.\\n\\n## Listings content\\n\\nProperty listings, photographs and agent business contact details are published commercially by the responsible Century 21 office, which remains their source of truth.\"\n  },\n  \"published\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Prepared launch page (see docs/LAUNCH-PAGES.md). Idempotence: creating an existing slug returns 409 — edit via the console instead."
          }
        },
        {
          "name": "Create /list-with-us (5 languages — fixes the header CTA)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-admin-token",
                "value": "{{adminToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/admin/site/pages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "admin",
                "site",
                "pages"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"slug\": \"list-with-us\",\n  \"title\": {\n    \"en\": \"List with us\",\n    \"es\": \"Publica con nosotros\",\n    \"fr\": \"Confiez-nous votre bien\",\n    \"ar\": \"اعرض عقارك معنا\",\n    \"zh\": \"委托我们发布\"\n  },\n  \"description\": {\n    \"en\": \"Put your property in front of buyers in 80+ countries through your local Century 21 office.\"\n  },\n  \"body\": {\n    \"en\": \"## Your property, seen worldwide\\n\\nListing with a Century 21 office puts your property in front of buyers and renters across a network spanning **80+ countries** — automatically translated into five languages, with prices shown in every visitor's own currency.\\n\\n## How it works\\n\\n- Your local Century 21 office lists your property in their own system.\\n- It appears here — and stays in sync with every update the office makes.\\n- Enquiries from anywhere in the world go straight to your agent.\\n\\n## Get started\\n\\n- [Find your local office](/offices) and talk to them about listing your property.\\n- [Find an agent](/agents) if you already know who you want to work with.\\n\\n## For offices and CRM providers\\n\\nCentury 21 offices can publish their entire inventory to this platform directly from their CRM. Start with the [developer portal](/developers) — validate a feed in minutes, then request an API key through your Century 21 master franchise.\",\n    \"es\": \"## Tu propiedad, vista en todo el mundo\\n\\nPublicar con una oficina Century 21 pone tu propiedad ante compradores e inquilinos de una red presente en **más de 80 países**, traducida automáticamente a cinco idiomas y con precios en la moneda de cada visitante.\\n\\n## Cómo funciona\\n\\n- Tu oficina Century 21 local publica tu propiedad en su propio sistema.\\n- Aparece aquí, y se mantiene sincronizada con cada actualización.\\n- Las consultas de cualquier parte del mundo llegan directamente a tu agente.\\n\\n## Empieza\\n\\n- [Encuentra tu oficina local](/offices) y habla con ellos.\\n- [Encuentra un agente](/agents) si ya sabes con quién quieres trabajar.\\n\\n## Para oficinas y proveedores de CRM\\n\\nLas oficinas Century 21 pueden publicar todo su inventario directamente desde su CRM. Empieza por el [portal para desarrolladores](/developers).\",\n    \"fr\": \"## Votre bien, visible dans le monde entier\\n\\nConfier votre bien à une agence Century 21, c'est le présenter aux acheteurs et locataires d'un réseau couvrant **plus de 80 pays** — traduit automatiquement en cinq langues, avec les prix dans la devise de chaque visiteur.\\n\\n## Comment ça marche\\n\\n- Votre agence Century 21 locale enregistre votre bien dans son propre système.\\n- Il apparaît ici — et reste synchronisé à chaque mise à jour.\\n- Les demandes du monde entier arrivent directement à votre agent.\\n\\n## Commencer\\n\\n- [Trouvez votre agence locale](/offices) et parlez-en avec elle.\\n- [Trouvez un agent](/agents) si vous savez déjà avec qui travailler.\\n\\n## Pour les agences et éditeurs de CRM\\n\\nLes agences Century 21 peuvent publier tout leur inventaire directement depuis leur CRM. Commencez par le [portail développeurs](/developers).\",\n    \"ar\": \"## عقارك أمام العالم\\n\\nعرض عقارك مع مكتب سنشري 21 يضعه أمام المشترين والمستأجرين عبر شبكة تمتد في **أكثر من 80 دولة** — مترجماً تلقائياً إلى خمس لغات، وبأسعار تظهر بعملة كل زائر.\\n\\n## كيف يعمل\\n\\n- يقوم مكتب سنشري 21 المحلي بإدراج عقارك في نظامه الخاص.\\n- يظهر هنا — ويبقى متزامناً مع كل تحديث يجريه المكتب.\\n- تصل الاستفسارات من أي مكان في العالم مباشرة إلى وكيلك.\\n\\n## ابدأ الآن\\n\\n- [ابحث عن مكتبك المحلي](/offices) وتحدث معهم حول عرض عقارك.\\n- [ابحث عن وكيل](/agents) إذا كنت تعرف من تريد العمل معه.\\n\\n## للمكاتب ومزودي أنظمة إدارة العقارات\\n\\nيمكن لمكاتب سنشري 21 نشر كامل عقاراتها مباشرة من نظام إدارة علاقات العملاء الخاص بها. ابدأ من [بوابة المطورين](/developers).\",\n    \"zh\": \"## 让全世界看到您的房产\\n\\n通过世纪21门店发布房源，您的房产将呈现在覆盖**80多个国家**的网络中的买家和租户面前——自动翻译成五种语言，价格以每位访客的货币显示。\\n\\n## 如何运作\\n\\n- 您当地的世纪21门店在自己的系统中录入您的房源。\\n- 房源即出现在本平台——并随门店的每次更新保持同步。\\n- 来自世界任何地方的咨询直接送达您的经纪人。\\n\\n## 开始\\n\\n- [查找您当地的门店](/offices)，与他们洽谈发布事宜。\\n- [查找经纪人](/agents)，如果您已有心仪的合作对象。\\n\\n## 门店与CRM服务商\\n\\n世纪21门店可直接从自己的CRM向本平台发布全部房源。请从[开发者门户](/developers)开始。\"\n  },\n  \"published\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Prepared launch page (see docs/LAUNCH-PAGES.md). Idempotence: creating an existing slug returns 409 — edit via the console instead."
          }
        }
      ]
    },
    {
      "name": "System",
      "item": [
        {
          "name": "Health check",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/healthz",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "healthz"
              ]
            }
          }
        },
        {
          "name": "OpenAPI spec",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/openapi.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "openapi.json"
              ]
            }
          }
        }
      ]
    }
  ]
}
