openapi: 3.0.3
info:
  title: 'OGC API - Records - Part 1: Core'
  version: 1.0.0
  description: |-
    This is a sample OpenAPI definition that conforms to the conformance
    classes "Core", "GeoJSON", "HTML" and "OpenAPI 3.0" of the draft
    standard "OGC API - Records - Part 1: Core".

    This example is a generic OGC API - Records definition that uses path
    parameters to describe all record collections and all records.
    The generic OpenAPI definition does not provide any details on the
    collections or the record content. This information is only available
    from accessing the record collection resources.

    There is [another example](ogcapi-records-1-example2.yaml)
    that specifies each collection explicitly.
  contact:
    name: CubeWerx Inc.
    email: pvretano@cubewerx.com
    url: https://www.cubewerx.com
  license:
    name: CC-BY 4.0 license
    url: https://creativecommons.org/licenses/by/4.0/
servers:
  - url: https://example.org/data
    description: Production server
  - url: https://example.org/data-dev
    description: Development server
security:
  - openIdConnect: []
tags:
  - name: Capabilities
    description: essential characteristics of this API
  - name: Conformance
    description: list of conformance classes implemented by this API
  - name: Collections
    description: list of catalogs offered by this API
  - name: Collection
    description: description of a catalog offered by this API
  - name: Sortables
    description: list of record properties by which responses can be sorted
  - name: Records
    description: access to records
  - name: Record
    description: access to a single record
paths:
  /:
    get:
      tags:
        - Capabilities
      summary: landing page
      description: |-
        The landing page provides links to the API definition, the conformance
        statements and to the record collections in this dataset.
      operationId: getLandingPage
      responses:
        '200':
          $ref: '#/components/responses/LandingPage'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /conformance:
    get:
      tags:
        - Conformance
      summary: information about specifications that this API conforms to
      description: |-
        A list of all conformance classes specified in a standard that the
        server conforms to.
      operationId: getConformanceDeclaration
      responses:
        '200':
          $ref: '#/components/responses/ConformanceDeclaration'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /collections:
    get:
      tags:
        - Collections
      summary: the record collections
      description: Fetch list of catalogs offered by this API
      operationId: getCollections
      responses:
        '200':
          $ref: '#/components/responses/Catalogs'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /collections/{catalogId}:
    get:
      tags:
        - Collection
      summary: describe the record collection with id `catalogId`
      description: |-
        Fetch a detailed description of a catalog or collection of records
        with id `catalogId`.
      operationId: describeCollection
      parameters:
        - $ref: '#/components/parameters/catalogId'
      responses:
        '200':
          $ref: '#/components/responses/Catalog'
        '404':
          $ref: '#/components/responses/NotFound'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /collections/{catalogId}/sortables:
    get:
      tags:
        - Sortables
      summary: get the list of sortable properties
      description: |-
        Fetch the list of properties which can be used to sort the getRecords
        response.
      operationId: getSortables
      parameters:
        - $ref: '#/components/parameters/catalogId'
      responses:
        '200':
          $ref: '#/components/responses/Sortables'
        '404':
          $ref: '#/components/responses/NotFound'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /collections/{catalogId}/items:
    get:
      tags:
        - Records
      summary: fetch records
      description: |-
        Fetch records from the record collection with id `catalogId`.

        Every record in a dataset belongs to a collection. A dataset may
        consist of multiple record collections. A record collection is often a
        collection of records of a similar type, based on a common schema.

        Use content negotiation to request HTML or GeoJSON.
      operationId: getRecords
      parameters:
        - $ref: '#/components/parameters/catalogId'
        - $ref: '#/components/parameters/bbox'
        - $ref: '#/components/parameters/datetime'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/q'
        - $ref: '#/components/parameters/type'
        - $ref: '#/components/parameters/externalId'
        - $ref: '#/components/parameters/ids'
        - $ref: '#/components/parameters/sortby'
      responses:
        '200':
          $ref: '#/components/responses/Records'
        '404':
          $ref: '#/components/responses/NotFound'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
  /collections/{catalogId}/items/{recordId}:
    get:
      tags:
        - Record
      summary: fetch a single record
      description: |-
        Fetch the record with id `recordId` from the record collection
        with id `catalogId`.

        Use content negotiation to request HTML or GeoJSON.
      operationId: getRecord
      parameters:
        - $ref: '#/components/parameters/catalogId'
        - $ref: '#/components/parameters/recordId'
      responses:
        '200':
          $ref: '#/components/responses/Record'
        '404':
          $ref: '#/components/responses/NotFound'
        '406':
          $ref: '#/components/responses/NotAcceptable'
        4XX:
          $ref: '#/components/responses/BadRequest'
        5XX:
          $ref: '#/components/responses/ServerError'
components:
  securitySchemes:
    openIdConnect:
      type: openIdConnect
      openIdConnectUrl: https://accounts.google.com/.well-known/openid-configuration
  schemas:
    linkBase:
      type: object
      properties:
        rel:
          type: string
          description: The type or semantics of the relation.
        type:
          type: string
          description: A hint indicating what the media type of the result of dereferencing the link should be.
        hreflang:
          type: string
          description: A hint indicating what the language of the result of dereferencing the link should be.
        title:
          type: string
          description: Used to label the destination of a link such that it can be used as a human-readable identifier.
        length:
          type: integer
        created:
          type: string
          description: Date of creation of the resource pointed to by the link.
          format: date-time
        updated:
          type: string
          description: Most recent date on which the resource pointed to by the link was changed.
          format: date-time
    link:
      allOf:
        - $ref: '#/components/schemas/linkBase'
        - type: object
          required:
            - href
          properties:
            href:
              type: string
              format: uri
    linkTemplate:
      allOf:
        - $ref: '#/components/schemas/linkBase'
        - type: object
          required:
            - uriTemplate
          properties:
            uriTemplate:
              type: string
              description: Supplies a resolvable URI to a remote resource (or resource fragment).
            varBase:
              type: string
              description: The base URI to which the variable name can be appended to retrieve the definition of the variable as a JSON Schema fragment.
              format: uri
            variables:
              type: object
              description: This object contains one key per substitution variable in the templated URL.  Each key defines the schema of one substitution variable using a JSON Schema fragment and can thus include things like the data type of the variable, enumerations, minimum values, maximum values, etc.
    landingPage:
      type: object
      required:
        - links
      properties:
        title:
          type: string
        description:
          type: string
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        linkTemplates:
          type: array
          items:
            $ref: '#/components/schemas/linkTemplate'
    exception:
      type: object
      required:
        - code
      properties:
        code:
          type: string
        description:
          type: string
    extent:
      description: |-
        The extent of the features in the collection. In the Core only spatial and temporal extents are specified. Extensions may add additional members to represent other extents, for example, thermal or pressure ranges.
        An array of extents is provided for each extent type (spatial, temporal). The first item in the array describes the overall extent of the data. All subsequent items describe more precise extents, e.g., to identify clusters of data. Clients only interested in the overall extent will only need to access the first extent in the array.
      type: object
      properties:
        spatial:
          description: The spatial extent of the features in the collection.
          type: object
          properties:
            bbox:
              description: |-
                One or more bounding boxes that describe the spatial extent
                of the dataset.  In the Core only a single bounding box is
                supported.

                Extensions may support additional areas.
                The first bounding box describes the overall spatial
                extent of the data. All subsequent bounding boxes describe
                more precise bounding boxes, e.g., to identify clusters of data.
                Clients only interested in the overall spatial extent will
                only need to access the first bounding box in the array.
              type: array
              minItems: 1
              items:
                description: |-
                  Each bounding box is provided as four or six numbers,
                  depending on whether the coordinate reference system
                  includes a vertical axis (height or depth)

                  * Lower left corner, coordinate axis 1
                  * Lower left corner, coordinate axis 2
                  * Minimum value, coordinate axis 3 (optional)
                  * Upper right corner, coordinate axis 1
                  * Upper right corner, coordinate axis 2
                  * Maximum value, coordinate axis 3 (optional)

                  If the value consists of four numbers, the coordinate
                  reference system is WGS 84 longitude/latitude
                  (http://www.opengis.net/def/crs/OGC/1.3/CRS84)
                  unless a different coordinate reference system is specified
                  in `crs`.

                  If the value consists of six numbers, the coordinate
                  reference system is WGS 84 longitude/latitude/ellipsoidal
                  height (http://www.opengis.net/def/crs/OGC/0/CRS84h)
                  unless a different coordinate reference system is specified
                  in `crs`.

                  For WGS 84 longitude/latitude the values are in most cases
                  the sequence of minimum longitude, minimum latitude, maximum
                  longitude and maximum latitude.  However, in cases where the
                  box spans the antimeridian the first value (west-most box
                  edge) is larger than the third value (east-most box edge).

                  If the vertical axis is included, the third and the sixth
                  number are the bottom and the top of the 3-dimensional
                  bounding box.

                  If a feature has multiple spatial geometry properties, it is
                  the decision of the server whether only a single spatial
                  geometry property is used to determine the extent or all
                  relevant geometries.
                type: array
                oneOf:
                  - minItems: 4
                    maxItems: 4
                  - minItems: 6
                    maxItems: 6
                items:
                  type: number
            crs:
              description: Coordinate reference system of the coordinates in the spatial extent (property `bbox`). The default reference system is WGS 84 longitude/latitude. In the Core the only other supported coordinate reference system is WGS 84 longitude/latitude/ ellipsoidal height for coordinates with height. Extensions may support additional coordinate reference systems and add additional enum values.
              type: string
              enum:
                - http://www.opengis.net/def/crs/OGC/1.3/CRS84
                - http://www.opengis.net/def/crs/OGC/0/CRS84h
              default: http://www.opengis.net/def/crs/OGC/1.3/CRS84
        temporal:
          description: The temporal extent of the features in the collection.
          type: object
          properties:
            interval:
              description: |-
                One or more time intervals that describe the temporal extent of the dataset. In the Core only a single time interval is supported.
                Extensions may support multiple intervals. The first time interval describes the overall temporal extent of the data. All subsequent time intervals describe more precise time intervals, e.g., to identify clusters of data. Clients only interested in the overall temporal extent will only need to access the first time interval in the array (a pair of lower and upper bound instants).
              type: array
              minItems: 1
              items:
                description: |-
                  Begin and end times of the time interval. The timestamps are
                  in the temporal coordinate reference system specified in
                  `trs`. By default this is the Gregorian calendar.

                  The value `null` at start or end is supported and indicates
                  a half-bounded interval.
                type: array
                minItems: 2
                maxItems: 2
                items:
                  type: string
                  format: date-time
                  nullable: true
            trs:
              description: |-
                Coordinate reference system of the coordinates in the temporal
                extent (property `interval`). The default reference system is
                the Gregorian calendar. In the Core this is the only supported
                temporal coordinate reference system. Extensions may support
                additional temporal coordinate reference systems and add
                additional enum values.
              type: string
              enum:
                - http://www.opengis.net/def/uom/ISO-8601/0/Gregorian
              default: http://www.opengis.net/def/uom/ISO-8601/0/Gregorian
    collection:
      type: object
      required:
        - id
        - links
      properties:
        id:
          description: identifier of the collection used, for example, in URIs
          type: string
        title:
          description: human readable title of the collection
          type: string
        description:
          description: a description of the features in the collection
          type: string
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        extent:
          $ref: '#/components/schemas/extent'
        itemType:
          description: indicator about the type of the items in the collection (the default value is 'feature').
          type: string
          default: feature
        crs:
          description: the list of coordinate reference systems supported by the service
          type: array
          items:
            type: string
          default:
            - http://www.opengis.net/def/crs/OGC/1.3/CRS84
    collections:
      type: object
      required:
        - links
        - collections
      properties:
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        collections:
          type: array
          items:
            $ref: '#/components/schemas/collection'
    theme:
      type: object
      required:
        - concepts
        - scheme
      properties:
        concepts:
          type: array
          description: One or more entity/concept identifiers from this knowledge system. it is recommended that a resolvable URI be used for each entity/concept identifier.
          minItems: 1
          items:
            type: object
            required:
              - id
            properties:
              id:
                type: string
                description: An identifier for the concept.
              title:
                type: string
                description: A human readable title for the concept.
              description:
                type: string
                description: A human readable description for the concept.
              url:
                type: string
                format: uri
                description: A URI providing further description of the concept.
        scheme:
          type: string
          description: An identifier for the knowledge organization system used to classify the resource.  It is recommended that the identifier be a resolvable URI.  The list of schemes used in a searchable catalog can be determined by inspecting the server's OpenAPI document or, if the server implements CQL2, by exposing a queryable (e.g. named `scheme`) and enumerating the list of schemes in the queryable's schema definition.
    language:
      type: object
      description: The language used for textual values in this record.
      required:
        - code
      properties:
        code:
          type: string
          description: The language tag as per RFC-5646.
        name:
          type: string
          minLength: 1
          description: The untranslated name of the language.
        alternate:
          type: string
          description: The name of the language in another well-understood language, usually English.
        dir:
          type: string
          description: The direction for text in this language. The default, `ltr` (left-to-right), represents the most common situation. However, care should be taken to set the value of `dir` appropriately if the language direction is not `ltr`. Other values supported are `rtl` (right-to-left), `ttb` (top-to-bottom), and `btt` (bottom-to-top).
          enum:
            - ltr
            - rtl
            - ttb
            - btt
          default: ltr
    format:
      type: object
      anyOf:
        - required:
            - name
        - required:
            - mediaType
      properties:
        name:
          type: string
        mediaType:
          type: string
    roles:
      description: The list of duties, job functions or permissions assigned by the system and associated with the context of this member.
      type: array
      minItems: 1
      items:
        type: string
    contact:
      type: object
      description: |-
        Identification of, and means of communication with, person responsible
        for the resource.
      anyOf:
        - required:
            - name
        - required:
            - organization
      properties:
        identifier:
          type: string
          description: A value uniquely identifying a contact.
        name:
          type: string
          description: The name of the responsible person.
        position:
          type: string
          description: The name of the role or position of the responsible person taken from the organization's formal organizational hierarchy or chart.
        organization:
          type: string
          description: Organization/affiliation of the contact.
        logo:
          description: Graphic identifying a contact. The link relation should be `icon` and the media type should be an image media type.
          allOf:
            - $ref: '#/components/schemas/link'
            - type: object
              required:
                - rel
                - type
              properties:
                rel:
                  enum:
                    - icon
        phones:
          type: array
          description: |-
            Telephone numbers at which contact can be made.  The type of
            phone number is indicated using the roles property.
          items:
            type: object
            required:
              - value
            properties:
              value:
                type: string
                description: The value is the phone number itself.
                pattern: ^\+[1-9]{1}[0-9]{3,14}$
              roles:
                $ref: '#/components/schemas/roles'
        emails:
          type: array
          description: |-
            Email addresses at which contact can be made.  The type of 
            email address is indicated using the roles property.
          items:
            type: object
            required:
              - value
            properties:
              value:
                type: string
                description: The value is the email number itself.
                format: email
              roles:
                $ref: '#/components/schemas/roles'
        addresses:
          type: array
          description: |-
            Physical location at which contact can be made.  The type of
            address is indicated using the roles property.
          items:
            type: object
            properties:
              deliveryPoint:
                type: array
                description: Address lines for the location.
                items:
                  type: string
              city:
                type: string
                description: City for the location.
              administrativeArea:
                type: string
                description: State or province of the location.
              postalCode:
                type: string
                description: ZIP or other postal code.
              country:
                type: string
                description: Country of the physical address.  ISO 3166-1 is recommended.
              roles:
                $ref: '#/components/schemas/roles'
        links:
          type: array
          description: On-line information about the contact.
          items:
            allOf:
              - $ref: '#/components/schemas/link'
              - type: object
                required:
                  - type
        hoursOfService:
          type: string
          description: Time period when the contact can be contacted.
        contactInstructions:
          type: string
          description: |-
            Supplemental instructions on how or when to contact the
            responsible party. The roles property is used to associate
            a set of named duties, job functions and/or permissions
            associated with this contact. (e.g. developer,
            administrator, etc.).
        roles:
          $ref: '#/components/schemas/roles'
    license:
      type: string
      description: A legal document under which the resource is made available. If the resource is being made available under a common license then use an SPDX license id (https://spdx.org/licenses/). If the resource is being made available under multiple common licenses then use an SPDX license expression v2.3 string (https://spdx.github.io/spdx-spec/v2.3/SPDX-license-expressions/) If the resource is being made available under one or more licenses that haven't been assigned an SPDX identifier or one or more custom licenses then use a string value of 'other' and include one or more links (rel="license") in the `link` section of the record to the file(s) that contains the text of the license(s). There is also the case of a resource that is private or unpublished and is thus unlicensed; in this case do not register such a resource in the catalog in the first place since there is no point in making such a resource discoverable.
    recordCommonProperties:
      type: object
      properties:
        created:
          type: string
          description: The date this record was created in the server.
          format: date-time
        updated:
          type: string
          description: The most recent date on which the record was changed.
          format: date-time
        type:
          type: string
          description: The nature or genre of the resource. The value should be a code, convenient for filtering records. Where available, a link to the canonical URI of the record type resource will be added to the 'links' property.
        title:
          type: string
          description: A human-readable name given to the resource.
        description:
          type: string
          description: A free-text account of the resource.
        keywords:
          type: array
          description: The topic or topics of the resource. Typically represented using free-form keywords, tags, key phrases, or classification codes.
          items:
            type: string
        themes:
          type: array
          description: A knowledge organization system used to classify the resource.
          minItems: 1
          items:
            $ref: '#/components/schemas/theme'
        language:
          description: The language used for textual values in this record representation.
          $ref: '#/components/schemas/language'
        languages:
          type: array
          description: This list of languages in which this record is available.
          items:
            $ref: '#/components/schemas/language'
        resourceLanguages:
          type: array
          description: The list of languages in which the resource described by this record is available.
          items:
            $ref: '#/components/schemas/language'
        externalIds:
          type: array
          description: An identifier for the resource assigned by an external (to the catalog) entity.
          items:
            type: object
            properties:
              scheme:
                type: string
                description: A reference to an authority or identifier for a knowledge organization system from which the external identifier was obtained. It is recommended that the identifier be a resolvable URI.
              value:
                type: string
                description: The value of the identifier.
            required:
              - value
        formats:
          type: array
          description: A list of available distributions of the resource.
          items:
            $ref: '#/components/schemas/format'
        contacts:
          type: array
          description: A list of contacts qualified by their role(s) in association to the record or the resource described by the record.
          items:
            $ref: '#/components/schemas/contact'
        license:
          $ref: '#/components/schemas/license'
        rights:
          type: string
          description: A statement that concerns all rights not addressed by the license such as a copyright statement.
    time:
      type: object
      nullable: true
      properties:
        date:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        timestamp:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$
        interval:
          type: array
          minItems: 2
          maxItems: 2
          items:
            oneOf:
              - type: string
                pattern: ^\d{4}-\d{2}-\d{2}$
              - type: string
                pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$
              - type: string
                enum:
                  - ..
        resolution:
          type: string
          description: Minimum time period resolvable in the dataset, as an ISO 8601 duration.
    pointGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - Point
        coordinates:
          type: array
          minItems: 2
          items:
            type: number
    multipointGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - MultiPoint
        coordinates:
          type: array
          items:
            type: array
            minItems: 2
            items:
              type: number
    linestringGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - LineString
        coordinates:
          type: array
          minItems: 2
          items:
            type: array
            minItems: 2
            items:
              type: number
    multilinestringGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - MultiLineString
        coordinates:
          type: array
          items:
            type: array
            minItems: 2
            items:
              type: array
              minItems: 2
              items:
                type: number
    polygonGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - Polygon
        coordinates:
          type: array
          items:
            type: array
            minItems: 4
            items:
              type: array
              minItems: 2
              items:
                type: number
    multipolygonGeoJSON:
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - MultiPoint
        coordinates:
          type: array
          items:
            type: array
            minItems: 2
            items:
              type: number
    geometryGeoJSON:
      oneOf:
        - $ref: '#/components/schemas/pointGeoJSON'
        - $ref: '#/components/schemas/multipointGeoJSON'
        - $ref: '#/components/schemas/linestringGeoJSON'
        - $ref: '#/components/schemas/multilinestringGeoJSON'
        - $ref: '#/components/schemas/polygonGeoJSON'
        - $ref: '#/components/schemas/multipolygonGeoJSON'
        - $ref: '#/components/schemas/geometrycollectionGeoJSON'
    geometrycollectionGeoJSON:
      type: object
      required:
        - type
        - geometries
      properties:
        type:
          type: string
          enum:
            - GeometryCollection
        geometries:
          type: array
          items:
            $ref: '#/components/schemas/geometryGeoJSON'
    recordGeoJSON:
      type: object
      required:
        - id
        - type
        - geometry
        - properties
      properties:
        id:
          type: string
          description: A unique identifier of the catalog record.
        type:
          type: string
          enum:
            - Feature
        time:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/time'
        geometry:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/geometryGeoJSON'
        conformsTo:
          type: array
          description: The extensions/conformance classes used in this record.
          items:
            type: string
        properties:
          allOf:
            - $ref: '#/components/schemas/recordCommonProperties'
            - type: object
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        linkTemplates:
          type: array
          items:
            $ref: '#/components/schemas/linkTemplate'
    scheme:
      type: object
      required:
        - scheme-id
        - namespace
      properties:
        scheme-id:
          type: string
          description: An identifier for this namespace.  The identifier can be used as a short-form for the namespace.
        namespace:
          type: string
          description: A declarative region that provides a scope to the identifiers inside it. It is recommended that the value of namespace be a URI.
        resolver:
          description: An extensible description of a mechanism that resolves a scheme identifier (scheme-id) to its namespace.
          type: object
    catalog:
      allOf:
        - $ref: '#/components/schemas/collection'
        - $ref: '#/components/schemas/recordCommonProperties'
        - type: object
          required:
            - type
          properties:
            itemType:
              description: If this catalog is a homogenous collection of records then itemType is a string of fixed value of record. If this catalog is a homogenous collection of other catalogs then itemType is a string of fixed value of catalog. If this catalog is a heterogenous collection of records and catalogs then itemType is a array indicated that item types of the members of this collections (i.e. record and/or catalog).
              oneOf:
                - type: string
                  enum:
                    - record
                    - catalog
                - type: array
                  items:
                    type: string
                    enum:
                      - record
                      - catalog
            type:
              description: Fixed to Collection for collections of records and/or subordinate catalogs.
              type: string
              enum:
                - Collection
            conformsTo:
              type: array
              description: The extensions/conformance classes used in this record.
              items:
                type: string
            recordsArrayName:
              type: string
              default: records
            records:
              type: array
              description: An array of records that are part of this catalog that are encoded in-line with the catalog.
              items:
                $ref: '#/components/schemas/recordGeoJSON'
            links:
              type: array
              items:
                $ref: '#/components/schemas/link'
            linkTemplates:
              type: array
              items:
                $ref: '#/components/schemas/linkTemplate'
            schemes:
              type: array
              description: A list of schemes used in this context.
              items:
                $ref: '#/components/schemas/scheme'
    featureGeoJSON:
      type: object
      required:
        - type
        - geometry
        - properties
      properties:
        type:
          type: string
          enum:
            - Feature
        geometry:
          $ref: '#/components/schemas/geometryGeoJSON'
        properties:
          type: object
          nullable: true
        id:
          oneOf:
            - type: string
            - type: integer
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        linkTemplates:
          type: array
          items:
            $ref: '#/components/schemas/linkTemplate'
    featureCollectionGeoJSON:
      type: object
      required:
        - type
        - features
      properties:
        type:
          type: string
          enum:
            - FeatureCollection
        features:
          type: array
          items:
            $ref: '#/components/schemas/featureGeoJSON'
        links:
          type: array
          items:
            $ref: '#/components/schemas/link'
        linkTemplates:
          type: array
          items:
            $ref: '#/components/schemas/linkTemplate'
        timeStamp:
          type: string
          format: date-time
        numberMatched:
          type: integer
          minimum: 0
        numberReturned:
          type: integer
          minimum: 0
  responses:
    LandingPage:
      description: The landing page provides links to the API definition (link relations `service-desc` and `service-doc`), the Conformance declaration (path `/conformance`, link relation `conformance`), and the Record Collections (path `/collections`, link relation `data`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/landingPage'
        text/html:
          schema:
            type: string
    NotAcceptable:
      description: Content negotiation failed. For example, the `Accept` header submitted in the request did not support any of the media types supported by the server for the requested resource.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/exception'
        text/html:
          schema:
            type: string
    BadRequest:
      description: A server error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/exception'
        text/html:
          schema:
            type: string
    ServerError:
      description: A server error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/exception'
        text/html:
          schema:
            type: string
    ConformanceDeclaration:
      description: The URIs of all conformance classes supported by the server. To support "generic" clients that want to access multiple OGC API implementations, and not "just" a specific API / server, the server declares the conformance classes it implements and conforms to.
      content:
        application/json:
          schema:
            type: object
            required:
              - conformsTo
            properties:
              conformsTo:
                type: array
                items:
                  type: string
        text/html:
          schema:
            type: string
    Catalogs:
      description: Information about the list of catalogs offered by this service.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/collections'
              - type: object
                properties:
                  collections:
                    type: array
                    items:
                      $ref: '#/components/schemas/catalog'
                  linkTemplates:
                    type: array
                    items:
                      $ref: '#/components/schemas/linkTemplate'
        text/html:
          schema:
            type: string
    Catalog:
      description: |-
        Information about the record collection with id `collectionId`.
        The response contains a link to the items in the collection
        (path `/collections/{collectionId}/items`, link relation `items`)
        as well as key information about the collection. This information
        includes:
        * A local identifier for the collection that is unique for the +
          catalog;
        * A list of coordinate reference systems (CRS) in which geometries +
          may be returned by the server. The first CRS is the default +
          coordinate reference system (the default is always WGS 84 with +
          axis order longitude/latitude);
        * An optional title and description for the collection;
        * An optional extent that can be used to provide an indication of +
          the spatial and temporal extent of the collection - typically +
          derived from the data;
        * An optional indicator about the type of the items in the collection +
          (the default value, if the indicator is not provided, is 'record').
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/catalog'
        text/html:
          schema:
            type: string
    NotFound:
      description: The requested resource does not exist on the server. For example, a path parameter had an incorrect value.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/exception'
        text/html:
          schema:
            type: string
    Sortables:
      description: A list of properties that may be specified for sorting the response.
      content:
        application/json:
          schema:
            type: object
        text/html:
          schema:
            type: string
    Records:
      description: |-
        The response is a document consisting of records in the collection. The records included in the response are determined by the server based on the query parameters of the request. To support access to larger collections without overloading the client, the API supports paged access with links to the next page, if more records are selected that the page size.
        The `bbox` and `datetime` parameter can be used to select only a subset of the records in the collection (the records that are in the bounding box or time interval). The `bbox` parameter matches all records in the collection that are not associated with a location, too. The `datetime` parameter matches all records in the collection that are not associated with a time stamp or interval, too.
        The `limit` parameter may be used to control the subset of the selected records that should be returned in the response, the page size. Each page may include information about the number of selected and returned records (`numberMatched` and `numberReturned`) as well as links to support paging (link relation `next`).
      content:
        application/geo+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/featureCollectionGeoJSON'
              - type: object
                properties:
                  features:
                    type: array
                    items:
                      $ref: '#/components/schemas/recordGeoJSON'
                  linkTemplates:
                    type: array
                    items:
                      $ref: '#/components/schemas/linkTemplate'
        text/html:
          schema:
            type: string
    Record:
      description: Fetch the record with id `recordId` in the record collection with id `collectionId`
      content:
        application/geo+json:
          schema:
            $ref: '#/components/schemas/recordGeoJSON'
        text/html:
          schema:
            type: string
  parameters:
    catalogId:
      name: catalogId
      in: path
      required: true
      schema:
        type: string
    bbox:
      name: bbox
      in: query
      required: false
      schema:
        oneOf:
          - type: array
            minItems: 4
            maxItems: 4
            items:
              type: number
          - type: array
            minItems: 6
            maxItems: 6
            items:
              type: number
      style: form
      explode: false
    datetime:
      name: datetime
      in: query
      required: false
      schema:
        type: string
      style: form
      explode: false
    limit:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 10000
        default: 10
      explode: false
      style: form
    q:
      name: q
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
      explode: false
      style: form
    type:
      name: type
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
      explode: false
      style: form
    externalId:
      name: externalId
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
      explode: false
      style: form
    ids:
      name: ids
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
      explode: false
      style: form
    sortby:
      name: sortby
      in: query
      required: false
      schema:
        type: array
        minItems: 1
        items:
          type: string
          pattern: '[+|-]?[A-Za-z_].*'
      explode: false
      style: form
    recordId:
      name: recordId
      in: path
      required: true
      schema:
        type: string
