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 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,
- "max_seats": 0,
- "available_seats": 0
}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 share token scoped to the site (a site share, or a survey share for a survey on the site), can access it.
| site_id required | string <uuid> (Site Id) |
{- "id": "string",
- "name": "string",
- "city": "string",
- "state": "string",
- "zip_code": "string",
- "street": "string",
- "label": "string",
- "version": 0,
- "is_active": true,
- "address": "string",
- "tags": [
- "string"
], - "reference_id": "string",
- "custom_site_id": "string",
- "customer_external_id": "string",
- "team_id": 0,
- "team": {
- "id": 0,
- "name": "string"
}, - "created_at": 0,
- "modified_at": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "survey_count": 0
}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) |
{- "id": "string",
- "name": "string",
- "city": "string",
- "state": "string",
- "zip_code": "string",
- "street": "string",
- "label": "string",
- "version": 0,
- "is_active": true,
- "address": "string",
- "tags": [
- "string"
], - "reference_id": "string",
- "custom_site_id": "string",
- "customer_external_id": "string",
- "team_id": 0,
- "team": {
- "id": 0,
- "name": "string"
}, - "created_at": 0,
- "modified_at": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}
}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) |
{- "id": "string",
- "name": "string",
- "city": "string",
- "state": "string",
- "zip_code": "string",
- "street": "string",
- "label": "string",
- "version": 0,
- "is_active": true,
- "address": "string",
- "tags": [
- "string"
], - "reference_id": "string",
- "custom_site_id": "string",
- "customer_external_id": "string",
- "team_id": 0,
- "team": {
- "id": 0,
- "name": "string"
}, - "created_at": 0,
- "modified_at": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}
}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"
}{ }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 the folders and root-level 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. Sites within folders are not part of the listing — only their folder is, with site_count reporting its member count and survey_count the total number of surveys across its member sites.
Pagination treats folders and root sites as the paginated entries, with folders sorting first. 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 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": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "site_count": 0,
- "favorites_count": 0,
- "survey_count": 0,
- "team": {
- "team_id": 0,
- "name": "string"
}
}
], - "sites": [
- {
- "id": "string",
- "name": "string",
- "survey_count": 0,
- "modified_at": 0,
- "owner": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "team": {
- "team_id": 0,
- "name": "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 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 share token whose scope includes this survey (a share of this survey, or of its site), 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) |
{- "id": "string",
- "title": "string",
- "label": "string",
- "reference_id": "string",
- "description": "string",
- "summary": "string",
- "location": "string",
- "site": "string",
- "team_id": 0,
- "customer_external_id": "string",
- "custom_site_id": "string",
- "icon_size": 0,
- "is_archived": true,
- "unit": "metric",
- "version": 0,
- "margin_range": 0,
- "type": "sample",
- "floorplan_scale": 0,
- "preview_image": "string",
- "floorplan_url": "string",
- "sync_status": "synced",
- "has_audio": true,
- "creator": 0,
- "editor": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": 0,
- "created_at": 0,
- "modified_at": 0,
- "modified_source": "web",
- "elements": [
- {
- "id": "string",
- "name": "string",
- "element_id": 0,
- "element_index": 0,
- "element_profile_id": 0,
- "systemtype_id": 0,
- "variant": "right_angle",
- "z_order": 0,
- "position": {
- "x": 0,
- "y": 0
}, - "photo_urls": [
- "string"
], - "sync_status": "synced",
- "attributes": [
- {
- "id": 0,
- "attribute_id": 0,
- "name": "string",
- "value": "string"
}
], - "accessories": [
- {
- "id": "string",
- "manufacturer": "string",
- "model": "string",
- "description": "string",
- "quantity": 0,
- "price": 0,
- "labor_hours": 0,
- "row_index": 0
}
], - "children": [
- { }
], - "cables": [
- {
- "id": "string",
- "external_id": "string",
- "type": "string",
- "a_side": {
- "connection": "string",
- "detail": "string"
}, - "z_side": {
- "connection": "string",
- "detail": "string"
}
}
], - "connections": {
- "start": {
- "id": "string",
- "attachment_point": "string"
}, - "end": {
- "id": "string",
- "attachment_point": "string"
}
}, - "pdf_urls": [
- {
- "name": "string",
- "url": "string",
- "link_type": 0
}
], - "web_links": [
- {
- "name": "string",
- "url": "string",
- "link_type": 0
}
], - "activity_log": [
- {
- "id": "string",
- "entry": "string",
- "date": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "created_at": 0,
- "modified_at": 0
}
]
}
], - "annotations": [
- {
- "id": "string",
- "location": {
- "x": 0,
- "y": 0
}, - "text": "string",
- "stroke_color": "string",
- "stroke_width": "string",
- "start_point": {
- "x": 0,
- "y": 0
}, - "end_point": {
- "x": 0,
- "y": 0
}, - "font_size": "string",
- "size": "string",
- "opacity": 1,
- "category": "rectangle",
- "coordinates": null,
- "fill": true
}
], - "boundaries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "lines": [
- [
- {
- "x": 0,
- "y": 0
}
]
], - "properties": {
- "line_width": 0
}, - "created_at": 0,
- "modified_at": 0
}
], - "users": [
- {
- "id": 0,
- "first_name": "string",
- "last_name": "string",
- "avatar_url": "string"
}
]
}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) |
{- "job_id": 0,
- "status": "scheduled",
- "error": "string",
- "created_at": 0,
- "modified_at": 0
}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) |
{- "property1": {
- "id": "string",
- "type": "folder",
- "name": "string",
- "sites": {
- "property1": {
- "id": "string",
- "type": "site",
- "name": "string",
- "folders": {
- "property1": {
- "id": "string",
- "type": "folder",
- "name": "string"
}, - "property2": {
- "id": "string",
- "type": "folder",
- "name": "string"
}
}
}, - "property2": {
- "id": "string",
- "type": "site",
- "name": "string",
- "folders": {
- "property1": {
- "id": "string",
- "type": "folder",
- "name": "string"
}, - "property2": {
- "id": "string",
- "type": "folder",
- "name": "string"
}
}
}
}
}, - "property2": {
- "id": "string",
- "type": "folder",
- "name": "string",
- "sites": {
- "property1": {
- "id": "string",
- "type": "site",
- "name": "string",
- "folders": {
- "property1": {
- "id": "string",
- "type": "folder",
- "name": "string"
}, - "property2": {
- "id": "string",
- "type": "folder",
- "name": "string"
}
}
}, - "property2": {
- "id": "string",
- "type": "site",
- "name": "string",
- "folders": {
- "property1": {
- "id": "string",
- "type": "folder",
- "name": "string"
}, - "property2": {
- "id": "string",
- "type": "folder",
- "name": "string"
}
}
}
}
}
}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) |
{ }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 share-token requests whose shared survey or site belongs to the team. Responses are cached per team for one day.
| team_id required | integer (Team Id) |
{- "favorites": [
- {
- "element_id": 0,
- "name": "string"
}
], - "property1": [
- {
- "element_id": 0,
- "name": "string"
}
], - "property2": [
- {
- "element_id": 0,
- "name": "string"
}
]
}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) |
{- "id": 0,
- "name": "string",
- "is_default": true,
- "sort": 0,
- "content": {
- "attribute": [ ],
- "child": [ ],
- "pdf_url": [ ]
}, - "team_id": 0,
- "element_id": 0,
- "created_by": 0,
- "accessories": [ ],
- "created_at": 0,
- "modified_at": 0
}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 share grants (survey or site) 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) |
{- "element_profiles": [
- {
- "id": 0,
- "name": "string",
- "is_default": true,
- "sort": 0,
- "content": {
- "attribute": [ ],
- "child": [ ],
- "pdf_url": [ ]
}, - "team_id": 0,
- "element_id": 0,
- "created_by": 0,
- "accessories": [ ],
- "created_at": 0,
- "modified_at": 0
}
]
}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) |
{- "count": 0,
- "ep_accessories": [
- {
- "id": 0,
- "description": "string",
- "manufacturer": "",
- "model": "",
- "price": 0,
- "labor_hours": 0,
- "created_at": 0,
- "team_id": 0,
- "element_id": 0
}
]
}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) |
{- "job_id": "f804fa1f-fcbf-4d6d-85b4-d52995b83aac"
}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": [
- {
- "id": "string",
- "name": "string",
- "version": 0,
- "data": { },
- "element": {
- "element_id": 0,
- "name": "string"
}, - "created_at": 0,
- "modified_at": 0
}
], - "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) |
{- "id": "string",
- "name": "string",
- "label": "string",
- "site_id": 0,
- "team_id": 0,
- "team": {
- "id": 0,
- "name": "string"
}, - "modified_at": 0,
- "creator": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}, - "modifier": {
- "user_id": 0,
- "first_name": "string",
- "last_name": "string"
}
}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 share grants (survey or site) 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 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) |
Captcha Token (string) or Captcha Token (null) (Captcha Token) |
{- "email": "string",
- "password": "string",
- "captcha_token": "string"
}{- "user_id": 0,
- "token": "string",
- "refresh_token": "string",
- "first_login_ts": 0
}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"
}{- "token": "string",
- "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.
Share-token authenticated requests (survey or site shares) 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 site, with a guest role.
{- "id": 0,
- "user_name": "string",
- "first_name": "string",
- "last_name": "string",
- "title": "string",
- "email": "string",
- "company": "string",
- "mobile": "string",
- "country": "string",
- "state": "string",
- "city": "string",
- "last_login": 0,
- "created_at": 0,
- "avatar_url": "string",
- "prefs": {
- "auto_sync": true,
- "v2_site_list_enabled": true,
- "web_2_enabled": true,
- "report_2_enabled": true,
- "timezone": "string",
- "comment_notification_enabled": true,
- "comment_notification_daily_batch": true,
- "comment_notification_mentions_only": true,
- "comment_notification_editor_only": true,
- "comment_notification_time": "string",
- "pinned_elements": [
- {
- "element_id": 0,
- "systemtype_id": 0,
- "sort_order": 0,
- "variant": "flex"
}
]
}, - "accounts": [
- {
- "id": 0,
- "company": "string",
- "chargebee_id": "string",
- "is_trial": true,
- "is_free": true,
- "trial_expiration": "2019-08-24T14:15:22Z",
- "cancel_requested": true,
- "subscription": {
- "id": 0,
- "quantity": 0,
- "end_date": 0,
- "plan": {
- "id": 0,
- "name": "string",
- "max_seats": 0,
- "max_elements_per_survey": 0,
- "max_attachments_per_element": 0
}
}, - "features": {
- "property1": true,
- "property2": true
}, - "webhooks": [
- "string"
]
}
], - "teams": [
- {
- "id": 0,
- "name": "string",
- "account_id": 0,
- "role": "super_admin",
- "margin_range": 0,
- "logo_url": "string",
- "unit": "metric",
- "budget_status": 0,
- "labor_rate": 0
}
]
}