Propeller Shapes & Widgets API

List and retrieve the user-defined shapes (polygons, lines, and points) drawn in a workspace, and calculate a widget against a shape to return measured results such as volumes, cut/fill, distances, and areas tied to a chosen survey.

OpenAPI Specification

propeller-aero-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Propeller Public API
  description: >-
    The Propeller Public API provides programmatic, read-oriented access to
    Propeller Aero drone-survey and earthworks-analytics data for construction,
    mining, aggregates, and waste sites. It exposes organizations, sites (survey
    projects), workspaces, surveys, downloadable processed survey files
    (orthophotos, digital terrain models, and point clouds), user-defined shapes
    and the widgets calculated against them (volumes, cut/fill, distances,
    areas), and DirtMate position-monitoring configurations and epochs. The API
    is a paid, premium feature available on higher Propeller plans (such as
    Scale).

    Requests are made over HTTPS to https://api.propelleraero.com/v1 and are
    authenticated with a Bearer access token (generated under Settings > Public
    API in the Propeller portal) or via an OpenID Connect authorization_code
    flow (discovery at
    https://api.propelleraero.com/auth/oidc/.well-known/openid-configuration).

    Endpoint paths and HTTP methods in this document are taken from Propeller's
    public API reference and llms.txt index. Request and response SCHEMAS are
    modeled from the public documentation for cataloging purposes and are not an
    exhaustive or byte-exact contract - see x-endpointsModeled - so validate
    payloads against the live Propeller reference before integrating.
  version: '1.0'
  contact:
    name: Propeller Aero
    url: https://www.propelleraero.com/
  x-endpointsModeled: true
  x-endpointsModeledNote: >-
    Paths and methods are confirmed from Propeller's public API reference /
    llms.txt. Response schemas are illustrative models of the documented
    resources, not verified field-by-field against live payloads.
servers:
  - url: https://api.propelleraero.com/v1
    description: Propeller Public API
security:
  - bearerAuth: []
  - oidc: []
tags:
  - name: Organizations
    description: Top-level accounts that own sites, workspaces, and surveys.
  - name: Sites
    description: Survey projects (job sites) within an organization.
  - name: Surveys
    description: Individual drone survey captures and their downloadable files.
  - name: Workspaces
    description: Analysis contexts within a site that hold shapes and widgets.
  - name: Shapes
    description: User-defined polygons, lines, and points drawn in a workspace.
  - name: Widgets
    description: Calculated measurements (volumes, distances, areas) tied to a shape.
  - name: Position Monitoring
    description: DirtMate position-monitoring configs and recorded epochs.
paths:
  /organizations:
    get:
      operationId: listOrganizations
      tags:
        - Organizations
      summary: List organizations
      description: Lists the organizations the authenticated user can access.
      responses:
        '200':
          description: A list of organizations.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Organization'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /organizations/{organization_id}:
    get:
      operationId: getOrganization
      tags:
        - Organizations
      summary: Get an organization
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      responses:
        '200':
          description: An organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Organization'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites:
    get:
      operationId: listSites
      tags:
        - Sites
      summary: List sites
      description: Lists the sites (survey projects) within an organization.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      responses:
        '200':
          description: A list of sites.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Site'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /organizations/{organization_id}/sites/{site_id}:
    get:
      operationId: getSite
      tags:
        - Sites
      summary: Get a site
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
      responses:
        '200':
          description: A site.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Site'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/sample_elevation:
    get:
      operationId: sampleSiteElevation
      tags:
        - Sites
      summary: Sample site elevation
      description: >-
        Returns the ground elevation at a coordinate on the site's current
        surface model.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - name: lat
          in: query
          required: true
          schema:
            type: number
            format: double
        - name: lng
          in: query
          required: true
          schema:
            type: number
            format: double
      responses:
        '200':
          description: An elevation sample.
          content:
            application/json:
              schema:
                type: object
                properties:
                  lat:
                    type: number
                    format: double
                  lng:
                    type: number
                    format: double
                  elevation:
                    type: number
                    format: double
                  unit:
                    type: string
                    example: meters
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/surveys:
    get:
      operationId: listSurveys
      tags:
        - Surveys
      summary: List surveys
      description: Lists the surveys captured for a site.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
      responses:
        '200':
          description: A list of surveys.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Survey'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /organizations/{organization_id}/sites/{site_id}/surveys/{survey_id}:
    get:
      operationId: getSurvey
      tags:
        - Surveys
      summary: Get a survey
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/SurveyId'
      responses:
        '200':
          description: A survey.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Survey'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/surveys/{survey_id}/files:
    get:
      operationId: listSurveyFiles
      tags:
        - Surveys
      summary: List survey files
      description: >-
        Lists the processed files available for download for a survey -
        orthophotos, digital terrain models, and point cloud data - each with a
        time-limited download URL.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/SurveyId'
      responses:
        '200':
          description: A list of downloadable survey files.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SurveyFile'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/workspaces:
    get:
      operationId: listWorkspaces
      tags:
        - Workspaces
      summary: List workspaces
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
      responses:
        '200':
          description: A list of workspaces.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Workspace'
  /organizations/{organization_id}/sites/{site_id}/workspaces/{workspace_id}:
    get:
      operationId: getWorkspace
      tags:
        - Workspaces
      summary: Get a workspace
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/WorkspaceId'
      responses:
        '200':
          description: A workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workspace'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/workspaces/{workspace_id}/shapes:
    get:
      operationId: listShapes
      tags:
        - Shapes
      summary: List shapes
      description: Lists the user-defined shapes (polygons, lines, points) in a workspace.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/WorkspaceId'
      responses:
        '200':
          description: A list of shapes.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Shape'
  /organizations/{organization_id}/sites/{site_id}/workspaces/{workspace_id}/shapes/{shape_id}:
    get:
      operationId: getShape
      tags:
        - Shapes
      summary: Get a shape
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/WorkspaceId'
        - $ref: '#/components/parameters/ShapeId'
      responses:
        '200':
          description: A shape and its associated data.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shape'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organization_id}/sites/{site_id}/workspaces/{workspace_id}/shapes/{shape_id}/widgets/{widget_id}/calculate:
    post:
      operationId: calculateWidget
      tags:
        - Widgets
      summary: Calculate a widget
      description: >-
        Calculates a widget against a shape and returns measured results such as
        volumes (cut/fill), distances, or areas, optionally scoped to a chosen
        survey.
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/SiteId'
        - $ref: '#/components/parameters/WorkspaceId'
        - $ref: '#/components/parameters/ShapeId'
        - name: widget_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                survey_id:
                  type: string
                  description: Survey to calculate the widget against.
                base_survey_id:
                  type: string
                  description: Optional base survey for cut/fill volume comparisons.
      responses:
        '200':
          description: The calculated widget result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WidgetResult'
        '404':
          $ref: '#/components/responses/NotFound'
  /position_monitoring_configs:
    get:
      operationId: listPositionMonitoringConfigs
      tags:
        - Position Monitoring
      summary: List position monitoring configs
      description: Lists DirtMate devices configured as position monitors.
      responses:
        '200':
          description: A list of position monitoring configs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/PositionMonitoringConfig'
  /position_monitoring_configs/{id}:
    get:
      operationId: getPositionMonitoringConfig
      tags:
        - Position Monitoring
      summary: Get a position monitoring config
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: A position monitoring config.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PositionMonitoringConfig'
        '404':
          $ref: '#/components/responses/NotFound'
  /position_monitoring_epochs:
    get:
      operationId: listPositionMonitoringEpochs
      tags:
        - Position Monitoring
      summary: List position monitoring epochs
      description: >-
        Lists the position measurements (epochs) recorded by position-monitoring
        DirtMates.
      parameters:
        - name: position_monitoring_config_id
          in: query
          required: false
          schema:
            type: string
          description: Filter epochs to a single monitoring config / DirtMate.
      responses:
        '200':
          description: A list of position monitoring epochs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/PositionMonitoringEpoch'
  /position_monitoring_epochs/{id}:
    get:
      operationId: getPositionMonitoringEpoch
      tags:
        - Position Monitoring
      summary: Get a position monitoring epoch
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: A position monitoring epoch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PositionMonitoringEpoch'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Access token generated under Settings > Public API in the Propeller
        portal, sent as Authorization: Bearer <access_token>.
    oidc:
      type: openIdConnect
      openIdConnectUrl: https://api.propelleraero.com/auth/oidc/.well-known/openid-configuration
  parameters:
    OrganizationId:
      name: organization_id
      in: path
      required: true
      schema:
        type: string
    SiteId:
      name: site_id
      in: path
      required: true
      schema:
        type: string
    SurveyId:
      name: survey_id
      in: path
      required: true
      schema:
        type: string
    WorkspaceId:
      name: workspace_id
      in: path
      required: true
      schema:
        type: string
    ShapeId:
      name: shape_id
      in: path
      required: true
      schema:
        type: string
  responses:
    Unauthorized:
      description: Missing or invalid access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Organization:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    Site:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        timezone:
          type: string
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
    Survey:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        surveyDate:
          type: string
          format: date
        status:
          type: string
          example: processed
    SurveyFile:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
          description: The output type of the file.
          enum:
            - orthophoto
            - terrain
            - point_cloud
        format:
          type: string
          example: geotiff
        url:
          type: string
          format: uri
          description: Time-limited download URL for the processed file.
    Workspace:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    Shape:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        type:
          type: string
          enum:
            - polygon
            - line
            - point
        geometry:
          type: object
          description: GeoJSON-style geometry for the shape.
    WidgetResult:
      type: object
      properties:
        widgetId:
          type: string
        type:
          type: string
          example: volume
        value:
          type: number
          format: double
        unit:
          type: string
          example: cubic_meters
        surveyId:
          type: string
    PositionMonitoringConfig:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        deviceId:
          type: string
          description: Identifier of the DirtMate device configured as a position monitor.
        siteId:
          type: string
    PositionMonitoringEpoch:
      type: object
      properties:
        id:
          type: string
        positionMonitoringConfigId:
          type: string
        recordedAt:
          type: string
          format: date-time
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        elevation:
          type: number
          format: double
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string