Spatial Urban Data Observatory (SUDO) API

The one publicly callable API the University of Melbourne genuinely operates. SUDO is a GeoNode deployment on the University's own eresearch.unimelb.edu.au host, serving an unauthenticated JSON API over 7,417 spatial datasets with GeoJSON bounding-box geometry, DOIs, licences and download links per record. Verified live 2026-08-19: /api/v2/ returned 200 with a self-describing collection index and /api/v2/datasets?page_size=1 returned 200 with total 7417. Two defects are recorded rather than smoothed over — the TLS certificate is issued for staging.unimelb-sudo.cloud.edu.au and matches no other name, so conformant clients cannot connect without disabling verification; and /api/v2/categories timed out at 60s while sibling collections answered. No OpenAPI is published by the University; GeoNode's own /api/v2/openapi returns 404 here. The OpenAPI in openapi/ is ours and is marked derived.

OpenAPI Specification

university-of-melbourne-sudo-geonode-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: University of Melbourne — Spatial Urban Data Observatory (SUDO) API
  version: v2
  description: >-
    Read surface of the Spatial Urban Data Observatory (SUDO), an
    institution-operated GeoNode deployment run by the University of Melbourne
    on its own `eresearch.unimelb.edu.au` host. SUDO is the one genuinely
    institution-operated, publicly callable API found in this profile: an
    unauthenticated JSON collection API over 7,417 spatial datasets, with
    OGC-style bounding-box geometry, DOIs, licences and download links on every
    record.

    This document was DERIVED from live probes on 2026-08-19, not from a
    contract the University publishes. Only endpoints that returned HTTP 200 on
    that date are described. The University of Melbourne does not publish an
    OpenAPI description of SUDO; GeoNode's own `/api/v2/openapi` and
    `/api/v2/swagger.json` both return 404 on this deployment.

    KNOWN DEFECTS, recorded rather than smoothed over:
      * TLS certificate mismatch — https://sudo.eresearch.unimelb.edu.au
        presents a certificate whose subject and only SAN is
        `staging.unimelb-sudo.cloud.edu.au`. Standard clients reject the
        connection; every probe below required certificate verification to be
        disabled. The page title served is also `staging.unimelb-sudo.cloud.edu.au`,
        so the production hostname appears to be fronting a staging instance.
      * Intermittent timeouts — `/api/v2/categories` timed out at 60s on
        2026-08-19 while `/api/v2/datasets` and `/api/v2/` answered normally.
  contact:
    name: University of Melbourne eResearch
    url: https://sudo.eresearch.unimelb.edu.au/about/
  x-operator: institution
  x-software: GeoNode (OSGeo, GPL-3.0)
  x-provenance:
    generated: '2026-08-19'
    method: derived
    source: >-
      Live probes of https://sudo.eresearch.unimelb.edu.au/api/v2/ ,
      /api/v2/datasets?page_size=1 and /api/v2/datasets/999999999 on 2026-08-19.
      Schema fields enumerated from the actual dataset record returned.
servers:
  - url: https://sudo.eresearch.unimelb.edu.au/api/v2
    description: Production hostname (see TLS defect in info.description)
tags:
  - name: Discovery
    description: Self-describing collection index
  - name: Datasets
    description: Spatial datasets held in the observatory
paths:
  /:
    get:
      tags: [Discovery]
      summary: Collection index
      description: >-
        Returns a flat JSON object mapping each available collection name to its
        absolute URL. Verified 200 application/json, 1188 bytes, on 2026-08-19.
      operationId: getCollectionIndex
      responses:
        '200':
          description: Map of collection name to absolute collection URL
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: string
                  format: uri
              example:
                datasets: https://sudo.eresearch.unimelb.edu.au/api/v2/datasets
                maps: https://sudo.eresearch.unimelb.edu.au/api/v2/maps
                documents: https://sudo.eresearch.unimelb.edu.au/api/v2/documents
  /datasets:
    get:
      tags: [Datasets]
      summary: List spatial datasets
      description: >-
        Page through the observatory's spatial datasets. Verified 200 with
        `total: 7417` on 2026-08-19. No authentication required and no
        rate-limit headers are returned.
      operationId: listDatasets
      parameters:
        - name: page
          in: query
          required: false
          schema: { type: integer, minimum: 1, default: 1 }
        - name: page_size
          in: query
          required: false
          schema: { type: integer, minimum: 1, default: 10 }
      responses:
        '200':
          description: A page of datasets
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DatasetPage'
  /datasets/{id}:
    get:
      tags: [Datasets]
      summary: Retrieve one dataset
      description: >-
        Retrieve a single dataset by primary key. The 404 shape below was
        verified against `/api/v2/datasets/999999999` on 2026-08-19.
      operationId: getDataset
      parameters:
        - name: id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: One dataset
          content:
            application/json:
              schema:
                type: object
                properties:
                  dataset:
                    $ref: '#/components/schemas/Dataset'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                detail: Not found.
components:
  schemas:
    DatasetPage:
      type: object
      required: [links, total, page, page_size, datasets]
      properties:
        links:
          type: object
          properties:
            next: { type: string, format: uri, nullable: true }
            previous: { type: string, format: uri, nullable: true }
        total: { type: integer, example: 7417 }
        page: { type: integer, example: 1 }
        page_size: { type: integer, example: 1 }
        datasets:
          type: array
          items:
            $ref: '#/components/schemas/Dataset'
    Dataset:
      type: object
      description: >-
        Field set enumerated from a live record on 2026-08-19. Only fields
        actually present on that record are described; types are inferred from
        the observed values and are marked as such.
      properties:
        pk: { type: integer }
        uuid: { type: string }
        title: { type: string }
        abstract: { type: string }
        raw_abstract: { type: string }
        purpose: { type: string, nullable: true }
        name: { type: string }
        resource_type: { type: string, example: dataset }
        subtype: { type: string, nullable: true }
        doi: { type: string, nullable: true }
        date: { type: string, format: date-time }
        date_type: { type: string }
        created: { type: string, format: date-time }
        last_updated: { type: string, format: date-time }
        language: { type: string }
        category: { type: object, nullable: true }
        keywords: { type: array, items: { type: object } }
        tkeywords: { type: array, items: { type: object } }
        regions: { type: array, items: { type: object } }
        license: { type: object, nullable: true }
        constraints_other: { type: string, nullable: true }
        data_quality_statement: { type: string, nullable: true }
        supplemental_information: { type: string, nullable: true }
        attribution: { type: string, nullable: true }
        owner: { type: object }
        poc: { type: array, items: { type: object } }
        metadata_author: { type: array, items: { type: object } }
        publisher: { type: array, items: { type: object } }
        custodian: { type: array, items: { type: object } }
        distributor: { type: array, items: { type: object } }
        originator: { type: array, items: { type: object } }
        principal_investigator: { type: array, items: { type: object } }
        processor: { type: array, items: { type: object } }
        resource_provider: { type: array, items: { type: object } }
        resource_user: { type: array, items: { type: object } }
        bbox_polygon: { type: object, description: GeoJSON Polygon }
        ll_bbox_polygon: { type: object, description: GeoJSON Polygon, lat/long }
        extent: { type: object }
        srid: { type: string, example: 'EPSG:4326' }
        spatial_representation_type: { type: object, nullable: true }
        has_time: { type: boolean }
        has_elevation: { type: boolean }
        temporal_extent_start: { type: string, format: date-time, nullable: true }
        temporal_extent_end: { type: string, format: date-time, nullable: true }
        time_regex: { type: string, nullable: true }
        elevation_regex: { type: string, nullable: true }
        is_mosaic: { type: boolean }
        is_approved: { type: boolean }
        is_published: { type: boolean }
        is_copyable: { type: boolean }
        advertised: { type: boolean }
        featured: { type: boolean }
        favorite: { type: boolean }
        metadata_only: { type: boolean }
        metadata_uploaded_preserve: { type: boolean }
        processed: { type: boolean }
        state: { type: string }
        store: { type: string, nullable: true }
        workspace: { type: string, nullable: true }
        charset: { type: string }
        edition: { type: string, nullable: true }
        group: { type: object, nullable: true }
        maintenance_frequency: { type: string, nullable: true }
        restriction_code_type: { type: object, nullable: true }
        sourcetype: { type: string }
        ptype: { type: string, nullable: true }
        polymorphic_ctype_id: { type: integer }
        default_style: { type: object, nullable: true }
        styles: { type: array, items: { type: object } }
        featureinfo_custom_template: { type: string, nullable: true }
        alternate: { type: string, nullable: true }
        perms: { type: array, items: { type: string } }
        rating: { type: integer }
        popular_count: { type: integer }
        share_count: { type: integer }
        detail_url: { type: string }
        embed_url: { type: string }
        thumbnail_url: { type: string }
        download_url: { type: string, nullable: true }
        download_urls: { type: array, items: { type: object } }
        link: { type: string, nullable: true }
        links: { type: array, items: { type: object } }
        assets: { type: array, items: { type: object } }
        raw_constraints_other: { type: string, nullable: true }
        raw_data_quality_statement: { type: string, nullable: true }
        raw_purpose: { type: string, nullable: true }
        raw_supplemental_information: { type: string, nullable: true }
    Error:
      type: object
      properties:
        detail: { type: string }