{
  "openapi": "3.1.0",
  "info": {
    "title": "Public toilets, ACT query API",
    "version": "2026-08-11",
    "summary": "Filter, page and aggregate Public toilets, ACT from City and Environment Directorate.",
    "description": "The query API returns only the rows you ask for, as JSON, NDJSON or CSV, from the same typed rows as the files. It needs no key. The API allows 60 requests in 10 seconds from one address. Above that it answers 429 for 10 seconds with a `Retry-After` header, a `RateLimit-Policy` header and a JSON body that gives the limit. Every API answer carries the same `RateLimit-Policy`. A client should wait the `Retry-After` seconds, or read the files, which have no limit. Every JSON answer carries the version, licence and attribution. CSV and NDJSON answers carry them in response headers. City and Environment Directorate has not endorsed this site. The whole site is described in https://publicdata.au/openapi.json.",
    "license": {
      "name": "CC BY 4.0 with the ACTmapi terms of use",
      "url": "https://www.actmapi.act.gov.au/terms-and-conditions"
    }
  },
  "servers": [
    {
      "url": "https://publicdata.au"
    }
  ],
  "externalDocs": {
    "url": "https://publicdata.au/d/act-public-toilets/#query"
  },
  "tags": [
    {
      "name": "query"
    }
  ],
  "paths": {
    "/api/v1/datasets/act-public-toilets/rows": {
      "get": {
        "tags": [
          "query"
        ],
        "summary": "Query Public toilets, ACT",
        "operationId": "queryRows_act_public_toilets",
        "description": "Rows of Public toilets, ACT in the newest loaded version, filtered and paged. Each filter is `field=operator.value` in the query string, and every filter must match. A number or date field compares as a number or date, and a text field compares as text. Values are case-sensitive, except that `like` and `ilike` ignore case in the ASCII letters A to Z. Prefix `not.` to negate a filter, as `not.eq.value`. Operators: `eq.value`, `neq.value`, `gt.value`, `gte.value`, `lt.value`, `lte.value`, `like.*text*`, `ilike.*text*`, `in.(a,b,c)`, `is.null`.",
        "parameters": [
          {
            "name": "asset_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PUBLIC TOILET.",
            "examples": [
              "eq.PUBLIC TOILET"
            ]
          },
          {
            "name": "asset_sub_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. The publisher's type, such as a manual ablution block, a toilet inside a building, an automated toilet or a pit toilet. Values: AUTOMATED SYSTEM EG EXCELOO BRAND TOILET, MANUAL STYLE ABLUTION BLOCK, MANUAL STYLE ABLUTION BLOCKS WITH SHOWER FACILITIES, PIT TOILET, PUBLIC TOILET LOCATED WITHIN BUILDING.",
            "examples": [
              "eq.PUBLIC TOILET LOCATED WITHIN BUILDING"
            ]
          },
          {
            "name": "asset_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "asset_name",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "location",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "operational_state",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `ACTIVE` or `INACTIVE`, as the publisher records it. Values: ACTIVE, INACTIVE.",
            "examples": [
              "eq.INACTIVE"
            ]
          },
          {
            "name": "disabled_cubicle",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `DISABLED ACCESS` or `NO DISABLED ACCESS`, as the publisher records it. Values: DISABLED ACCESS, NO DISABLED ACCESS.",
            "examples": [
              "eq.NO DISABLED ACCESS"
            ]
          },
          {
            "name": "male_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3.",
            "examples": [
              "eq.3"
            ]
          },
          {
            "name": "female_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 12.",
            "examples": [
              "eq.12"
            ]
          },
          {
            "name": "unisex_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4.",
            "examples": [
              "eq.4"
            ]
          },
          {
            "name": "disabled_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "urinal_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "total_no_of_cubicles",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14.",
            "examples": [
              "eq.14"
            ]
          },
          {
            "name": "sink_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "toilet_access",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. When the public can use the toilet, such as `24 HOURS` or the hours of a reserve, as the publisher records it. Values: 24 HOURS, ACCESS BY KEY SUPPLIED BY AGENCY, ACCESS DURING ORGANISED SPORTS BOOKINGS, AEST 7AM TO 8PM, AEDT 7AM TO 10PM, NOT ACCESSIBLE TO THE PUBLIC, OFFICE HOURS, OPEN DURING RESERVE OPENING HOURS.",
            "examples": [
              "eq.OPEN DURING RESERVE OPENING HOURS"
            ]
          },
          {
            "name": "water_supply",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: POTABLE TOWN WATER, RAIN WATER FROM TANK, WATER FROM COMBINATION OF RIVER AND BORE, WATER FROM RIVER OR OTHER DRAINAGE LINE.",
            "examples": [
              "eq.WATER FROM RIVER OR OTHER DRAINAGE LINE"
            ]
          },
          {
            "name": "toilet_system",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: COMPOSTING SYSTEM, CONNECTED TO TOWN SEWERAGE, PIT TOILET, PUMPOUT SYSTEM, SEPTIC SYSTEM.",
            "examples": [
              "eq.SEPTIC SYSTEM"
            ]
          },
          {
            "name": "suburb",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string.",
            "examples": [
              "eq.YARRALUMLA"
            ]
          },
          {
            "name": "address",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "ownership",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PLACE MANAGEMENT, SPORTS AND RECREATION FACILITIES, SUBURBAN LAND AGENCY.",
            "examples": [
              "eq.SUBURBAN LAND AGENCY"
            ]
          },
          {
            "name": "maintained_by",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PM - BELCONNEN OPERATIONS, PM - GUNGAHLIN OPERATIONS, PM - INNER NORTH OPERATIONS, PM - INNER SOUTH OPERATIONS, PM - TUGGERANONG OPERATIONS, PM - WODEN WESTON MOLONGLO OPERATIONS, PRIVATE, SPORTS AND RECREATION FACILITIES.",
            "examples": [
              "eq.SPORTS AND RECREATION FACILITIES"
            ]
          },
          {
            "name": "last_edited_date",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "date. The date the publisher last edited the asset's record. From 2019-10-10 to 2026-06-16.",
            "examples": [
              "eq.2026-06-16"
            ]
          },
          {
            "name": "globalid",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "longitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From 148.765182770269 to 149.351231082048."
          },
          {
            "name": "latitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From -35.8869957589114 to -35.1371226979863."
          },
          {
            "name": "select",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Fields to return, comma-separated. Every field when absent."
          },
          {
            "name": "order",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "`field.asc` or `field.desc`, comma-separated. When absent, rows come in the order of the file they are read from. For the newest versions that is the version's own data.parquet, which keeps the publisher's order unless the dataset sorted it. Any other version is read from the Parquet file the answer names in `file`, and when that file is sorted the answer names its sort in `order`, which ties follow too."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 100
            },
            "description": "Rows per page, 1 to 10,000. 100 when absent."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Rows to skip. The `next` URL in each answer sets it for you."
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "ndjson",
                "csv"
              ],
              "default": "json"
            },
            "description": "`json`, `ndjson` or `csv`. JSON carries the provenance header, and the others carry it in response headers."
          }
        ],
        "responses": {
          "200": {
            "description": "Rows with the version, licence and attribution. `next` is the URL of the following page, or null. An answer read or counted from a Parquet file names it in `file`, or its period parts in `parts`, and a sorted file's sort in `order`."
          },
          "400": {
            "description": "The query names a field the dataset does not have, or a value of the wrong type."
          },
          "404": {
            "description": "The dataset does not exist here, or the version has no table to query."
          },
          "422": {
            "description": "The query would read more of the version's file than one answer may, or the file cannot be read in part. The error gives DuckDB SQL that answers it from the published file."
          },
          "429": {
            "description": "More than 60 requests in 10 seconds from one address. Blocked for 10 seconds. Wait `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds until the block lifts."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The limit, as \"fair-use\";q=60;w=10."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer",
                      "const": 429
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "window_seconds": {
                      "type": "integer"
                    },
                    "block_seconds": {
                      "type": "integer"
                    },
                    "docs": {
                      "type": "string",
                      "format": "uri"
                    },
                    "files": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/datasets/act-public-toilets/versions/{version}/rows": {
      "get": {
        "tags": [
          "query"
        ],
        "summary": "Query Public toilets, ACT",
        "operationId": "queryRows_act_public_toilets_version",
        "description": "Rows of Public toilets, ACT in one dated version, filtered and paged. Each filter is `field=operator.value` in the query string, and every filter must match. A number or date field compares as a number or date, and a text field compares as text. Values are case-sensitive, except that `like` and `ilike` ignore case in the ASCII letters A to Z. Prefix `not.` to negate a filter, as `not.eq.value`. Operators: `eq.value`, `neq.value`, `gt.value`, `gte.value`, `lt.value`, `lte.value`, `like.*text*`, `ilike.*text*`, `in.(a,b,c)`, `is.null`.",
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "A dated version, from the versions path. A dated version's answers stay the same unless a correction rebuilds the version, which its notes record."
          },
          {
            "name": "asset_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PUBLIC TOILET.",
            "examples": [
              "eq.PUBLIC TOILET"
            ]
          },
          {
            "name": "asset_sub_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. The publisher's type, such as a manual ablution block, a toilet inside a building, an automated toilet or a pit toilet. Values: AUTOMATED SYSTEM EG EXCELOO BRAND TOILET, MANUAL STYLE ABLUTION BLOCK, MANUAL STYLE ABLUTION BLOCKS WITH SHOWER FACILITIES, PIT TOILET, PUBLIC TOILET LOCATED WITHIN BUILDING.",
            "examples": [
              "eq.PUBLIC TOILET LOCATED WITHIN BUILDING"
            ]
          },
          {
            "name": "asset_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "asset_name",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "location",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "operational_state",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `ACTIVE` or `INACTIVE`, as the publisher records it. Values: ACTIVE, INACTIVE.",
            "examples": [
              "eq.INACTIVE"
            ]
          },
          {
            "name": "disabled_cubicle",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `DISABLED ACCESS` or `NO DISABLED ACCESS`, as the publisher records it. Values: DISABLED ACCESS, NO DISABLED ACCESS.",
            "examples": [
              "eq.NO DISABLED ACCESS"
            ]
          },
          {
            "name": "male_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3.",
            "examples": [
              "eq.3"
            ]
          },
          {
            "name": "female_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 12.",
            "examples": [
              "eq.12"
            ]
          },
          {
            "name": "unisex_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4.",
            "examples": [
              "eq.4"
            ]
          },
          {
            "name": "disabled_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "urinal_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "total_no_of_cubicles",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14.",
            "examples": [
              "eq.14"
            ]
          },
          {
            "name": "sink_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "toilet_access",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. When the public can use the toilet, such as `24 HOURS` or the hours of a reserve, as the publisher records it. Values: 24 HOURS, ACCESS BY KEY SUPPLIED BY AGENCY, ACCESS DURING ORGANISED SPORTS BOOKINGS, AEST 7AM TO 8PM, AEDT 7AM TO 10PM, NOT ACCESSIBLE TO THE PUBLIC, OFFICE HOURS, OPEN DURING RESERVE OPENING HOURS.",
            "examples": [
              "eq.OPEN DURING RESERVE OPENING HOURS"
            ]
          },
          {
            "name": "water_supply",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: POTABLE TOWN WATER, RAIN WATER FROM TANK, WATER FROM COMBINATION OF RIVER AND BORE, WATER FROM RIVER OR OTHER DRAINAGE LINE.",
            "examples": [
              "eq.WATER FROM RIVER OR OTHER DRAINAGE LINE"
            ]
          },
          {
            "name": "toilet_system",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: COMPOSTING SYSTEM, CONNECTED TO TOWN SEWERAGE, PIT TOILET, PUMPOUT SYSTEM, SEPTIC SYSTEM.",
            "examples": [
              "eq.SEPTIC SYSTEM"
            ]
          },
          {
            "name": "suburb",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string.",
            "examples": [
              "eq.YARRALUMLA"
            ]
          },
          {
            "name": "address",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "ownership",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PLACE MANAGEMENT, SPORTS AND RECREATION FACILITIES, SUBURBAN LAND AGENCY.",
            "examples": [
              "eq.SUBURBAN LAND AGENCY"
            ]
          },
          {
            "name": "maintained_by",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PM - BELCONNEN OPERATIONS, PM - GUNGAHLIN OPERATIONS, PM - INNER NORTH OPERATIONS, PM - INNER SOUTH OPERATIONS, PM - TUGGERANONG OPERATIONS, PM - WODEN WESTON MOLONGLO OPERATIONS, PRIVATE, SPORTS AND RECREATION FACILITIES.",
            "examples": [
              "eq.SPORTS AND RECREATION FACILITIES"
            ]
          },
          {
            "name": "last_edited_date",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "date. The date the publisher last edited the asset's record. From 2019-10-10 to 2026-06-16.",
            "examples": [
              "eq.2026-06-16"
            ]
          },
          {
            "name": "globalid",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "longitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From 148.765182770269 to 149.351231082048."
          },
          {
            "name": "latitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From -35.8869957589114 to -35.1371226979863."
          },
          {
            "name": "select",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Fields to return, comma-separated. Every field when absent."
          },
          {
            "name": "order",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "`field.asc` or `field.desc`, comma-separated. When absent, rows come in the order of the file they are read from. For the newest versions that is the version's own data.parquet, which keeps the publisher's order unless the dataset sorted it. Any other version is read from the Parquet file the answer names in `file`, and when that file is sorted the answer names its sort in `order`, which ties follow too."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 100
            },
            "description": "Rows per page, 1 to 10,000. 100 when absent."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Rows to skip. The `next` URL in each answer sets it for you."
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "ndjson",
                "csv"
              ],
              "default": "json"
            },
            "description": "`json`, `ndjson` or `csv`. JSON carries the provenance header, and the others carry it in response headers."
          }
        ],
        "responses": {
          "200": {
            "description": "Rows with the version, licence and attribution. `next` is the URL of the following page, or null. An answer read or counted from a Parquet file names it in `file`, or its period parts in `parts`, and a sorted file's sort in `order`."
          },
          "400": {
            "description": "The query names a field the dataset does not have, or a value of the wrong type."
          },
          "404": {
            "description": "The dataset does not exist here, or the version has no table to query."
          },
          "422": {
            "description": "The query would read more of the version's file than one answer may, or the file cannot be read in part. The error gives DuckDB SQL that answers it from the published file."
          },
          "429": {
            "description": "More than 60 requests in 10 seconds from one address. Blocked for 10 seconds. Wait `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds until the block lifts."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The limit, as \"fair-use\";q=60;w=10."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer",
                      "const": 429
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "window_seconds": {
                      "type": "integer"
                    },
                    "block_seconds": {
                      "type": "integer"
                    },
                    "docs": {
                      "type": "string",
                      "format": "uri"
                    },
                    "files": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/datasets/{slug}/aggregate": {
      "get": {
        "tags": [
          "query"
        ],
        "summary": "Counts, sums, averages, minimums and maximums by group",
        "operationId": "aggregate",
        "description": "Groups and totals of any dataset in the newest loaded version. Filters work as they do on rows. Each filter is `field=operator.value` in the query string, and every filter must match. A number or date field compares as a number or date, and a text field compares as text. Values are case-sensitive, except that `like` and `ilike` ignore case in the ASCII letters A to Z. Prefix `not.` to negate a filter, as `not.eq.value`. Operators: `eq.value`, `neq.value`, `gt.value`, `gte.value`, `lt.value`, `lte.value`, `like.*text*`, `ilike.*text*`, `in.(a,b,c)`, `is.null`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "act-public-toilets"
              ]
            },
            "description": "The dataset's slug, as in its page URL `/d/<slug>/`."
          },
          {
            "name": "group",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "On `aggregate`, fields to group by, comma-separated."
          },
          {
            "name": "metric",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "count"
            },
            "description": "On `aggregate`, `count`, `sum.field`, `avg.field`, `min.field` or `max.field`, comma-separated. `count` when absent."
          },
          {
            "name": "asset_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PUBLIC TOILET.",
            "examples": [
              "eq.PUBLIC TOILET"
            ]
          },
          {
            "name": "asset_sub_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. The publisher's type, such as a manual ablution block, a toilet inside a building, an automated toilet or a pit toilet. Values: AUTOMATED SYSTEM EG EXCELOO BRAND TOILET, MANUAL STYLE ABLUTION BLOCK, MANUAL STYLE ABLUTION BLOCKS WITH SHOWER FACILITIES, PIT TOILET, PUBLIC TOILET LOCATED WITHIN BUILDING.",
            "examples": [
              "eq.PUBLIC TOILET LOCATED WITHIN BUILDING"
            ]
          },
          {
            "name": "asset_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "asset_name",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "location",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "operational_state",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `ACTIVE` or `INACTIVE`, as the publisher records it. Values: ACTIVE, INACTIVE.",
            "examples": [
              "eq.INACTIVE"
            ]
          },
          {
            "name": "disabled_cubicle",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `DISABLED ACCESS` or `NO DISABLED ACCESS`, as the publisher records it. Values: DISABLED ACCESS, NO DISABLED ACCESS.",
            "examples": [
              "eq.NO DISABLED ACCESS"
            ]
          },
          {
            "name": "male_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3.",
            "examples": [
              "eq.3"
            ]
          },
          {
            "name": "female_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 12.",
            "examples": [
              "eq.12"
            ]
          },
          {
            "name": "unisex_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4.",
            "examples": [
              "eq.4"
            ]
          },
          {
            "name": "disabled_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "urinal_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "total_no_of_cubicles",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14.",
            "examples": [
              "eq.14"
            ]
          },
          {
            "name": "sink_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "toilet_access",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. When the public can use the toilet, such as `24 HOURS` or the hours of a reserve, as the publisher records it. Values: 24 HOURS, ACCESS BY KEY SUPPLIED BY AGENCY, ACCESS DURING ORGANISED SPORTS BOOKINGS, AEST 7AM TO 8PM, AEDT 7AM TO 10PM, NOT ACCESSIBLE TO THE PUBLIC, OFFICE HOURS, OPEN DURING RESERVE OPENING HOURS.",
            "examples": [
              "eq.OPEN DURING RESERVE OPENING HOURS"
            ]
          },
          {
            "name": "water_supply",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: POTABLE TOWN WATER, RAIN WATER FROM TANK, WATER FROM COMBINATION OF RIVER AND BORE, WATER FROM RIVER OR OTHER DRAINAGE LINE.",
            "examples": [
              "eq.WATER FROM RIVER OR OTHER DRAINAGE LINE"
            ]
          },
          {
            "name": "toilet_system",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: COMPOSTING SYSTEM, CONNECTED TO TOWN SEWERAGE, PIT TOILET, PUMPOUT SYSTEM, SEPTIC SYSTEM.",
            "examples": [
              "eq.SEPTIC SYSTEM"
            ]
          },
          {
            "name": "suburb",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string.",
            "examples": [
              "eq.YARRALUMLA"
            ]
          },
          {
            "name": "address",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "ownership",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PLACE MANAGEMENT, SPORTS AND RECREATION FACILITIES, SUBURBAN LAND AGENCY.",
            "examples": [
              "eq.SUBURBAN LAND AGENCY"
            ]
          },
          {
            "name": "maintained_by",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PM - BELCONNEN OPERATIONS, PM - GUNGAHLIN OPERATIONS, PM - INNER NORTH OPERATIONS, PM - INNER SOUTH OPERATIONS, PM - TUGGERANONG OPERATIONS, PM - WODEN WESTON MOLONGLO OPERATIONS, PRIVATE, SPORTS AND RECREATION FACILITIES.",
            "examples": [
              "eq.SPORTS AND RECREATION FACILITIES"
            ]
          },
          {
            "name": "last_edited_date",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "date. The date the publisher last edited the asset's record. From 2019-10-10 to 2026-06-16.",
            "examples": [
              "eq.2026-06-16"
            ]
          },
          {
            "name": "globalid",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "longitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From 148.765182770269 to 149.351231082048."
          },
          {
            "name": "latitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From -35.8869957589114 to -35.1371226979863."
          },
          {
            "name": "order",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "`field.asc` or `field.desc`, comma-separated. When absent, rows come in the order of the file they are read from. For the newest versions that is the version's own data.parquet, which keeps the publisher's order unless the dataset sorted it. Any other version is read from the Parquet file the answer names in `file`, and when that file is sorted the answer names its sort in `order`, which ties follow too."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 100
            },
            "description": "Rows per page, 1 to 10,000. 100 when absent."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Rows to skip. The `next` URL in each answer sets it for you."
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "ndjson",
                "csv"
              ],
              "default": "json"
            },
            "description": "`json`, `ndjson` or `csv`. JSON carries the provenance header, and the others carry it in response headers."
          }
        ],
        "responses": {
          "200": {
            "description": "Rows with the version, licence and attribution. `next` is the URL of the following page, or null. An answer read or counted from a Parquet file names it in `file`, or its period parts in `parts`, and a sorted file's sort in `order`."
          },
          "400": {
            "description": "The query names a field the dataset does not have, or a value of the wrong type."
          },
          "404": {
            "description": "The dataset does not exist here, or the version has no table to query."
          },
          "422": {
            "description": "The query would read more of the version's file than one answer may, or the file cannot be read in part. The error gives DuckDB SQL that answers it from the published file."
          },
          "429": {
            "description": "More than 60 requests in 10 seconds from one address. Blocked for 10 seconds. Wait `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds until the block lifts."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The limit, as \"fair-use\";q=60;w=10."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer",
                      "const": 429
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "window_seconds": {
                      "type": "integer"
                    },
                    "block_seconds": {
                      "type": "integer"
                    },
                    "docs": {
                      "type": "string",
                      "format": "uri"
                    },
                    "files": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/datasets/{slug}/versions/{version}/aggregate": {
      "get": {
        "tags": [
          "query"
        ],
        "summary": "Counts, sums, averages, minimums and maximums by group",
        "operationId": "aggregateVersion",
        "description": "Groups and totals of any dataset in one dated version. Filters work as they do on rows. Each filter is `field=operator.value` in the query string, and every filter must match. A number or date field compares as a number or date, and a text field compares as text. Values are case-sensitive, except that `like` and `ilike` ignore case in the ASCII letters A to Z. Prefix `not.` to negate a filter, as `not.eq.value`. Operators: `eq.value`, `neq.value`, `gt.value`, `gte.value`, `lt.value`, `lte.value`, `like.*text*`, `ilike.*text*`, `in.(a,b,c)`, `is.null`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "act-public-toilets"
              ]
            },
            "description": "The dataset's slug, as in its page URL `/d/<slug>/`."
          },
          {
            "name": "version",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "A dated version, from the versions path. A dated version's answers stay the same unless a correction rebuilds the version, which its notes record."
          },
          {
            "name": "group",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "On `aggregate`, fields to group by, comma-separated."
          },
          {
            "name": "metric",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "count"
            },
            "description": "On `aggregate`, `count`, `sum.field`, `avg.field`, `min.field` or `max.field`, comma-separated. `count` when absent."
          },
          {
            "name": "asset_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PUBLIC TOILET.",
            "examples": [
              "eq.PUBLIC TOILET"
            ]
          },
          {
            "name": "asset_sub_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. The publisher's type, such as a manual ablution block, a toilet inside a building, an automated toilet or a pit toilet. Values: AUTOMATED SYSTEM EG EXCELOO BRAND TOILET, MANUAL STYLE ABLUTION BLOCK, MANUAL STYLE ABLUTION BLOCKS WITH SHOWER FACILITIES, PIT TOILET, PUBLIC TOILET LOCATED WITHIN BUILDING.",
            "examples": [
              "eq.PUBLIC TOILET LOCATED WITHIN BUILDING"
            ]
          },
          {
            "name": "asset_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "asset_name",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "location",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "operational_state",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `ACTIVE` or `INACTIVE`, as the publisher records it. Values: ACTIVE, INACTIVE.",
            "examples": [
              "eq.INACTIVE"
            ]
          },
          {
            "name": "disabled_cubicle",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. `DISABLED ACCESS` or `NO DISABLED ACCESS`, as the publisher records it. Values: DISABLED ACCESS, NO DISABLED ACCESS.",
            "examples": [
              "eq.NO DISABLED ACCESS"
            ]
          },
          {
            "name": "male_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3.",
            "examples": [
              "eq.3"
            ]
          },
          {
            "name": "female_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 12.",
            "examples": [
              "eq.12"
            ]
          },
          {
            "name": "unisex_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4.",
            "examples": [
              "eq.4"
            ]
          },
          {
            "name": "disabled_cubicle_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "urinal_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "total_no_of_cubicles",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14.",
            "examples": [
              "eq.14"
            ]
          },
          {
            "name": "sink_number",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "integer. Values: 0, 1, 2, 3, 4, 5, 6.",
            "examples": [
              "eq.6"
            ]
          },
          {
            "name": "toilet_access",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. When the public can use the toilet, such as `24 HOURS` or the hours of a reserve, as the publisher records it. Values: 24 HOURS, ACCESS BY KEY SUPPLIED BY AGENCY, ACCESS DURING ORGANISED SPORTS BOOKINGS, AEST 7AM TO 8PM, AEDT 7AM TO 10PM, NOT ACCESSIBLE TO THE PUBLIC, OFFICE HOURS, OPEN DURING RESERVE OPENING HOURS.",
            "examples": [
              "eq.OPEN DURING RESERVE OPENING HOURS"
            ]
          },
          {
            "name": "water_supply",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: POTABLE TOWN WATER, RAIN WATER FROM TANK, WATER FROM COMBINATION OF RIVER AND BORE, WATER FROM RIVER OR OTHER DRAINAGE LINE.",
            "examples": [
              "eq.WATER FROM RIVER OR OTHER DRAINAGE LINE"
            ]
          },
          {
            "name": "toilet_system",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: COMPOSTING SYSTEM, CONNECTED TO TOWN SEWERAGE, PIT TOILET, PUMPOUT SYSTEM, SEPTIC SYSTEM.",
            "examples": [
              "eq.SEPTIC SYSTEM"
            ]
          },
          {
            "name": "suburb",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string.",
            "examples": [
              "eq.YARRALUMLA"
            ]
          },
          {
            "name": "address",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "ownership",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PLACE MANAGEMENT, SPORTS AND RECREATION FACILITIES, SUBURBAN LAND AGENCY.",
            "examples": [
              "eq.SUBURBAN LAND AGENCY"
            ]
          },
          {
            "name": "maintained_by",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string. Values: PARKS AND CONSERVATION SERVICE, PM - BELCONNEN OPERATIONS, PM - GUNGAHLIN OPERATIONS, PM - INNER NORTH OPERATIONS, PM - INNER SOUTH OPERATIONS, PM - TUGGERANONG OPERATIONS, PM - WODEN WESTON MOLONGLO OPERATIONS, PRIVATE, SPORTS AND RECREATION FACILITIES.",
            "examples": [
              "eq.SPORTS AND RECREATION FACILITIES"
            ]
          },
          {
            "name": "last_edited_date",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "date. The date the publisher last edited the asset's record. From 2019-10-10 to 2026-06-16.",
            "examples": [
              "eq.2026-06-16"
            ]
          },
          {
            "name": "globalid",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "string."
          },
          {
            "name": "longitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From 148.765182770269 to 149.351231082048."
          },
          {
            "name": "latitude",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "number. From -35.8869957589114 to -35.1371226979863."
          },
          {
            "name": "order",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "`field.asc` or `field.desc`, comma-separated. When absent, rows come in the order of the file they are read from. For the newest versions that is the version's own data.parquet, which keeps the publisher's order unless the dataset sorted it. Any other version is read from the Parquet file the answer names in `file`, and when that file is sorted the answer names its sort in `order`, which ties follow too."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 100
            },
            "description": "Rows per page, 1 to 10,000. 100 when absent."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "description": "Rows to skip. The `next` URL in each answer sets it for you."
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "ndjson",
                "csv"
              ],
              "default": "json"
            },
            "description": "`json`, `ndjson` or `csv`. JSON carries the provenance header, and the others carry it in response headers."
          }
        ],
        "responses": {
          "200": {
            "description": "Rows with the version, licence and attribution. `next` is the URL of the following page, or null. An answer read or counted from a Parquet file names it in `file`, or its period parts in `parts`, and a sorted file's sort in `order`."
          },
          "400": {
            "description": "The query names a field the dataset does not have, or a value of the wrong type."
          },
          "404": {
            "description": "The dataset does not exist here, or the version has no table to query."
          },
          "422": {
            "description": "The query would read more of the version's file than one answer may, or the file cannot be read in part. The error gives DuckDB SQL that answers it from the published file."
          },
          "429": {
            "description": "More than 60 requests in 10 seconds from one address. Blocked for 10 seconds. Wait `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds until the block lifts."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The limit, as \"fair-use\";q=60;w=10."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer",
                      "const": 429
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "window_seconds": {
                      "type": "integer"
                    },
                    "block_seconds": {
                      "type": "integer"
                    },
                    "docs": {
                      "type": "string",
                      "format": "uri"
                    },
                    "files": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/datasets/{slug}/versions": {
      "get": {
        "tags": [
          "query"
        ],
        "summary": "The versions of a dataset with a table to query, newest first, with the URLs to query each",
        "operationId": "queryVersions",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "act-public-toilets"
              ]
            },
            "description": "The dataset's slug, as in its page URL `/d/<slug>/`."
          }
        ],
        "responses": {
          "200": {
            "description": "Versions with row counts and URLs."
          },
          "404": {
            "description": "The dataset does not exist here, or the version has no table to query."
          },
          "429": {
            "description": "More than 60 requests in 10 seconds from one address. Blocked for 10 seconds. Wait `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds until the block lifts."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The limit, as \"fair-use\";q=60;w=10."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer",
                      "const": 429
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "window_seconds": {
                      "type": "integer"
                    },
                    "block_seconds": {
                      "type": "integer"
                    },
                    "docs": {
                      "type": "string",
                      "format": "uri"
                    },
                    "files": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
