Airthings Locations API

The Locations API from Airthings — 4 operation(s) for locations.

Operations 5

GET /v1/locations Location list #
POST /v1/locations Add location #
GET /v1/locations/{locationId} Location info #
POST /v1/locations/{locationId}/devices Add a device to a location #
GET /v1/locations/{locationId}/latest-samples Location latest samples #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/airthings:airthings-locations-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

airthings-locations-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Airthings Locations API
  version: v1
  contact:
    name: Airthings Support
    email: support@airthings.com
servers:
- url: https://ext-api.airthings.com
security:
- AirthingsAccounts: []
tags:
- name: Locations
paths:
  /v1/locations:
    parameters: []
    get:
      tags:
      - Locations
      summary: Location list
      description: Get all locations
      parameters:
      - name: organizationId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: userGroupId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: accountId
        in: query
        schema:
          type: string
          format: uuid
        required: false
        deprecated: false
      responses:
        '200':
          description: List of locations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetLocationsResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: false
      security:
      - AirthingsAccounts:
        - read:device
        - write:device
      operationId: getV1Locations
      x-operation-id-source: derived
    post:
      tags:
      - Locations
      summary: Add location
      description: Add a new location to an organization
      parameters:
      - name: organizationId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: userGroupId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: accountId
        in: query
        schema:
          type: string
          format: uuid
        required: true
        deprecated: false
      requestBody:
        description: AddLocationRequest
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddLocationRequest-enriched'
        required: true
      responses:
        '200':
          description: The new location ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddLocationResponse'
        '403':
          description: User does not have the correct role or is not a member of organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: A location with the same name or latitude and longitude already exist in this organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: false
      security:
      - AirthingsAccounts:
        - read:device
        - write:device
      operationId: postV1Locations
      x-operation-id-source: derived
  /v1/locations/{locationId}:
    parameters: []
    get:
      tags:
      - Locations
      summary: Location info
      description: Get info about a specific location
      parameters:
      - name: organizationId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: userGroupId
        in: query
        schema:
          type: string
          format: uuid
        description: Use `accountId`
        required: false
        deprecated: true
      - name: accountId
        in: query
        schema:
          type: string
          format: uuid
        required: false
        deprecated: false
      - name: locationId
        in: path
        schema:
          type: string
          format: uuid
        required: true
        deprecated: false
      responses:
        '200':
          description: Location info
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetLocationResponse-enriched'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: false
      security:
      - AirthingsAccounts:
        - read:device
      operationId: getV1LocationsByLocationId
      x-operation-id-source: derived
  /v1/locations/{locationId}/devices:
    parameters:
    - name: organizationId
      in: query
      schema:
        type: string
        format: uuid
      description: Use `accountId`
      required: false
      deprecated: true
    - name: userGroupId
      in: query
      schema:
        type: string
        format: uuid
      description: Use `accountId`
      required: false
      deprecated: true
    - name: accountId
      in: query
      schema:
        type: string
        format: uuid
      required: true
      deprecated: false
    - name: locationId
      in: path
      schema:
        type: string
        format: uuid
      required: true
      deprecated: false
    post:
      tags:
      - Locations
      summary: Add a device to a location
      description: 'Add a new device to a location. The `serialNumber` and `id` can be found on the back of the device.

        Note that the `id` in this context is not the `serialNumber`, as it can be when requesting resources

        in other Airthings APIs. To use this endpoint, make sure your API client has the `write:device` scope

        enabled in the dashboard and that the `write:device` scope is added to your access token

        when requesting a token from the token endpoint.'
      parameters: []
      requestBody:
        description: AddDeviceRequest
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddDeviceRequest-enriched'
        required: true
      responses:
        '200':
          description: Properties of the added device
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddDeviceToLocationResponse'
        '400':
          description: The id(checkcode) provided for device was invalid or missing account selector params(`organizationId` or `userGroupId`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: The device is already paired
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: false
      security:
      - AirthingsAccounts:
        - write:device
      operationId: postV1LocationsByLocationIdDevices
      x-operation-id-source: derived
  /v1/locations/{locationId}/latest-samples:
    parameters:
    - name: organizationId
      in: query
      schema:
        type: string
        format: uuid
      description: Use `accountId`
      required: false
      deprecated: true
    - name: userGroupId
      in: query
      schema:
        type: string
        format: uuid
      description: Use `accountId`
      required: false
      deprecated: true
    - name: accountId
      in: query
      schema:
        type: string
        format: uuid
      required: false
      deprecated: false
    - name: locationId
      in: path
      schema:
        type: string
        format: uuid
      required: true
      deprecated: false
    - name: measurementSystem
      in: query
      schema:
        type: string
        enum:
        - US
        - METRIC
        description: Measurement unit preference. Defaults to `METRIC`
      required: false
      deprecated: false
    - name: radonUnit
      in: query
      schema:
        type: string
        enum:
        - pci
        - bq
      required: false
      deprecated: false
    - name: tempUnit
      in: query
      schema:
        type: string
        enum:
        - c
        - f
      required: false
      deprecated: false
    - name: pressureUnit
      in: query
      schema:
        type: string
        enum:
        - hpa
        - inhg
      required: false
      deprecated: false
    - name: vocUnit
      in: query
      schema:
        type: string
        enum:
        - ppb
        - mgpc
      required: false
      deprecated: false
    get:
      tags:
      - Locations
      summary: Location latest samples
      description: Get latest samples belonging to devices in a specific location (latest segment)
      parameters: []
      responses:
        '200':
          description: Location samples
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetLocationSamplesResponse-enriched'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: false
      security:
      - AirthingsAccounts:
        - read:device
      operationId: getV1LocationsByLocationIdLatestSamples
      x-operation-id-source: derived
components:
  schemas:
    DeviceType:
      type: string
      enum:
      - WAVE
      - WAVE_GEN2
      - WAVE_MINI
      - WAVE_PLUS
      - WAVE_CO2
      - VIEW_PLUS
      - VIEW_PLUS_BUSINESS
      - VIEW_POLLUTION
      - VIEW_RADON
      - VIEW_CO2
      - SPACE_CO2_MINI
      - SPACE_RADON
      - WAVE_NANO
      - WAVE_ENHANCE
      - HUB
      - HOME
      - HOME_COLIBRI
      - PRO
      - BREEZOMETER_WEATHER
      - BACNET
      - AP_1
      - RAVEN_RADON
      - UNKNOWN
    BuildingType:
      type: string
      enum:
      - SCHOOL
      - RESIDENTIAL
      - APARTMENT
      - KINDERGARTEN
      - HEALTHCENTER
      - OFFICE
      - OTHER
    AddDeviceRequest-enriched:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        serialNumber:
          type: string
          maxLength: 10
          minLength: 10
      required:
      - id
      - name
      - serialNumber
    Code:
      type: string
      enum:
      - invalid_request
      - invalid_request_clients_limit_exceeded
      - access_denied
      - valid_subscription_required
      - device_not_supported
      - invalid_parameter
      - not_found
      - internal_server_error
      - unable_to_register_device
      - location_not_found
      - no_access_to_resource
      - missing_location_properties_for_report
      - radio_region_is_not_supported
      - max_number_of_devices_reached
      - unable_to_create_location
      - unable_to_update_space
    GetLocationsResponse:
      type: object
      properties:
        locations:
          items:
            $ref: '#/components/schemas/LocationResponse'
          type: array
      required:
      - locations
    AddDeviceToLocationResponse:
      type: object
      properties:
        locationId:
          type: string
          format: uuid
        name:
          type: string
        serialNumber:
          type: string
          maxLength: 10
          minLength: 10
      required:
      - locationId
      - name
      - serialNumber
    GetLocationSamplesResponse-enriched:
      type: object
      properties:
        devices:
          items:
            $ref: '#/components/schemas/DeviceSampleResponse-enriched'
          description: list of devices in the location
          type: array
        id:
          type: string
          format: uuid
        name:
          type: string
      required:
      - devices
      - id
      - name
    AddLocationRequest-enriched:
      type: object
      properties:
        address:
          oneOf:
          - type: 'null'
          - type: string
        buildingHeight:
          oneOf:
          - type: 'null'
          - type: number
            format: float
          description: In meter(m)
        buildingSize:
          oneOf:
          - type: 'null'
          - type: number
            format: float
          description: In square meter(m²)
        buildingType:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/BuildingType'
        buildingVolume:
          oneOf:
          - type: 'null'
          - type: number
            format: float
          description: In cubic meter(m³)
        buildingYear:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        floors:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        lat:
          type: number
          format: double
          maximum: 90
          minimum: -90
        lng:
          type: number
          format: double
          maximum: 180
          minimum: -180
        name:
          type: string
        timezone:
          oneOf:
          - type: 'null'
          - type: string
          description: Timezone identifier
        usageHours:
          $ref: '#/components/schemas/Map-Day-LocationUsage'
        ventilationType:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/VentilationType'
      required:
      - lat
      - lng
      - name
    GetLocationResponse-enriched:
      type: object
      properties:
        address:
          oneOf:
          - type: 'null'
          - type: string
        buildingHeight:
          oneOf:
          - type: 'null'
          - type: number
            format: float
        buildingSize:
          oneOf:
          - type: 'null'
          - type: number
            format: float
        buildingType:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/BuildingType'
        buildingVolume:
          oneOf:
          - type: 'null'
          - type: number
            format: float
        buildingYear:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        countryCode:
          oneOf:
          - type: 'null'
          - type: string
        devices:
          items:
            $ref: '#/components/schemas/DeviceSimpleResponse-enriched'
          description: list of devices in the location
          type: array
        floors:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        id:
          type: string
          format: uuid
        labels:
          additionalProperties:
            type: string
          type: object
        lat:
          type: number
          format: float
        lng:
          type: number
          format: float
        name:
          type: string
        timezone:
          oneOf:
          - type: 'null'
          - type: string
        usageHours:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/Map-Day-LocationUsage'
        ventilationType:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/VentilationType'
      required:
      - devices
      - id
      - labels
      - lat
      - lng
      - name
    LocationResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
        labels:
          additionalProperties:
            type: string
          type: object
        name:
          type: string
      required:
      - id
      - labels
      - name
    ErrorResponse:
      type: object
      properties:
        error:
          $ref: '#/components/schemas/Code'
        error_code:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        error_description:
          type: string
      required:
      - error
      - error_description
    VentilationType:
      type: string
      enum:
      - NATURAL
      - MECHANICAL
      - BALANCED
    DeviceSampleResponse-enriched:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/LatestSampleData-enriched'
          description: latest sample data for the device
        id:
          type: string
          maxLength: 10
          minLength: 10
        segment:
          $ref: '#/components/schemas/SegmentSimpleResponse-enriched'
          description: segment of the device with samples
      required:
      - data
      - id
      - segment
    Map-Day-LocationUsage:
      type: object
      format: UsageHours
      properties:
        monday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        tuesday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        wednesday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        thursday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        friday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        saturday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
        sunday:
          type: object
          format: LocationUsage
          properties:
            from:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            to:
              oneOf:
              - type: 'null'
              - type: string
                format: time
            closed:
              type: boolean
    AddLocationResponse:
      type: object
      properties:
        locationId:
          type: string
          format: uuid
      required:
      - locationId
    DeviceSimpleResponse-enriched:
      type: object
      properties:
        deviceType:
          $ref: '#/components/schemas/DeviceType'
        id:
          type: string
          maxLength: 10
          minLength: 10
        productName:
          type: string
        segment:
          $ref: '#/components/schemas/SegmentSimpleResponse-enriched'
          description: segment of the device
      required:
      - deviceType
      - id
      - productName
      - segment
    LatestSampleData-enriched:
      type: object
      properties:
        airExchangeRate:
          oneOf:
          - type: 'null'
          - type: number
            format: double
          description: air changes per hour (ACH)
        airflow:
          oneOf:
          - type: 'null'
          - type: number
            format: double
          description: cubic meters per hour (m³/h) by default and gets converted to cubic feet per minute (CFM) if the user has set the unit preference to imperial
        battery:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        co2:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        controlSignal:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        hourlyRadon:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        humidity:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        light:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        lux:
          oneOf:
          - type: 'null'
          - type: number
            format: float
        mold:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        occupants:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        occupantsLower:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        occupantsUpper:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        pm1:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        pm10:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        pm25:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        pressure:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        radonShortTermAvg:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        relayDeviceType:
          oneOf:
          - type: 'null'
          - type: string
        rssi:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
        sla:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        temp:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        time:
          oneOf:
          - type: 'null'
          - type: number
            format: int32
          description: timestamp of samples sent by the device
        virusRisk:
          oneOf:
          - type: 'null'
          - type: number
            format: double
        voc:
          oneOf:
          - type: 'null'
          - type: number
            format: double
      required: []
    SegmentSimpleResponse-enriched:
      type: object
      properties:
        active:
          type: boolean
        id:
          type: string
          format: uuid
        name:
          type: string
        spaceId:
          oneOf:
          - type: 'null'
          - type: string
            format: uuid
            description: Space ID where the device segment is/was located. It is null for old ended non-space segments
        started:
          type: string
          format: date-time
      required:
      - active
      - id
      - name
      - started
  securitySchemes:
    AirthingsAccounts:
      flows:
        authorizationCode:
          authorizationUrl: https://accounts.airthings.com/authorize
          tokenUrl: https://accounts-api.airthings.com/v1/token
          scopes:
            read:device: Allowing a user to read data from devices in their account
            write:device: Allowing a user to manage devices within their account
        clientCredentials:
          tokenUrl: https://accounts-api.airthings.com/v1/token
          scopes:
            read:device: Allowing a user to read data from devices in their account
            write:device: Allowing a user to manage devices within their account
      type: oauth2
x-provenance:
  method: searched
  source: https://developer-business.airthings.com/reference
  harvested: '2026-10-28'
  tool: harvest-readme-openapi.py
  note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored.
  assembled_from:
  - https://developer-business.airthings.com/reference/deletev1webhookshookid.md
  - https://developer-business.airthings.com/reference/getv1accounts.md
  - https://developer-business.airthings.com/reference/getv1devices.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumber.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberbattery.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberhourlyradonsamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberlatestbattery.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberlatestsamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumbermoldsamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberoccupancysamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumbersamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberthresholdbreaches.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumberventilationsamples.md
  - https://developer-business.airthings.com/reference/getv1devicesserialnumbervirusrisksamples.md
  - https://developer-business.airthings.com/reference/getv1locations.md
  - https://developer-business.airthings.com/reference/getv1locationslocationid.md
  - https://developer-business.airthings.com/reference/getv1locationslocationidlatestsamples.md
  - https://developer-business.airthings.com/reference/getv1organizations.md
  - https://developer-business.airthings.com/reference/getv1segments.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentid.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidhourlyradonsamples.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidmoldsamples.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidoccupancysamples.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidsamples.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidventilationsamples.md
  - https://developer-business.airthings.com/reference/getv1segmentssegmentidvirusrisksamples.md
  - https://developer-business.airthings.com/reference/getv1thresholds.md
  - https://developer-business.airthings.com/reference/getv1webhooks.md
  - https://developer-business.airthings.com/reference/patch_v1-spaces.md
  - https://developer-business.airthings.com/reference/patchv1devices.md
  - https://developer-business.airthings.com/reference/patchv1deviceslabels.md
  - https://developer-business.airthings.com/reference/patchv1webhookshookid.md
  - https://developer-business.airthings.com/reference/postv1locations.md
  - https://developer-business.airthings.com/reference/postv1locationslocationiddevices.md
  - https://developer-business.airthings.com/reference/postv1webhooks.md
  merge:
    pages: 35
    deduped: 161
    conflicts_kept_first: 0