openapi: 3.1.0 info: title: ATCO Electric Hosting Capacity Feature Service version: '12' summary: >- DER hosting capacity for ATCO Electric's Alberta distribution system, published as a public, anonymously queryable Esri ArcGIS REST feature service. description: >- ATCO Electric publishes distributed energy resource (DER) hosting capacity for its Alberta distribution system as an Esri ArcGIS Online hosted feature service. A single polyline feature layer, "Hosting Capacity (KW)" (layer id 0), carries one feature per feeder segment with the substation, circuit, phase and the DER capacity in kW that the segment can host. An anonymous count query returned 880,623 features and 135 distinct substation names on 2026-07-27. This OpenAPI document was GENERATED by API Evangelist from the service's own self-describing ArcGIS REST descriptors (harvested verbatim to openapi/atco-electric-hosting-capacity-featureserver.esri.json and openapi/atco-electric-hosting-capacity-layer-0.esri.json) plus live, anonymous probes of the running service on 2026-07-27. ATCO publishes no OpenAPI of its own and no API documentation page; the parameter set below is the subset of the Esri ArcGIS REST Feature Service query specification that this service actually advertises (capabilities "Query") and that was exercised successfully against the live endpoint. Nothing here is invented: every path, parameter and field is present in the harvested descriptor or was confirmed by a live request. Access is completely ungated: no API key, no token, no signup, no referer check and no licence click-through. `Access-Control-Allow-Origin: *` is returned, so the service is directly callable from a browser. maxRecordCount is 1000, so paginate with `resultOffset` and `resultRecordCount` and watch `exceededTransferLimit` in the response. Note on error semantics: ArcGIS REST returns application errors with HTTP status 200 and an `{"error": {...}}` body rather than a 4xx status. See errors/atco-problem-types.yml. contact: name: ATCO Electric url: https://electric.atco.com/en-ca/about-us/contact.html x-generated-by: API Evangelist enrichment pipeline x-generated: '2026-07-27' x-method: generated x-source: - https://services7.arcgis.com/cw2emabghNLkoYlB/arcgis/rest/services/AGO_HostingCapacity/FeatureServer?f=json - https://services7.arcgis.com/cw2emabghNLkoYlB/arcgis/rest/services/AGO_HostingCapacity/FeatureServer/0?f=json externalDocs: description: Esri ArcGIS REST API — Feature Service reference (the upstream contract this service implements) url: https://developers.arcgis.com/rest/services-reference/enterprise/feature-service/ servers: - url: https://services7.arcgis.com/cw2emabghNLkoYlB/arcgis/rest/services/AGO_HostingCapacity/FeatureServer description: ATCO Electric AGO_HostingCapacity feature service (ArcGIS Online tenant cw2emabghNLkoYlB, org urlKey "ATCO") tags: - name: Service description: Feature service and feature layer metadata - name: Query description: Read-only queries against the hosting capacity feature layer security: [] paths: /: get: tags: - Service operationId: getFeatureServiceInfo summary: Get feature service metadata description: >- Returns the self-describing FeatureServer descriptor — currentVersion, serviceDescription, capabilities, maxRecordCount, spatial reference, full extent and the layer list. parameters: - $ref: '#/components/parameters/f' responses: '200': description: Feature service descriptor, or an ArcGIS error envelope. content: application/json: schema: $ref: '#/components/schemas/FeatureServiceInfo' examples: serviceInfo: summary: AGO Hosting Capacity service descriptor (truncated) value: currentVersion: 12 serviceItemId: 7b4d2b3dcecb4a509f34cbfc3587ff3e serviceDescription: AGO Hosting Capacity description: CYME Hosting Capacity Map capabilities: Query maxRecordCount: 1000 layers: - id: 0 name: Hosting Capacity (KW) type: Feature Layer geometryType: esriGeometryPolyline /0: get: tags: - Service operationId: getHostingCapacityLayerInfo summary: Get hosting capacity feature layer metadata description: >- Returns the layer 0 descriptor — field definitions, object id field, geometry type, extent, drawing info, advanced query capabilities and record-count limits. parameters: - $ref: '#/components/parameters/f' responses: '200': description: Feature layer descriptor, or an ArcGIS error envelope. content: application/json: schema: $ref: '#/components/schemas/FeatureLayerInfo' /0/query: get: tags: - Query operationId: queryHostingCapacity summary: Query hosting capacity feeder segments description: >- Query the "Hosting Capacity (KW)" layer with a SQL `where` clause, an optional spatial filter, and optional statistics. Supports pagination via `resultOffset` / `resultRecordCount` (maxRecordCount 1000; `standardMaxRecordCount` 2000, and 32000 when `returnGeometry=false`). Set `returnCountOnly=true` for a feature count, `returnDistinctValues=true` for a distinct-value list, and `f=geojson` for RFC 7946 GeoJSON. parameters: - $ref: '#/components/parameters/where' - $ref: '#/components/parameters/objectIds' - $ref: '#/components/parameters/geometry' - $ref: '#/components/parameters/geometryType' - $ref: '#/components/parameters/inSR' - $ref: '#/components/parameters/spatialRel' - $ref: '#/components/parameters/outFields' - $ref: '#/components/parameters/returnGeometry' - $ref: '#/components/parameters/outSR' - $ref: '#/components/parameters/orderByFields' - $ref: '#/components/parameters/groupByFieldsForStatistics' - $ref: '#/components/parameters/outStatistics' - $ref: '#/components/parameters/returnDistinctValues' - $ref: '#/components/parameters/returnCountOnly' - $ref: '#/components/parameters/returnExtentOnly' - $ref: '#/components/parameters/returnIdsOnly' - $ref: '#/components/parameters/resultOffset' - $ref: '#/components/parameters/resultRecordCount' - $ref: '#/components/parameters/having' - $ref: '#/components/parameters/f' responses: '200': description: >- A feature set, a count, a distinct-value set, or an ArcGIS error envelope (ArcGIS returns application errors with HTTP 200). content: application/json: schema: oneOf: - $ref: '#/components/schemas/FeatureSet' - $ref: '#/components/schemas/CountResult' - $ref: '#/components/schemas/ErrorEnvelope' examples: count: summary: Total feature count (verified 2026-07-27) value: count: 880623 invalidWhere: summary: Error envelope returned with HTTP 200 value: error: code: 400 message: Cannot perform query. Invalid query parameters. details: - "'where' parameter is invalid" application/geo+json: schema: $ref: '#/components/schemas/GeoJSONFeatureCollection' post: tags: - Query operationId: queryHostingCapacityByPost summary: Query hosting capacity feeder segments (form POST) description: >- Identical to the GET form, submitted as `application/x-www-form-urlencoded`. Use this when the `where` clause or geometry exceeds practical URL length. Verified anonymously on 2026-07-27. requestBody: required: true content: application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QueryRequest' examples: bySubstation: summary: Count segments on the BONNYVILLE substation (verified — 34,009) value: where: "SUB_NAME='BONNYVILLE'" returnCountOnly: true f: json responses: '200': description: >- A feature set, a count, or an ArcGIS error envelope. content: application/json: schema: oneOf: - $ref: '#/components/schemas/FeatureSet' - $ref: '#/components/schemas/CountResult' - $ref: '#/components/schemas/ErrorEnvelope' /0/queryTopFeatures: get: tags: - Query operationId: queryTopHostingCapacityFeatures summary: Query top features per group description: >- Return the top N features within each group — for example the highest DER capacity segment per substation. The layer advertises `supportsTopFeaturesQuery: true`; a `where` clause is required in addition to `topFilter`. Verified anonymously on 2026-07-27. parameters: - $ref: '#/components/parameters/topFilter' - $ref: '#/components/parameters/where' - $ref: '#/components/parameters/outFields' - $ref: '#/components/parameters/returnGeometry' - $ref: '#/components/parameters/resultOffset' - $ref: '#/components/parameters/resultRecordCount' - $ref: '#/components/parameters/f' responses: '200': description: A feature set of the top features per group, or an ArcGIS error envelope. content: application/json: schema: oneOf: - $ref: '#/components/schemas/FeatureSet' - $ref: '#/components/schemas/ErrorEnvelope' components: parameters: f: name: f in: query required: false description: >- Response format. The service advertises supportedQueryFormats "JSON, geoJSON, PBF"; `html` and `pjson` are also served by ArcGIS REST. schema: type: string enum: [json, geojson, pbf, pjson, html] default: html where: name: where in: query required: false description: >- A standardized SQL WHERE clause over the layer's fields (the layer sets `useStandardizedQueries: true`). Use `1=1` for all features. schema: type: string examples: all: value: 1=1 bySubstation: value: "SUB_NAME='BONNYVILLE'" byCapacity: value: DER_CAP_KW > 15000 objectIds: name: objectIds in: query required: false description: Comma-separated OBJECTID list. maxIdsCount is 1,000,000. schema: type: string geometry: name: geometry in: query required: false description: Spatial filter geometry, as JSON or comma-separated envelope/point coordinates. schema: type: string geometryType: name: geometryType in: query required: false schema: type: string enum: - esriGeometryPoint - esriGeometryMultipoint - esriGeometryPolyline - esriGeometryPolygon - esriGeometryEnvelope default: esriGeometryEnvelope inSR: name: inSR in: query required: false description: >- Spatial reference of the input geometry. The layer's native spatial reference is wkid 102185 / latestWkid 3401 (NAD83 / Alberta 3TM ref merid 115 W). schema: type: string spatialRel: name: spatialRel in: query required: false description: Spatial relationship to apply. Values taken verbatim from the layer's `supportedSpatialRelationships`. schema: type: string enum: - esriSpatialRelIntersects - esriSpatialRelContains - esriSpatialRelCrosses - esriSpatialRelEnvelopeIntersects - esriSpatialRelIndexIntersects - esriSpatialRelOverlaps - esriSpatialRelTouches - esriSpatialRelWithin - esriSpatialRelDisjoint - esriSpatialRelRelation default: esriSpatialRelIntersects outFields: name: outFields in: query required: false description: Comma-separated field list, or `*` for all fields. schema: type: string default: '*' returnGeometry: name: returnGeometry in: query required: false description: >- Include feature geometry. Setting this to false raises the per-request ceiling to `standardMaxRecordCountNoGeometry` (32,000). schema: type: boolean default: true outSR: name: outSR in: query required: false description: Output spatial reference wkid, e.g. 4326 for WGS84. schema: type: string orderByFields: name: orderByFields in: query required: false description: "Comma-separated `FIELD [ASC|DESC]` list. Layer advertises `supportsOrderBy: true`." schema: type: string groupByFieldsForStatistics: name: groupByFieldsForStatistics in: query required: false description: Comma-separated group-by field list, used with `outStatistics`. schema: type: string outStatistics: name: outStatistics in: query required: false description: >- JSON array of statistic definitions. Supported statistic types include COUNT, SUM, AVG, VAR, STDDEV, MIN, MAX and the percentile family. schema: type: string returnDistinctValues: name: returnDistinctValues in: query required: false description: "Return distinct values for `outFields`. Layer advertises `supportsDistinct: true`." schema: type: boolean default: false returnCountOnly: name: returnCountOnly in: query required: false description: Return only the matching feature count. schema: type: boolean default: false returnExtentOnly: name: returnExtentOnly in: query required: false description: "Return only the extent of matching features. Layer advertises `supportsReturningQueryExtent: true`." schema: type: boolean default: false returnIdsOnly: name: returnIdsOnly in: query required: false description: Return only OBJECTIDs of matching features. schema: type: boolean default: false resultOffset: name: resultOffset in: query required: false description: >- Zero-based offset into the result set. Layer advertises `supportsPagination: true`. Pair with `resultRecordCount` and always order by a stable field. schema: type: integer minimum: 0 resultRecordCount: name: resultRecordCount in: query required: false description: >- Page size. maxRecordCount is 1000; standardMaxRecordCount 2000; 32000 with `returnGeometry=false`. schema: type: integer minimum: 1 maximum: 32000 having: name: having in: query required: false description: "SQL HAVING clause applied to grouped statistics. Layer advertises `supportsHavingClause: true`." schema: type: string topFilter: name: topFilter in: query required: true description: >- JSON object with `groupByFields`, `topCount` and `orderByFields` selecting the top N features per group. schema: type: string example: '{"groupByFields":"SUB_NAME","topCount":1,"orderByFields":"DER_CAP_KW DESC"}' schemas: FeatureServiceInfo: type: object description: ArcGIS REST FeatureServer descriptor. Harvested verbatim in openapi/atco-electric-hosting-capacity-featureserver.esri.json. properties: currentVersion: type: number serviceItemId: type: string serviceDescription: type: string description: type: string capabilities: type: string description: Comma-separated capability list. This service advertises "Query" only — it is read-only. maxRecordCount: type: integer maxIdsCount: type: integer supportedQueryFormats: type: string supportedExportFormats: type: string spatialReference: $ref: '#/components/schemas/SpatialReference' fullExtent: $ref: '#/components/schemas/Extent' initialExtent: $ref: '#/components/schemas/Extent' layers: type: array items: type: object properties: id: type: integer name: type: string type: type: string geometryType: type: string tables: type: array items: type: object FeatureLayerInfo: type: object description: ArcGIS REST Feature Layer descriptor. Harvested verbatim in openapi/atco-electric-hosting-capacity-layer-0.esri.json. properties: id: type: integer name: type: string type: type: string geometryType: type: string objectIdField: type: string displayField: type: string maxRecordCount: type: integer standardMaxRecordCount: type: integer standardMaxRecordCountNoGeometry: type: integer capabilities: type: string extent: $ref: '#/components/schemas/Extent' fields: type: array items: $ref: '#/components/schemas/FieldInfo' FieldInfo: type: object properties: name: type: string type: type: string alias: type: string sqlType: type: string length: type: integer nullable: type: boolean editable: type: boolean SpatialReference: type: object properties: wkid: type: integer latestWkid: type: integer Extent: type: object properties: xmin: type: number ymin: type: number xmax: type: number ymax: type: number spatialReference: $ref: '#/components/schemas/SpatialReference' HostingCapacityAttributes: type: object description: >- Attributes of one feeder segment in the "Hosting Capacity (KW)" layer. Field names, types, aliases and lengths are taken verbatim from the layer descriptor. properties: OBJECTID: type: integer description: System-maintained object id (esriFieldTypeOID), unique and not nullable. FEEDER: type: [string, 'null'] maxLength: 200 description: Feeder / circuit identifier (field alias "CIRCUIT"). examples: ['700-508'] PHASE: type: [string, 'null'] maxLength: 200 description: Phase designation of the segment. examples: ['B', 'AB'] SUB_NAME: type: [string, 'null'] maxLength: 200 description: Substation name. The layer's displayField. 135 distinct values observed 2026-07-27. examples: ['BONNYVILLE'] SUB_NUM: type: [string, 'null'] maxLength: 200 description: Substation number. examples: ['700S'] DATELOADED: type: [string, 'null'] maxLength: 200 description: >- Load date of the underlying CYME hosting capacity study, as an unpadded YYYYMMDD string (stored as a string field, not a date field). examples: ['20251031'] DER_CAP_KW: type: [number, 'null'] description: Distributed energy resource hosting capacity for the segment, in kilowatts. examples: [62.9] DER_CAP_KW1: type: [number, 'null'] description: >- Second DER capacity field carrying the alias "DER_CAP_KW". Observed equal to DER_CAP_KW in sampled features; ATCO publishes no field definitions, so the intended distinction is undocumented. examples: [62.9] PROJECT_AREA: type: [string, 'null'] maxLength: 50 description: Project area (field alias "PROJ_AREA"). Null in sampled features. SE_ANNO_CAD_DATA: type: [string, 'null'] description: ArcSDE annotation CAD blob field (esriFieldTypeBlob). Empty in sampled features. Shape__Length: type: [number, 'null'] description: Segment length in metres (geometryProperties.units esriMeters). Read-only. examples: [678.11243656856732] Feature: type: object properties: attributes: $ref: '#/components/schemas/HostingCapacityAttributes' geometry: type: [object, 'null'] description: Esri polyline geometry — a `paths` array of coordinate arrays. properties: paths: type: array items: type: array items: type: array items: type: number FeatureSet: type: object properties: objectIdFieldName: type: string uniqueIdField: type: object properties: name: type: string isSystemMaintained: type: boolean globalIdFieldName: type: string geometryType: type: string spatialReference: $ref: '#/components/schemas/SpatialReference' fields: type: array items: $ref: '#/components/schemas/FieldInfo' exceededTransferLimit: type: boolean description: >- True when more features match than were returned. This is the pagination signal — keep advancing `resultOffset` until it is absent or false. features: type: array items: $ref: '#/components/schemas/Feature' GeoJSONFeatureCollection: type: object description: RFC 7946 GeoJSON, returned when `f=geojson`. Verified against the live service 2026-07-27. properties: type: type: string const: FeatureCollection properties: type: object properties: exceededTransferLimit: type: boolean features: type: array items: type: object properties: type: type: string const: Feature id: type: integer geometry: type: [object, 'null'] properties: $ref: '#/components/schemas/HostingCapacityAttributes' CountResult: type: object properties: count: type: integer examples: [880623] QueryRequest: type: object description: Form-encoded body for the POST form of the query operation. properties: where: type: string objectIds: type: string geometry: type: string geometryType: type: string spatialRel: type: string outFields: type: string returnGeometry: type: boolean outSR: type: string orderByFields: type: string groupByFieldsForStatistics: type: string outStatistics: type: string returnDistinctValues: type: boolean returnCountOnly: type: boolean resultOffset: type: integer resultRecordCount: type: integer f: type: string ErrorEnvelope: type: object description: >- ArcGIS REST error envelope. Note that it is returned with HTTP status 200, not a 4xx — clients MUST inspect the body for an `error` member rather than relying on the status code. properties: error: type: object properties: code: type: integer message: type: string details: type: array items: type: string