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.
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.
| account_id required | integer (Account Id) |
[- { }
]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.
| account_id required | integer (Account Id) |
{ }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.
| account_id required | integer (Account Id) |
| access_token_id required | string <uuid> (Access Token Id) |
{ }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.
| account_id required | integer (Account Id) |
{ }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.
| account_id required | integer (Account Id) |
Team Id (integer) or Team Id (null) (Team Id) |
{- "member_count": 0,
- "disabled_member_count": 0,
- "invite_count": 0,
- "guest_count": 0,
- "seats_available": 0
}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.
| site_id required | string <uuid> (Site Id) |
[- { }
]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.
| contact_id required | string <uuid> (Contact Id) External ID of the contact to invite |
| permission required | string Enum: "read" "write" "no_access" |
| expires_at required | string <date-time> (Expires At) |
{- "permission": "read",
- "expires_at": "2019-08-24T14:15:22Z"
}{- "invitation_id": "string"
}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.
| invitation_id required | string <uuid> (Invitation Id) |
| 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) |
{- "captcha_token": "string",
- "first_name": "string",
- "last_name": "string",
- "password": "string"
}{ }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.
| site_id required | string <uuid> (Site Id) |
{ }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.
| site_id required | string <uuid> (Site Id) |
{ }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.
| site_id required | string <uuid> (Site Id) |
nullPartially 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.
| site_id required | string <uuid> (Site Id) |
{ }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.| site_id required | string <uuid> (Site Id) |
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 |
[- { }
]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.
| site_id required | string <uuid> (Site Id) |
| team_id required | integer (Team Id) |
Folder Id (string) or Folder Id (null) (Folder Id) |
{- "team_id": 0,
- "folder_id": "string"
}{ }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.
{ }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.[- { }
]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.
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 | |
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 |
{- "data": {
- "folders": [
- {
- "id": "string",
- "name": "string",
- "modified_at": "2019-08-24T14:15:22Z",
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "site_count": 0,
- "favorites_count": 0,
- "team": {
- "team_id": 0,
- "name": "string"
}
}
], - "sites": [
- {
- "id": "string",
- "name": "string",
- "survey_count": 0,
- "modified_at": "2019-08-24T14:15:22Z",
- "owner": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "team": {
- "team_id": 0,
- "name": "string"
}, - "folder_id": "string",
- "is_favorite": true
}
]
}, - "meta": {
- "total": 0,
- "total_pages": 0,
- "total_sites": 0,
- "total_favorites": 0
}, - "links": {
- "property1": "string",
- "property2": "string"
}
}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).[- { }
]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.
{ }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.
{ }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.
{ }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.
| survey_id required | string <uuid> (Survey Id) |
{ }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.| team_id required | integer (Team Id) |
Has Reference Id (boolean) or Has Reference Id (null) (Has Reference Id) Default: false |
{- "detail": [
- {
- "loc": [
- "string"
], - "type": "string"
}
]
}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.
| team_id required | integer (Team Id) |
{ }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.
| site_id required | string <uuid> (Site Id) |
| survey_id required | string <uuid> (Survey Id) |
| 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) |
{- "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": [
- {
- "id": "string",
- "name": "string",
- "element_id": 0,
- "systemtype_id": 0,
- "position": {
- "x": 0,
- "y": 0
}, - "element_index": 0,
- "element_profile_id": 0,
- "variant": "right_angle",
- "z_order": 0,
- "attributes": [
- {
- "attribute_id": 0,
- "name": "string",
- "value": "string"
}
], - "accessories": [
- {
- "manufacturer": "string",
- "model": "string",
- "row_index": 0,
- "description": "string",
- "quantity": 0,
- "price": 0,
- "labor_hours": 0
}
], - "children": [
- { }
], - "cables": [
- {
- "id": "string",
- "external_id": "string",
- "type": "string",
- "a_side": {
- "connection": null,
- "detail": null
}, - "z_side": {
- "connection": null,
- "detail": null
}
}
], - "connections": {
- "start": {
- "id": null,
- "attachment_point": null
}, - "end": {
- "id": null,
- "attachment_point": null
}
}, - "activity_log": [
- {
- "id": "string",
- "entry": "string",
- "date": "2019-08-24T14:15:22Z"
}
], - "web_links": [
- {
- "name": "string",
- "url": "string"
}
], - "photos": [
- "string"
], - "pdfs": [
- {
- "name": "string",
- "url": "string"
}
], - "is_deleted": true
}
], - "annotations": [
- {
- "location": {
- "x": 0,
- "y": 0
}, - "stroke_color": "string",
- "stroke_width": "string",
- "category": "rectangle",
- "text": "string",
- "start_point": {
- "x": 0,
- "y": 0
}, - "end_point": {
- "x": 0,
- "y": 0
}, - "font_size": "string",
- "size": "string",
- "opacity": 1,
- "coordinates": null,
- "fill": true
}
], - "boundaries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "lines": [
- [
- {
- "x": 0,
- "y": 0
}
]
], - "properties": {
- "line_width": 0
}
}
], - "folder_id": "string"
}{- "job_id": 0
}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.
| site_id required | string <uuid> (Site Id) |
| survey_id required | string <uuid> (Survey Id) |
| job_id required | integer (Job Id) |
{- "id": 0,
- "status": "scheduled",
- "exc_msg": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "modified_at": "2019-08-24T14:15:22Z"
}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.
| survey_id required | string <uuid> (Survey Id) |
{ }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.
| survey_id required | string <uuid> (Survey Id) |
{ }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.| survey_id required | string <uuid> (Survey Id) |
Dest (string) or Dest (null) (Dest) |
{ }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.
| survey_id required | string <uuid> (Survey Id) |
| job_id required | string <uuid> (Job Id) |
{ }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.Version (integer) or Version (null) (Version) |
[- { }
]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.
| team_id required | integer (Team Id) |
{ }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.
| team_id required | integer (Team Id) |
| user_id required | integer (User Id) |
{ }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).
| team_id required | integer (Team Id) ID of the team to invite users to |
| email required | string (Email) |
| role required | integer (UserRole) Enum: 1 2 3 4 5 6 7 10 |
[- {
- "email": "string",
- "role": 1
}
]{ }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.
| team_id required | integer (Team Id) |
| user_id required | integer (User Id) |
| role required | integer (UserRole) Enum: 1 2 3 4 5 6 7 10 |
{- "role": 1
}{ }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.
| team_id required | integer (Team Id) |
| element_id required | integer (Element Id) |
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 #).| team_id required | integer (Team Id) |
{ }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.| team_id required | integer (Team Id) |
| element_id required | integer (Element Id) |
{ }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.| team_id required | integer (Team Id) |
| element_id required | integer (Element Id) |
{ }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.| manufacturer_id required | string <uuid> (Manufacturer Id) Manufacturer external ID |
{- "data": [
- {
- "external_id": "string",
- "name": "string",
- "version": 0,
- "data": { },
- "element": {
- "element_id": 0,
- "name": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "modified_at": "2019-08-24T14:15:22Z"
}
], - "links": {
- "property1": "string",
- "property2": "string"
}, - "meta": {
- "property1": 0,
- "property2": 0
}
}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.
| team_id required | integer (Team Id) Examples: 42 Internal team ID |
| element_profile_ids required | Array of strings <uuid4> (Element Profile Ids) [ items <uuid4 > ] External IDs of the manufacturer element profiles to adopt. |
{- "element_profile_ids": [
- "bf29bf4d-a6b8-416c-8696-34f877652cae"
]
}{ }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.
| team_id required | integer (Team Id) Examples: 42 Internal team ID |
| element_profile_ids required | Array of strings <uuid4> (Element Profile Ids) [ items <uuid4 > ] External IDs of the manufacturer element profiles whose adoptions to update. |
{- "element_profile_ids": [
- "bf29bf4d-a6b8-416c-8696-34f877652cae"
]
}{ }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.
| folder_id required | string <uuid> (Folder Id) |
{ }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.| folder_id required | string <uuid> (Folder Id) |
{- "data": [
- {
- "external_id": "string",
- "name": "string",
- "city": "string",
- "state": "string",
- "zip_code": "string",
- "street": "string",
- "abbr": "string",
- "version": 0,
- "is_active": true,
- "reference_id": "string",
- "customer_external_id": "string",
- "team_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "modified_at": "2019-08-24T14:15:22Z",
- "survey_count": 0
}
], - "links": {
- "property1": "string",
- "property2": "string"
}, - "meta": {
- "property1": 0,
- "property2": 0
}
}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.
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 |
{- "data": [
- {
- "external_id": "string",
- "folder_name": "string",
- "abbr": "string",
- "site_id": 0,
- "modified_at": "2019-08-24T14:15:22Z",
- "team": {
- "team_id": 0,
- "name": "string"
}, - "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}
}
], - "meta": {
- "total": 0,
- "total_pages": 0
}, - "links": {
- "property1": "string",
- "property2": "string"
}
}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.| namespace required | string (Namespace) |
| key required | string (Key) |
{ }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.
| namespace required | string (Namespace) |
{ }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.
| account_id required | integer (Account Id) |
| config_id required | string <uuid> (Config Id) |
{ }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.
[- { }
]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.
| site_id required | string <uuid> (Site Id) |
{ }Retrieves a specific scheduled report by its external ID.
The report must belong to the specified site.
Requires read access on the site.
| site_id required | string <uuid> (Site Id) |
| report_id required | string <uuid> (Report Id) |
{ }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.
| site_id required | string <uuid> (Site Id) |
| report_id required | string <uuid> (Report Id) |
{ }Retrieves a specific report template by its external ID.
The user must be a member of the team.
| team_id required | integer (Team Id) |
| template_id required | string <uuid> (Template Id) |
{ }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.
| team_id required | integer (Team Id) |
| template_id required | string <uuid> (Template Id) |
{ }Permanently deletes a report template.
The template must belong to the specified team.
Only account admins and team admins can delete report templates.
| team_id required | integer (Team Id) |
| template_id required | string <uuid> (Template Id) |
nullReturns 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.
| survey_id required | string <uuid> (Survey Id) |
{ }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.
| survey_id required | string <uuid> (Survey Id) |
{ }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.
| survey_id required | string <uuid> (Survey Id) |
| recording_session_id required | string <uuid> (Recording Session Id) |
{ }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.
| team_id required | integer (Team Id) |
[- { }
]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.
| email required | string (Email) |
| password required | string (Password) |
| force_login | boolean (Force Login) Default: false |
Captcha Token (string) or Captcha Token (null) (Captcha Token) |
{- "email": "string",
- "password": "string",
- "force_login": false,
- "captcha_token": "string"
}{ }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.
| refresh_token required | string (Refresh Token) |
{- "refresh_token": "string"
}{ }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.
| email required | string (Email) |
{- "email": "string"
}{ }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.
| token required | string (Token) |
| password required | string (Password) |
{- "token": "string",
- "password": "string"
}{ }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.
{ }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.
{ }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.
{ }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.
{ }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.
[- { }
]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.{ }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.| account_id required | integer (Account Id) |
{ }