Airthings Locations API
The Locations API from Airthings — 4 operation(s) for locations.
The Locations API from Airthings — 4 operation(s) for locations.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/airthings:airthings-locations-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: 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