System Surveyor API (v3)

Download OpenAPI specification:

How to Use Our REST APIs.

System Surveyor's APIs enable bi-directional communication with it's platform. These APIs provide a software layer connecting and optimizing the network to allow your users to create / edit / retrieve sites & surveys, along with all of the associated data.

The domain name for our API is https://openapi.systemsurveyor.com. This needs to be prefixed to all requests.

In order to utilize these APIs, you must have an Enterprise account, with a valid plan. Your account administrator must create an access_token for you, which is required for each request.

Access Tokens

Get Account Access Tokens

Returns all active (non-revoked) public API access tokens for the account. Each entry includes the decrypted token value, the user whose permissions the token carries, its creator, and its expiration timestamp.

The account must have the Public API feature enabled. Only account admins can retrieve the account's access tokens.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)

Responses

Response samples

Content type
application/json
[
  • { }
]

Create Access Token

Creates a long-lived (one year) public API access token for the account. The token is a JWT that carries the permissions of the user referenced by the required user_id field in the request body; a name for the token is also required.

The account must have the Public API feature enabled. Only account admins can create access tokens.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)

Responses

Response samples

Content type
application/json
{ }

Revoke Access Token

Revokes a public API access token. The token is soft-deleted and immediately blocklisted, so it can no longer be used to make API requests.

The account must have the Public API feature enabled. Only account admins can revoke access tokens.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)
access_token_id
required
string <uuid> (Access Token Id)

Responses

Response samples

Content type
application/json
{ }

Get or Create Prismatic Access Token

Returns the calling user's active Prismatic integration access token for the account, creating a new one carrying the calling user's permissions if none exists. Returns 200 when an existing token is found and 201 when a new one is created.

The account must have the Integration Marketplace feature enabled. Any user who belongs to a team in the account can use this endpoint.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)

Responses

Response samples

Content type
application/json
{ }

Accounts

Get Account Usage

Returns the usage information for an account, aggregated across all of its teams: the number of active members, disabled members, pending invitations, and available subscription seats. A team_id query parameter can be provided to restrict the counts to a single team in the account. This is displayed in the "Manage Teams" page.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)
query Parameters
Team Id (integer) or Team Id (null) (Team Id)

Responses

Response samples

Content type
application/json
{
  • "member_count": 0,
  • "disabled_member_count": 0,
  • "invite_count": 0,
  • "guest_count": 0,
  • "seats_available": 0
}

Contacts

Get Site Contacts

Returns all contacts and guest users for a site.

When a contact has already joined the site as a guest user, the contact data is merged with the user's account data and includes the permission and expiration date granted to the guest. Contacts that have been invited as guest users but have not accepted the invitation yet include their pending invitation's ID, along with the invited permission and expiration date. Guests whose site access has been revoked are still returned as plain contacts.

Requires read access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
[
  • { }
]

Invitations

Invite a Contact as a Guest User

Creates a new invitation for a site contact to join the site as a guest user with a specific access permission (read or write), and sends the invitation email to the contact.

Any existing pending invitations for the contact on the site are cancelled, so only one pending invitation exists at a time. If the contact is already a guest user, or has reached the maximum number of sites they can join as a guest under the account's plan, a 422 is returned.

Only accounts with the guest user feature enabled can invite guests, and only admins or users with site write permission can perform the invitation.

Authorizations:
jwt
path Parameters
contact_id
required
string <uuid> (Contact Id)

External ID of the contact to invite

Request Body schema: application/json
required
permission
required
string
Enum: "read" "write" "no_access"
expires_at
required
string <date-time> (Expires At)

Responses

Request samples

Content type
application/json
{
  • "permission": "read",
  • "expires_at": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "invitation_id": "string"
}

Accept Invitation

Accepts a pending team or guest invitation on behalf of the invitee. This endpoint is unauthenticated but requires a valid reCAPTCHA captcha_token; the invitation must be pending and not expired.

If no user account exists for the invitee's email, first_name, last_name and password are required to create one - without them a 422 with a credentials_required indicator is returned, and the request must be retried with the credentials. If the invitee already has an account (for example from a previous guest invitation), the existing account is used and no credentials are needed.

Accepting a team invitation adds the invitee to the team with the invited role (subject to the subscription's seat limit) and clears any guest flags they held on the team's sites, keeping their existing site permissions. Accepting a guest invitation grants the invitee access to the site with the invited permission and adds the site to their workbench; guest users do not belong to a team.

On success, the response contains JWT login tokens when a new user account was created as part of the acceptance, and is an empty object otherwise.

path Parameters
invitation_id
required
string <uuid> (Invitation Id)
Request Body schema: application/json
required
captcha_token
required
string (Captcha Token)
First Name (string) or First Name (null) (First Name)
Last Name (string) or Last Name (null) (Last Name)
Password (string) or Password (null) (Password)

Responses

Request samples

Content type
application/json
{
  • "captcha_token": "string",
  • "first_name": "string",
  • "last_name": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{ }

Sites

Get Site

Returns all data for a specific site, along with its survey count.

Only users with at least read access on the site, or requests with a valid survey share token for a survey on the site, can access it.

Authorizations:
jwtsurveyShare
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
{ }

Create or Update Site

Creates a site with the given external ID, or updates the existing site with that ID.

On creation the site is added to the creator's workbench and its team is granted write access. Tags in the payload are added to the site (tags that do not yet exist for the team are created); existing tags are never removed by this endpoint. A folder_external_id field can be included in the payload to move the site into that folder, which must belong to the same team as the site.

The user must be a member of the team given in the payload.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
{ }

Delete Site

Soft deletes a site and all of its surveys.

The site disappears from all listings and can no longer be accessed, but the underlying records are retained.

Requires write access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
null

Update Site

Partially updates a site: only the fields present in the payload are changed.

Tags in the payload are added to the site (tags that do not yet exist for the team are created); existing tags are never removed by this endpoint.

Requires write access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
{ }

Share Site

Shares a site with a list of email addresses for a limited amount of time.

Each address in the payload's emails list receives an email with instructions on how to access the site, including an access token. The required expiration_date (UTC epoch seconds) sets when the share stops being viewable, and an optional message is included in the email.

Requires write access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
{ }

Get Site Bill of Materials

Returns the bill of materials data for a site: element quantities aggregated by component model across the site's surveys. Survey elements without a component model value are ignored.

By default the response is a flat array of {component_model, quantity} objects aggregated across all surveys. With group_by_survey=true, quantities are aggregated per survey instead and each array entry holds a survey reference (id, title) and its components.

Requires read access on the site.

Query Parameters:

  • surveys: Optional, repeatable survey external ID to restrict the BOM data to. All IDs must belong to surveys on this site. Defaults to all surveys on the site.
  • installation_status: Optional, repeatable installation status to filter components by.
  • system_type: Optional, repeatable system type to filter components by.
  • group_by_survey: When true, aggregates and groups the bill of materials by survey.
Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
query Parameters
Array of Surveys (strings) or Surveys (null) (Surveys)
Array of Installation Status (strings) or Installation Status (null) (Installation Status)
Array of System Type (strings) or System Type (null) (System Type)
group_by_survey
boolean (Group By Survey)
Default: false

Responses

Response samples

Content type
application/json
[
  • { }
]

Move Site

Moves a site to a different folder or to the root level, within the same team or to a different team.

When team_id differs from the site's current team, the site is transferred to that team, which must belong to the same account; only account admins can move sites across teams. A transfer removes the site from every user's workbench, clears the editor of all surveys on the site, and moves the site's access grants and folders to the destination team.

The site is then placed in the folder given by folder_id, which must belong to the destination team, or at the root level when folder_id is omitted.

Requires write access on the site; moving within the same team requires no additional permission.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
Request Body schema: application/json
required
team_id
required
integer (Team Id)
Folder Id (string) or Folder Id (null) (Folder Id)

Responses

Request samples

Content type
application/json
{
  • "team_id": 0,
  • "folder_id": "string"
}

Response samples

Content type
application/json
{ }

Create Site

Creates a new site in a team.

The site is added to the creator's workbench and the team is granted write access on it. The site can be created inside a folder by passing the folder's external ID as a folder_id field in the payload; the folder must belong to the same team as the site.

The user must be a member of the team the site is created in.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Get User Sites (Legacy List)

Returns the sites the current user has access to across all teams as a plain, flat JSON array without a pagination envelope. Each entry carries the site's data plus its survey_count and, when the site is in the user's workbench, its favorited_ts.

This is a legacy listing: unlike GET /sites it does not group results by folder and returns no meta or links — in fact, sites that are inside a folder are excluded entirely. New consumers should prefer GET /sites.

Results are ordered by most recently created.

Query Parameters:

  • page[number]: Page to retrieve from the entire result set.
  • page[size]: Max number of sites to return per page. Defaults to 100; all returns the entire result set unpaginated.
  • filter[modified_after]: Only return sites created or modified, or whose access grants for the user changed, after the given timestamp (in UTC epoch seconds).
  • filter[favorites_only]: When true, only return sites in the user's workbench.
Authorizations:
jwt

Responses

Response samples

Content type
application/json
[
  • { }
]

Get User Sites and Site Folders

Returns all folders and sites that the user has access to across all teams, grouped for list display.

Folders are returned in the data.folders array and always come first; sites are returned in the data.sites array, each referencing its containing folder through folder_id (null for sites that are not in a folder).

Pagination treats folders and sites outside of folders as the paginated entries, with folders sorting first. The sites within a folder are always returned in full alongside their folder and do not count towards the page size. meta holds total_sites, the total number of sites the user can access (across both root and in-folder sites) matching the q search and teams filter, and total_favorites, the favorited subset of that count. total is the number of paginated top-level entries (folders plus root sites) and total_pages is the number of pages; both reflect the active filters. A page[size] of all returns the entire result set unpaginated.

The sort param orders the listing by name, owner, team, modified_at or survey_count (prefix with - for descending). Folders always come before sites; the ordering is applied within each group.

Authorizations:
jwt
query Parameters
Page[Number] (string) or Page[Number] (null) (Page[Number])

Page to retrieve from the entire result set.

Page[Size] (string) or Page[Size] (null) (Page[Size])

Max number of entries to return per page. Defaults to 100. The literal value all returns the entire result set unpaginated; it cannot be combined with page[number].

Q (string) or Q (null) (Q)

Search term matched against result set.

Filter[Teams] (string) or Filter[Teams] (null) (Filter[Teams])

A comma-separated list of team internal IDs. Restricts the listing to folders and sites belonging to the given teams. Only teams the user is an active member of are honored; any other team IDs in the filter are ignored.

Filter[Favorites] (string) or Filter[Favorites] (null) (Filter[Favorites])

When true, only sites in the user's workbench are returned, and only folders that contain at least one favorited site are returned.

Sort (string) or Sort (null) (Sort)

Comma-separated list of fields to sort by; prefix a field with - for descending order, e.g. sort=-modified_at,name. Supported fields: name, owner, team, modified_at, survey_count (for folders, the total survey count of their member sites). Folders always come before sites; the ordering is applied within each group, including the member sites of each folder. Defaults to most recently created first.

Responses

Response samples

Content type
application/json
{
  • "data": {
    },
  • "meta": {
    },
  • "links": {
    }
}

Get User Deleted Sites and Folders

Returns the sites and folders that have been deleted across all teams the user is an active member of.

The listing combines soft-deleted sites and folders with sites that were hard deleted from the database, which are recovered from the site audit table. Each entry holds the record's id, name, type (site or folder) and deleted_at timestamp. Results are ordered by most recently deleted.

Query Parameters:

  • page[number]: Page to retrieve from the entire result set.
  • page[size]: Max number of entries to return per page. Defaults to 100; all returns the entire result set unpaginated.
  • filter[deleted_after]: Only return sites and folders deleted after the given timestamp (in UTC epoch seconds).
Authorizations:
jwt

Responses

Response samples

Content type
application/json
[
  • { }
]

Get User Site Permissions

Returns the actions the current user is allowed to perform on each site they have read access to.

The response is an object keyed by site external ID; each value is a map of boolean permission flags (e.g. user_can_edit_site, user_can_create_surveys, user_can_change_site_access, is_site_guest) derived from the user's site access, guest status, and team role.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Add or Remove Favorite Sites

Adds (POST) or removes (DELETE) a list of sites to/from the current user's workbench.

The request body is a plain JSON array of site external IDs. When favoriting, sites already in the workbench are silently ignored; IDs that do not match an existing, non-deleted site are skipped without error.

The user must have at least read access on all of the referenced sites.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Add or Remove Favorite Sites

Adds (POST) or removes (DELETE) a list of sites to/from the current user's workbench.

The request body is a plain JSON array of site external IDs. When favoriting, sites already in the workbench are silently ignored; IDs that do not match an existing, non-deleted site are skipped without error.

The user must have at least read access on all of the referenced sites.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Surveys

Get Survey

Returns a complete serialization of a survey and all of its related information, including its elements, floorplans, and site details.

Only users with read access to the survey's site, or requests authenticated with a valid survey share token for this survey, can access the survey.

Requests authenticated with a public API access token receive the same payload except that element canvas positions are omitted. If the survey has no preview image yet, fetching it also triggers background generation of one.

Authorizations:
jwtsurveyShare
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Get Team Surveys

Returns all surveys across all sites of a team. Each entry contains only the survey's ID, title, and reference ID (custom_survey_id).

Only team members, or requests authenticated with a survey share token for a survey in the team, can list the team's surveys. Guest users cannot access this endpoint.

Query Parameters:

  • has_reference_id: If true, only returns surveys that have a reference ID set.
Authorizations:
jwtsurveyShare
path Parameters
team_id
required
integer (Team Id)
query Parameters
Has Reference Id (boolean) or Has Reference Id (null) (Has Reference Id)
Default: false

Responses

Response samples

Content type
application/json
{
  • "detail": [
    ]
}

Create Sample Surveys

Creates a new "Sample Site" in the team along with sample surveys, and returns the external IDs of the created site and surveys. This process usually occurs on new account creations.

The sample surveys are cloned from pre-selected existing surveys that serve as templates, and assigned to the new site.

Only account admins and team admins can create sample surveys.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)

Responses

Response samples

Content type
application/json
{ }

Share Survey

Shares a survey with a list of email addresses for a given amount of time. A share grant is created for each address, and an email with instructions on how to access the survey is sent to each of them.

The request payload must contain an emails list and an expiration_date (UTC timestamp) after which the shares stop granting access. An optional message can be included in the emails.

Only users with write access to the survey's site can share the survey.

Authorizations:
jwt
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Schedule Survey Sync

Schedules a background job that syncs a survey to the complete state provided in the request payload. Existing surveys are updated to match the new state; if no survey with the given ID exists, a new survey is created. Only the survey editor or team admins can sync an existing survey. A new survey can be created within a folder by including a folder_id field in the payload, referencing a folder in the same site. If a sync job for the survey is already queued or running, no new job is scheduled and the existing job is returned with a 200 status code; in that case the request payload will NOT be synced, and clients holding a newer survey state should sync again after the returned job finishes.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
survey_id
required
string <uuid> (Survey Id)
Request Body schema: application/json
required
title
required
string (Title)
icon_size
required
integer (Icon Size)
unit
required
string
Enum: "metric" "imperial"
margin_range
required
number (Margin Range)
Label (string) or Label (null) (Label)
Reference Id (string) or Reference Id (null) (Reference Id)
Description (string) or Description (null) (Description)
Summary (string) or Summary (null) (Summary)
Location (string) or Location (null) (Location)
string or null
Floorplan Scale (number) or Floorplan Scale (null) (Floorplan Scale)
Floorplan Url (string) or Floorplan Url (null) (Floorplan Url)
SurveyModifiedSource (string) or null
Array of Elements (objects) or Elements (null) (Elements)
Array of Annotations (objects) or Annotations (null) (Annotations)
Array of Boundaries (objects) or Boundaries (null) (Boundaries)
Folder Id (string) or Folder Id (null) (Folder Id)

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "icon_size": 0,
  • "unit": "metric",
  • "margin_range": 0,
  • "label": "string",
  • "reference_id": "string",
  • "description": "string",
  • "summary": "string",
  • "location": "string",
  • "status": "archived",
  • "floorplan_scale": 0,
  • "floorplan_url": "string",
  • "modified_source": "web",
  • "elements": [
    ],
  • "annotations": [
    ],
  • "boundaries": [
    ],
  • "folder_id": "string"
}

Response samples

Content type
application/json
{
  • "job_id": 0
}

Get Survey Sync Job

Returns the current status of a survey sync background job, previously scheduled with the Schedule Survey Sync endpoint. Clients should poll this endpoint to determine the outcome of a sync: a job in the errored status includes an error message describing why the sync failed.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
survey_id
required
string <uuid> (Survey Id)
job_id
required
integer (Job Id)

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "status": "scheduled",
  • "exc_msg": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "modified_at": "2019-08-24T14:15:22Z"
}

Get Survey Transfer Destinations

Returns a tree of all possible sites and folders that a survey can be moved or copied to within the same team, keyed by external ID.

Folders that contain sites are returned at the top level with their sites nested; sites that contain survey folders are returned with those folders nested. Sites that are not within any folder are returned at the top level.

Only sites where the user has write access are returned, and the user must have write access to the survey's current site.

Authorizations:
jwt
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Move Survey

Moves a survey into a site, or into a folder that can contain surveys. The request payload must contain a destination_id field with the external ID of the destination site or folder; the list of possible destinations is provided by the Get Survey Transfer Destinations endpoint.

If the destination is a site, the user must have write access to it and the survey is removed from any folder it was in. If the destination is a folder, it must belong to the same team as the survey's site, and the survey is moved into the folder and its site.

The user must have write access to the survey's current site.

Authorizations:
jwt
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Copy Survey

Schedules a background job that copies a survey into a new survey, and returns the scheduled job's ID (job_id). Clients should poll the Get Copy Survey Job Status endpoint to determine the outcome of the copy. All binary files related to elements, such as images and PDFs, are also copied and assigned new paths.

The user must have write access to both the source and destination site (if any).

Query Parameters:

  • dest: External ID of the destination site, or of a folder in a writable site, where the survey will be copied. If omitted, the survey is copied into the same site as the source survey.
Authorizations:
jwt
path Parameters
survey_id
required
string <uuid> (Survey Id)
query Parameters
Dest (string) or Dest (null) (Dest)

Responses

Response samples

Content type
application/json
{ }

Get Copy Survey Job Status

Returns the current status of a copy survey background job, previously scheduled with the Copy Survey endpoint. The status field is one of scheduled, in_progress, completed, or errored.

Read access to the source survey's site is sufficient to poll copy job statuses. Job statuses expire one month after the job was scheduled, after which a 404 is returned.

Authorizations:
jwt
path Parameters
survey_id
required
string <uuid> (Survey Id)
job_id
required
string <uuid> (Job Id)

Responses

Response samples

Content type
application/json
{ }

Get Survey Templates

Returns a list of available survey templates. These are the templates currently marked as belonging to survey with ID of 1 in the database (a temporary workaround until proper template management is implemented).

Responses are cached per version for up to 30 days.

Query Parameters:

  • version: Templates version to return. Defaults to the latest version.
Authorizations:
jwt
query Parameters
Version (integer) or Version (null) (Version)

Responses

Response samples

Content type
application/json
[
  • { }
]

Teams

Get Team System Type Elements

Returns the elements of every system type, grouped by snake_cased system type name, plus a favorites group containing the elements the team has favorited.

Accessible to team members, team guests, and survey-share requests whose shared survey belongs to the team. Responses are cached per team for one day.

Authorizations:
jwtsurveyShare
path Parameters
team_id
required
integer (Team Id)

Responses

Response samples

Content type
application/json
{ }

Remove Team Member

Removes an active team member from a team.

Only account or team admins can remove team members, and users cannot remove themselves from a team.

Editor locks for all surveys where the removed user is the current editor are released.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
user_id
required
integer (User Id)

Responses

Response samples

Content type
application/json
{ }

Invite Users to a Team

Sends team invitations to one or more users by email address, assigning each a specific role (admin, team_admin, team_member, or team_member_with_infomask). An invitation email is sent to every newly invited user.

Any existing pending invitations for an invited email are cancelled first, so only one pending invitation exists per email at a time. Invitations for emails that already belong to an active team member are silently skipped.

Team membership cannot exceed the account's seat limit (the subscription's seat quantity, or the plan's maximum seats for free accounts). Once the seat limit is reached, any further invitations in the request are skipped and not created.

Only account or team admins can invite users, and an inviter cannot assign a role higher than their own (e.g. a team admin cannot invite an account admin).

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)

ID of the team to invite users to

Request Body schema: application/json
required
Array
email
required
string (Email)
role
required
integer (UserRole)
Enum: 1 2 3 4 5 6 7 10

Responses

Request samples

Content type
application/json
[
  • {
    }
]

Response samples

Content type
application/json
{ }

Update Team Member Role

Changes a team member's role to admin, team_admin, team_member, or team_member_with_infomask.

Only account or team admins can change roles. Users cannot change their own role, and cannot assign a role higher than their own (e.g. a team admin cannot promote someone to account admin).

A team must keep at least one account admin at all times, so demoting the team's only account admin is rejected.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
user_id
required
integer (User Id)
Request Body schema: application/json
required
role
required
integer (UserRole)
Enum: 1 2 3 4 5 6 7 10

Responses

Request samples

Content type
application/json
{
  • "role": 1
}

Response samples

Content type
application/json
{ }

Get User Teams

Returns all teams the current user is an active member of, including the teams of sites the user has guest access to.

Results are ordered by most recently created.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
[
  • { }
]

Element Profiles

Create or Update Element Profile

Creates a new element profile or updates an existing one matched by name.

Element profiles are considered unique by name within a team and element: if a non-deleted profile with the request's name already exists for the team and element it is updated, otherwise a new profile is created. Accessories can be set when creating new element profiles; they are not modified on updates.

Only account admins and team admins can create or update element profiles.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
element_id
required
integer (Element Id)

Responses

Get Team Element Profiles

Returns all element profiles for a team, wrapped in an element_profiles key.

Results are not paginated and are sorted by the sort order defined on each element profile.

Team members, team guests, and survey share grants with access to the team can retrieve the team's element profiles.

Query Parameters:

  • q: Free-text search matching the profile name or the values of key attributes (Descriptive Label, Installation Status, Component Manufacturer, Component Model #).
Authorizations:
jwtsurveyShare
path Parameters
team_id
required
integer (Team Id)

Responses

Response samples

Content type
application/json
{ }

Get Element Profile Accessories

Returns the accessories of all element profiles in a team for a specific element.

The response holds the requested page of accessories under ep_accessories and the total number of matching accessories under count.

Only team members and team guests can retrieve element profile accessories.

Query Parameters:

  • q: Free-text search matching the accessory description, model, or manufacturer.
  • page[number]: Page to retrieve from the entire result set.
  • page[size]: Max number of accessories to return per page. Defaults to 100; a value of all returns the entire result set unpaginated.
Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
element_id
required
integer (Element Id)

Responses

Response samples

Content type
application/json
{ }

Schedule Element Profile Import

Schedules a background element profile import job using an Element Profile Excel export file as input.

The request body must be the base64-encoded Excel (.xlsx) file. The import runs asynchronously: this endpoint returns the ID of the scheduled job once it has been queued, and the job's progress can later be checked using the import status endpoint.

Only account admins and team admins can import element profiles.

Query Parameters:

  • validate_only: When 1, the background job only validates the input file; no changes are applied, and the changes the import would apply as well as any errors found are temporarily cached for inspection via the import status endpoint.
  • append: When 1, the import does not delete any existing element profiles and only creates or updates the profiles included in the import file.
Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
element_id
required
integer (Element Id)

Responses

Response samples

Content type
application/json
{ }

Manufacturers

List Manufacturer Element Profiles

Returns a paginated list of all element profiles for a manufacturer.

Each entry includes the element profile's catalog data and the element it applies to.

Query Parameters:

  • page[number]: Page to retrieve from the entire result set.
  • page[size]: Max number of element profiles to return per page. Defaults to 100.
Authorizations:
jwt
path Parameters
manufacturer_id
required
string <uuid> (Manufacturer Id)

Manufacturer external ID

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "links": {
    },
  • "meta": {
    }
}

Adopt Manufacturer Element Profiles

Imports and adopts manufacturer element profiles from the catalog into a team.

Each adopted profile is snapshotted into the team's library at its current catalog version. Profiles from multiple manufacturers can be adopted in a single request.

Re-adopting a profile a team has already adopted is a no-op: the existing snapshot is preserved and its version is not advanced. Adopting a newer manufacturer version is a deliberate action handled separately, never an implicit side effect of re-adoption.

Only account admins and team admins can adopt manufacturer element profiles.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
Examples: 42

Internal team ID

Request Body schema: application/json
required
element_profile_ids
required
Array of strings <uuid4> (Element Profile Ids) [ items <uuid4 > ]

External IDs of the manufacturer element profiles to adopt.

Responses

Request samples

Content type
application/json
{
  • "element_profile_ids": [
    ]
}

Response samples

Content type
application/json
{ }

Refresh Adopted Manufacturer Element Profiles

Updates a team's existing element profile adoptions to the source profiles' current catalog version, data, and name.

This is the deliberate counterpart to re-adoption (which is a no-op): only adoptions the team already holds are advanced to the latest manufacturer snapshot. Profiles the team has not adopted, and unknown IDs, are silently ignored.

Only account admins and team admins can refresh adopted manufacturer element profiles.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
Examples: 42

Internal team ID

Request Body schema: application/json
required
element_profile_ids
required
Array of strings <uuid4> (Element Profile Ids) [ items <uuid4 > ]

External IDs of the manufacturer element profiles whose adoptions to update.

Responses

Request samples

Content type
application/json
{
  • "element_profile_ids": [
    ]
}

Response samples

Content type
application/json
{ }

List Manufacturers

Returns all active manufacturers along with a count of their element profiles.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Folders

Create or Update Folder

Creates a new site or survey folder with the given external ID, or updates the existing folder if one is found.

Pass a team_id in the request body to create/update a site folder, or a site_external_id to create/update a survey folder; exactly one of the two is required. Site folders require the user to be a member of the team, and survey folders require write access on the site.

Returns 201 when the folder was created and 200 when an existing folder was updated.

Authorizations:
jwt
path Parameters
folder_id
required
string <uuid> (Folder Id)

Responses

Response samples

Content type
application/json
{ }

Get Folder Sites

Returns a paginated list of the sites in a folder that the current user can read.

Each site includes its survey count and a favorited_ts timestamp of when the user favorited the site (null when the site is not in the user's favorites). Results are ordered by most recently created. meta holds the total number of sites and total_pages; links holds the self/first/prev/next/last page links. A page[size] of all returns the entire result set unpaginated.

Query Parameters:

  • filter[sites_modified_after]: Epoch seconds. Returns only sites that were modified, or whose site access was created or modified, after the given timestamp.
Authorizations:
jwt
path Parameters
folder_id
required
string <uuid> (Folder Id)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "links": {
    },
  • "meta": {
    }
}

Get User Folders

Returns all site folders that the current user has access to across all teams.

Only site (team) folders are returned; survey folders are excluded. A folder is accessible when it belongs to a team the user is an active member of, or when it contains at least one site the user can read, so guest users also see the folders containing sites shared with them.

Results are ordered by most recently created. meta holds the total number of folders and total_pages; links holds the self/first/prev/next/last page links. A page[size] of all returns the entire result set unpaginated.

Authorizations:
jwt
query Parameters
Page[Number] (string) or Page[Number] (null) (Page[Number])

Page to retrieve from the entire result set.

Page[Size] (string) or Page[Size] (null) (Page[Size])

Max number of entries to return per page. Defaults to 100. The literal value all returns the entire result set unpaginated; it cannot be combined with page[number].

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    },
  • "links": {
    }
}

Media

Get Download Signed URL

Generates a pre-signed URL for downloading a file from one of the storage buckets.

The namespace path parameter selects the bucket: media, reports, thumbnails, recordings, transcripts, or summaries. The recordings, transcripts, and summaries namespaces are gated by AI account features: they require a user principal belonging to at least one account with the corresponding feature enabled.

If the requested key is not found in the bucket, it is looked up in the EFS file system and, when found there, uploaded to the bucket before the URL is generated. For the thumbnails namespace, missing thumbnails are generated from the source image and uploaded on the spot.

Query Parameters:

  • key: Object key of the file to download. Required.
Authorizations:
jwtsurveyShare
path Parameters
namespace
required
string (Namespace)
query Parameters
key
required
string (Key)

Responses

Response samples

Content type
application/json
{ }

Get Upload Signed URL

Generates a pre-signed URL for uploading a file to one of the storage buckets.

The namespace path parameter selects the bucket: media, reports, thumbnails, recordings, transcripts, or summaries. The object key for the upload is taken from the required key field of the JSON request body.

The returned URL is used to PUT the file directly to storage; the file itself does not pass through this API.

Authorizations:
jwt
path Parameters
namespace
required
string (Namespace)

Responses

Response samples

Content type
application/json
{ }

Product Advisor

Create or Update Product Advisor Configuration

Creates a Product Advisor configuration with the given external ID for an account, or updates it in place if it already exists.

A configuration holds the settings used to provide product recommendations for a single manufacturer; each account can have at most one configuration per manufacturer.

Only account admins can manage Product Advisor configurations.

Authorizations:
jwt
path Parameters
account_id
required
integer (Account Id)
config_id
required
string <uuid> (Config Id)

Responses

Response samples

Content type
application/json
{ }

List Product Advisor Configurations

Returns the default System Surveyor generated Product Advisor configurations.

All configurations in the system are returned, without filtering by the caller's account. Results are ordered by creation date, most recent first, and include each configuration's creator and last modifier.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
[
  • { }
]

Reports

Get Site Reports

Returns all scheduled reports for a site, ordered by creation date (newest first) and then by name.

Requires read access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
[
  • { }
]

Schedule Site Report

Schedules a new report for a site.

The scheduled report record is created immediately and then dispatched to a queue; the report file itself is generated asynchronously by an external service. This endpoint returns once the report has been queued, not once it completes.

All surveys referenced in survey_ids must belong to the site.

Requires read access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)

Responses

Response samples

Content type
application/json
{ }

Get Scheduled Report

Retrieves a specific scheduled report by its external ID.

The report must belong to the specified site.

Requires read access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
report_id
required
string <uuid> (Report Id)

Responses

Response samples

Content type
application/json
{ }

Update Scheduled Report

Updates an existing scheduled report.

Only the file_path, status, and err_msg fields can be set or updated; this is typically used by the external report generation service to record the report's progress and result.

Requires read access on the site.

Authorizations:
jwt
path Parameters
site_id
required
string <uuid> (Site Id)
report_id
required
string <uuid> (Report Id)

Responses

Response samples

Content type
application/json
{ }

Get Report Template

Retrieves a specific report template by its external ID.

The user must be a member of the team.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
template_id
required
string <uuid> (Template Id)

Responses

Response samples

Content type
application/json
{ }

Create or Update Report Template

Creates a new report template or updates an existing one, keyed by the client-supplied template ID.

Returns 201 when a new template is created and 200 when an existing one is updated.

Any team member is allowed to create or update report templates.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
template_id
required
string <uuid> (Template Id)

Responses

Response samples

Content type
application/json
{ }

Delete Report Template

Permanently deletes a report template.

The template must belong to the specified team.

Only account admins and team admins can delete report templates.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)
template_id
required
string <uuid> (Template Id)

Responses

Response samples

Content type
application/json
null

Get Report Templates

Returns all report templates for a team, ordered by creation date (newest first) and then by name.

The user must be a member of the team.

Authorizations:
jwt
path Parameters
team_id
required
integer (Team Id)

Responses

Response samples

Content type
application/json
[
  • { }
]

Survey Media Attachments

Get Survey Media Attachments

Returns all active media attachments for a survey, wrapped in a data key.

Soft-deleted attachments are excluded. Attachment types gated behind account AI features are also filtered out: audio and transcript attachments are returned only when the survey's account has the AI audio transcript feature enabled, and summary attachments only when the AI summary feature is enabled.

An unknown survey ID yields an empty list.

Authorizations:
jwtsurveyShare
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Create Survey Media Attachment

Creates a new media attachment for a survey, recording the uploaded media's S3 location, attachment type, and recording session.

When both an audio and an activitylog attachment exist for the same recording_session_id, the audio transcription pipeline is triggered automatically as an asynchronous background job.

Authorizations:
jwtsurveyShare
path Parameters
survey_id
required
string <uuid> (Survey Id)

Responses

Response samples

Content type
application/json
{ }

Soft Delete Survey Media Attachments

Marks all of a survey's media attachments for a recording session as deleted (soft delete).

Soft-deleted attachments are retained in the database but excluded from the survey's media attachment listing. On success an empty 201 response is returned.

Authorizations:
jwtsurveyShare
path Parameters
survey_id
required
string <uuid> (Survey Id)
recording_session_id
required
string <uuid> (Recording Session Id)

Responses

Response samples

Content type
application/json
{ }

System Types

Get Team Selected System Types

Returns the system types the team has selected, ordered by the system type's sort value.

Results are cached per team for 24 hours, so recent changes to a team's selection may take up to a day to be reflected.

Team members, team guests, and survey share grants with access to the team can retrieve the team's selected system types.

Authorizations:
jwtsurveyShare
path Parameters
team_id
required
integer (Team Id)

Responses

Response samples

Content type
application/json
[
  • { }
]

Auth

Authenticate

Authenticates a user with an email and password. On success, the response contains the user's ID and JWT access and refresh tokens for making authenticated API requests.

If the user already has an active web session and force_login is false, no new tokens are issued and the response contains only is_multiple_login: true. Pass force_login: true to log in anyway.

If a captcha_token is provided it is verified against the Google reCAPTCHA API before authentication. Failed login attempts are tracked, and the user is temporarily locked out after too many consecutive failures.

Request Body schema: application/json
required
email
required
string (Email)
password
required
string (Password)
force_login
boolean (Force Login)
Default: false
Captcha Token (string) or Captcha Token (null) (Captcha Token)

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "force_login": false,
  • "captcha_token": "string"
}

Response samples

Content type
application/json
{ }

Refresh Token

Issues a new JWT access token given a valid refresh token.

The response contains the new access token along with the same refresh token that was provided.

Request Body schema: application/json
required
refresh_token
required
string (Refresh Token)

Responses

Request samples

Content type
application/json
{
  • "refresh_token": "string"
}

Response samples

Content type
application/json
{ }

Forgot Password

Initiates the forgot password flow. If a user with the given email exists, an email is sent to them with a password reset token that is valid for 10 minutes.

The response is always an empty object, whether or not the email belongs to a registered user, so the endpoint does not reveal which emails have accounts.

Request Body schema: application/json
required
email
required
string (Email)

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{ }

Reset Password

Resets a user's password using a reset token issued by the forgot password flow.

The token is single-use and expires 10 minutes after it is issued. On success the user's password is replaced with the provided one and the token is invalidated.

Request Body schema: application/json
required
token
required
string (Token)
password
required
string (Password)

Responses

Request samples

Content type
application/json
{
  • "token": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{ }

Users

Get Current User

Returns the current authenticated user's profile data along with the accounts and teams they belong to, either as a team member or as a guest user. Each team includes the user's role in that team, and deleted accounts are excluded.

Survey-share authenticated requests are also supported: a placeholder user record is returned carrying the share's email address, and the team and account data are derived from the shared survey's site, with a guest role.

Authorizations:
jwtsurveyShare

Responses

Response samples

Content type
application/json
{ }

Set User Preferences

Sets preferences for the current authenticated user.

PUT replaces the user's entire preference set with the request payload, while PATCH merges the payload into the existing preferences, updating only the provided keys. The response contains the user's resulting preferences.

When the web_2_enabled preference is included, the change is also propagated to the user's HubSpot contact on a best-effort basis.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Set User Preferences

Sets preferences for the current authenticated user.

PUT replaces the user's entire preference set with the request payload, while PATCH merges the payload into the existing preferences, updating only the provided keys. The response contains the user's resulting preferences.

When the web_2_enabled preference is included, the change is also propagated to the user's HubSpot contact on a best-effort basis.

Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Elements

Get Elements

Returns all published elements available for configuration, grouped by system type under a system_types key.

System types that have at least one published element are returned ordered by their sort value, each with its published elements nested under it, including every element's category and inline SVG icon.

Accessible to any authenticated principal, including survey share tokens.

Authorizations:
jwtsurveyShare

Responses

Response samples

Content type
application/json
{ }

Get Element Icons

Returns all published elements along with their icons as inline SVG strings.

Elements are ordered by their sort order; each entry includes the element's ID, name, abbreviation, category, and unescaped SVG icon markup.

Accessible to any authenticated principal, including survey share tokens.

Authorizations:
jwtsurveyShare

Responses

Response samples

Content type
application/json
[
  • { }
]

System

Get System Configs

Returns selected system configuration values that are exposed to API clients: google_maps_api_key, google_maps_image_url, hubspot_access_token, and mobile_config.

Specific configs can be requested by passing their names as query parameters (parameter values are ignored); unknown parameter names are ignored. When no valid config name is passed, all of the above configs are returned.

Query Parameters:

  • <config_name>: Name of a config to include in the response. Repeatable.
Authorizations:
jwt

Responses

Response samples

Content type
application/json
{ }

Integrations

Get Prismatic Auth Token

Generates and returns a short-lived (1 hour) customer JWT for authenticating the current user with the embedded Prismatic marketplace and workflow builder for an account.

The Prismatic customer for the account is created first if it does not already exist; customer creation is best-effort and failures do not prevent the token from being issued. The token is issued with the Prismatic admin role, allowing the user to deploy integration instances.

Query Parameters:

  • account_id: Internal ID of the account to authenticate against Prismatic as.
Authorizations:
jwt
query Parameters
account_id
required
integer (Account Id)

Responses

Response samples

Content type
application/json
{ }