This guide includes many of the common API calls which customers use with Revver and gives examples and call requirements.
Access/Permissions Requirements
In order for a user account to fulfill the OAuth2 requirements, the account needs a Full license assigned. To ensure full scope of involvement in the user’s integration needs, the user account authenticating with our API (“API User”) should have Admin User (system) Permissions.
This “API user” will also need Admin Item permissions on the entire Account Workspace
Revver API Introduction
General API Documentation can be found at: https://api.efilecabinet.net/api/apihelp/index.html
A general demonstration program in C# is available at customer request.
OAuth2
Revver utilizes OAuth2 - specifically the Resource Owner Password Grant, to do so, you will need to contact Revver to receive an Application ID and Secret. This is requested by providing your account details and API / Integration use case to [email protected] - The team will review
Once those have been obtained, they can be utilized against the "https://api.revverdocs.net/Token" endpoint
Developer Tools: Browser Console and Postman
Browser Console
API requests can be seen by opening the browser network console and utilizing the filter /api/
All api requests are prefixed with the Base url. Most likely this is https://api.revverdocs.net/ in the case of the U.S. environment. Our other environments include:
UK/Europe – https://api-uk.revverdocs.net/
Canada – https://account-ca.revverdocs.net/
GovCloud – https://api-govcloud.revverdocs.net/
Postman Configuration
API requests can be reviewed in Postman with the following configuration
File Creation
When creating a file in Revver, 4 things are needed:
File Name
File Size
Parent Id (Node Id of the folder or Drawer to store the file in)
File Itself
Process
To upload a file to Revver, 4 calls are necessary to accomplish an upload:
POST /api/Node - Create a new file node to represent the file with the file name given.
Body: {
"parentID": "{{parent_id}}",
"systemType": "7", // System Type identifies the type of node, 7 – File.
"name": "{{file_name}}"
}POST /api/FileUpload - Request to upload the first file version with the node id returned in step 1 along with the file size.
Body: [{"nodeID":"{{node_id}}","length":{{file_size}}}]
PUT /api/FileUpload?id=”node_id”&uploadIdentifier={upload_identifier}&index={current_index}&complete=false
This call takes the chunks of the file in it’s body with a max chunk size of 10MB. This step is repeated as many times as needed to upload the file in it’s entirety.
PUT /api/FileUpload?id=”node_id”&uploadIdentifier={upload_identifier}&index={current_index}&complete=true
This call takes no body, but the “complete” flag is set to true. This indicates that all chunks have been uploaded and the file can be stored.
Folder Creation
When creating folders/drawers/cabinets in Revver a parent id and name must be provided. To identify the parent ID, several methods are available:
Programmatically recursing the tree structure to the desired parent that the new folder will be created under.
Identify the Parent ID via the Web Client url.
Programmatically
To recurse through the tree structure, two API calls are necessary:
1. GET /api/Node/Data with the authorization header set. This will return a list of Account Workspace Nodes. (Usually only 1 is returned unless multiple accounts are shared with the current user)
2. GET /api/Node/Children?id={{id_to_get_children_of}} with authorization header set. This will return the children Nodes of the Node ID provided. Repeating this call will allow recursion throughout the entire tree structure possible to identify the parent id desired to create the new folder. This call has an optional parameter of “searchCriteria” by adding this, it will filter the return results by the corresponding search criteria: /api/Node/Children?id={{id_to_get_children_of}}&searchCriteria={{search_criteria}}
Web Client
Using the web browser, navigate to the parent Cabinet/Drawer/Folder, then take note of the url:
The ID in the url is the ID of the selected item.
Create Folder
Once the ParentID is known and the name determined, the call to create the folder can be made. This is done utilizing the /api/Node endpoint:
Url Post-fix:
/api/Node
HTTP Verb:
POST
Headers:
Authorization: Bearer {{access_token}}
Content-Type: application/json
Body:
{
"parentID": "{{parent_id}}",
"systemType": "6", // System Type identifies the type of node, 6 – Folder.
"name": "{{new_folder_name}}",
}
Update Folder
To move, rename, or change the Node Profile (read- Metadata), a call to the /api/Node endpoint is again made, but utilizing the PUT verb, and a body that contains the Id of the Node to modify, the changed ParentID (in the case of a move), and the changed name (in the case of a desired rename).
Url Post-fix:
/api/Node/{node_id}
HTTP Verb:
PUT
Headers:
Authorization: Bearer {{access_token}}
Content-Type: application/json
Body:
{
"parentID": "{{new_parent_id}}",
"name": "{{new_folder_name}}",
}
User Provisioning
For user provisioning, the API endpoint to utilize is the /api/Role or /api/RoleBatch (if needing to query/create/update/delete large numbers of users).
Create
Url Post-fix:
/api/Role
HTTP Verb:
POST
Headers:
Authorization: Bearer {{access_token}}
Content-Type: application/json
Body:
{
"roleType": "2", // 2 represents a User Role. Other values: 1 – Guest, 3 – Group
"accountID": 2141,
"userName": "{{email_address_of_user_to_create}}",
"name": "{{display_name_of_user}}", // typically First Name Last Name
"memberOfRoles": [ // This array represents the list of groups you’d like to add this user to
{
"id": 74587
}
],
"systemPermissions": { // This object represents the system permissions that you wish to give the user
"users": { // Set enabled on all to false to indicate no system permissions are to be given
"enabled": false,
},
"guests": {
"enabled": false,
},
"groups": {
"enabled": false,
},
"profiles": {
"enabled": false,
},
"nodeManagement": {
"enabled": false,
},
"templates": {
"enabled": false,
},
"systemSettings": {
"enabled": false,
},
"nodePermissionOverride": {
"enabled": false,
},
"licenseManagement": {
"enabled": false,
},
"retentionAdmin": {
"enabled": false,
},
"nodeExchange": { // Sharing
"enabled": true,
},
"nodeExchangeManagement": {
"enabled": false,
},
"salesForceManagement": {
"enabled": false,
},
"workflow": {
"enabled": false,
},
"workflowManagement": {
"enabled": false,
},
"auditLogManagement": {
"enabled": false,
},
"retentionUnlock": {
"enabled": false,
},
"eSignatureManagement": {
"enabled": false,
},
"eSignature": {
"enabled": false,
},
"accessLinksManagement": {
"enabled": false,
},
"accessLinksUsage": {
"enabled": false,
},
"reporting": {
"enabled": false,
},
}
Update
Same as Create, but with two differences:
HTTP Verb is PUT
Include the “id” property on the object with it set to the id of the existing Role you wish to modify.
Delete
Url Post-fix:
/api/Role/{id} // Where id is the id of the User role you wish to delete
HTTP Verb:
DELETE
Headers:
Authorization: Bearer {{access_token}}
Node (Cabinet/Drawer/Folder) Permissions
Create Permissions
To set permissions for a node, the necessary information is the NodeID you want the permission to apply to, and the Role ID of the User/Group you want involved. The request looks like the following:
Url Post-fix:
/ api/NodePermissionBatch/Create
HTTP Verb:
POST
Headers:
Authorization: Bearer {{access_token}}
Content-Type: application/json
Body:
[
{
"batchObject": {
"inheritanceBehavior": 0, // This determines the inheritance behavior
// of this permission, 0 = default, 20 = this item only (no inheritance)
"download": true,
"restrict": false,
"view": true,
“admin”: false,
"roleID": 221444,
"nodeID": "133278432"
}
}
]
Update Permissions
This is the largely the same as create, but with the inclusion of the “id” property on the batch object and made to this Url: /api/NodePermissionBatch/Update
Delete Permissions
Similar to update, but the url is: /api/NodePermissionBatch/Delete and the body contains a list of batch objects that solely hold the id of the permission, it is structured so:
[
{
"batchObject":{id_of_permission_to_delete}
}
]
Profile Data (Metadata)
Get All Profile Items in an Account
GET: /api/ProfileItem/Account/{accountID}
This will return all the profile items on a given account. It will include the name of the profile item, the id of the profile item, which you can use in subsequent api calls, along with other details about the profile item
Get All Profiles in an Account
GET: /api/ProfileItem/Account/{accountID}
This will return all the profiles on a given account. It will include the name of the profile, the id of the profile, which you can use in subsequent api calls, along with other details about the profile.
Note that profile items included in the profile will not be returned. You need to call the api endpoint to load a profile by it’s Id in order to get the included profile items.
Create a Profile Item
POST: /api/ProfileItem
Creates a new profile item.
The id property (along with several other properties) will be populated on the JSON object in the body of the response.
Example Body:
{
"accountID": 1, // number, id of the account
"name": "some name", // string, name of the profile item
"itemType": 0, //number, the profile item type (see profile item types below)
"value": "some default value", // (optional) string, default value used when applying this profile item to a node
"visibleDecimalPlaces": 2, // nullable number, only required for percentage type profile items, indicates how many decimal places to show
"presetValues": [ // nullable array, only required for Preset Values type profile items, array of selectable options
{
"value": "one", // string, label for this preset value
"order": 0 // number, order in which this will appear in the dropdown list
} // this is an array so more preset values objects can be added
],
"hiddenCharacter": { // object, only required for Hidden Text type profile items
"hideSpecifiedCharacters": true, // boolean, indicates whether the configuration is detailing characters that should be hidden (true) or show (false)
"fromBeginning": 1, // nullable number, the number of characters at the beginning of the value the should be shown/hidden
"fromEnd": 1, // // nullable number, the number of characters at the end of the value the should be shown/hidden
"characterRanges": [ // array, list of ranges of characters to hide/show
{
"startingPosition": 2, //number, index of first character to show/hide
"endingPosition": 4 // number, index of last character to show/hide
} // this is an array so more character range objects can be added
]
}
}
Profile Item Types
Text: 0
Email: 1
Number: 2
Date: 3
PhoneNumber: 4
CheckBox: 5
Currency: 6
Memo: 7
PresetValues:8
Percentage: 9
HiddenText: 10
Create a Profile
POST: /api/Profile?accountId={account id here}
Creates a new profile.
Example Body:
{
"id": {profile id here} // only required for update calls, in a create call, the response will populate this value
"name": {name of the profile here},
"profileItems": [ // array of profile items to associate with the profile, these should be in the order you want them to appear when this profile is applied to an item
{
"id": {profile item id here},
"include": {true or false}, // this needs to be set to true or the profile item will not be associated with this profile
"required": {true or false}, // indicates whether this profile item is required or not
"joinID": {join id here} // only required for update profile call, and when this profile item is already previously associated with this profile (otherwise set to 0). This property will be populated in the response when you create, get, or update a profile using the api.
},
{
"id": {profile item id here},
"include": {true or false},
"required": {true or false},
"joinID": {join id here}
} // this is an array so you can add more profile items to this array as needed
]
}
Update a Profile
PUT: /api/Profile/{profile id here}?accountId={account id here}
Updates an existing profile
*see example body of ‘Create a Profile’
Get Profile Data Applied to a Node
GET: /api/NodeProfile/Direct/{nodeID}
This will return all the profile data applied to a specific node. The profileId property indicates what profile is applied to this node. The profileItems property is an array of applied profile item values.
Each profile item in the profileItems array is basically a key value pair where the profileItemId property is the key, and the value property is the value.
Apply Profile Data to a Node
POST: /api/NodeProfile/Update
This will update the applied profile data on the node. Properties that need to be populated on the object in the object in the body of the request are:
NodeId: the id of the node to which profile data will
ProfileId: the id of the profile you wanted applied to this node. This can be null
ProfileItems: array of key value pairs of data that will be applied to the node
each item in the array should have the following properties populated (in the case of a preset value type profile item, you need to populate the presetValueId property rather than the value property)
id: profileItemId
value: the value that will be set
Note: this will overwrite all existing metadata. It will not merge with what is currently applied to the node. You may want to see what profile data already exists on the node, before making this call.
Apply Profile Data to a Multiple Nodes
POST: /api/NodeProfileBatch/Update
Update the applied metadata on a set of nodes.
Example Body:
[
{
"clientIdentifier": "an identifier you can use to associate the response object with this object"
"batchObject": {
"profileID": {profile id goes here},
"nodeID": {node id goes here},
"profileItems": [
{
"id" = {profile item id goes here},
"value" = "{value goes here}"
},
{
"id" = {next profile item id goes here},
"value" = "{next value goes here}"
}
] // this is an array so you can add more profile item values as needed
}
}
] // this is an array so you can add more profile item values for more nodes if needed
A couple of details about some of the properties in the body
clientIdentifier, a way for you to associate the response objects that come back with the objects you provide in the body
batchObject, a nodeProfile object, the same object expected by the endpoint to set profile data on a single item (PUT /api/NodeProfile).
The response body returns a list of response objects basically identical to the body objects except there is a third property named "error" that will be populated if any error occurred while processing that particular item.
CSV Import
Import CSV to create / update users, groups, folders, permissions, notification settings, and profile data.
POST: /api/CsvImportExport
Example Body:
{
"accountID": 12345, // number, the id of the account
"csvText": "", // string, content of the csv file
"ignoreTopRow": true, // boolean, indicates if the first row has headers
"createRoles": false, // boolean, indicates if roles (users or groups) should be created
"createRoleType": 2, // number, what type of role should be created (2 for users, 3 for groups)
"userLicense": 2, // nullable number, if creating user roles, the type of license they should be assigned (Unassigned = -1, Full = 1, Guest = 2)
"roleNameColumn": 1, // nullable number, column number of the column to be used to name the created roles
"groupRoleName": "some group name", // string, name of the group to which all created roles will be added to. Set to null if you don't want created roles added to a group. If a group with this name doesn't exist, a new group with that name will be created.
"createNodes": true, // boolean, indicates whether or not you want folders to be created for each row in the csv
"nodeNameColumn": 2 // nullable number, column number of the column to be used to name the created folders
"containerNodeID": 54321, // nullable number, the id (node id) of the directory in which to create folders
"importPermissions": { // permission set that created roles will get on the corresponding created folder
"view": true, // boolean, indicates if the created role will have view permission on the created folder
"download": true, // boolean, indicates if the created role will have download permission on the created folder
"write": true, // boolean, indicates if the created role will have write permission on the created folder
"del": false // boolean, indicates if the created role will have delete permission on the created folder
},
"notificationSettings": { // the types of notifications created roles will receive about their related folder
"uploadNotification": true, // boolean, indicates the role will receive notifications when files are uploaded to the folder
"downloadNotification": false, // boolean, indicates the role will receive notifications when files are downloaded from the folder
"deleteNotification": false // boolean, indicates the role will receive notifications when items are delete from the folder
},
"nodeProfileSettings": { // settings related to setting profile data on created folders
"profileId": 321, // nullable number, id of the profile to be applied to created folders
"overwrite": ,// boolean, indicates if an existing profile on the folder should be overwritten
"profileItemToHeaderMap": { // dictionary, key is profile item id, value is column number that will map to that profile item
"987": 1,
"789": 2,
"098": 3
}
},
"roleProfileSettings": { // settings related to setting profile data on created roles
"profileId": 123, // nullable number, id of the profile to be applied to created folders
"overwrite": true, // boolean, indicates if an existing profile on the role should be overwritten
"profileItemToHeaderMap": { // dictionary, key is profile item id, value is column number that will map to that profile item
"987": 1,
"789": 2,
"098": 3
}
}
}
Walkthrough:
CSV Import is found under "Utilities" which can be found in the Admin area of our Old web experience, or in All Features of our new Revver web experience.
Within our web experience there are a few options when Importing.
1. You are able to Create Users or Groups or Users created then placed in a group.
2. The other option is to create directories (node structure, drawers/folders) in a given location.
The Create Users or Groups option has several items you can apply. After selecting the type of Role you will create (User/Group) you also need to determine what type of User they are (License) and where their login Email will be provided from the Imported csv.
You can also add these new users being created into a new group which you can name.
I also had to create a Profile and Profile Items to match the data I want from the csv, before I'm able to use the "User Profile" or later in the directory area "Directory Profile".
Once your profile is created, you just need to map the relevant Profile Items to the CSV columns.
The Create Directories option has a few details to fill out as well if selected. You need to determine what from the CSV will name the directories. So for this example I picked "id" which will name all my folders as "1", "2" etc.
You need to pick the area these new directories will be created in. This example will create Folders in the "CSV Test" drawer.
I also decided to place Profile data and just like the User example above, you need to have created the Profile and Profile Items ahead of time and map them accordingly.
There are additional options at the bottom which are "Permissions and Notifications" which is dependent on you selecting both Users and Directories. This will grant Item Permissions for the newly created Directories for the newly created Users. Same goes for the Notifications, this will notify the user by Email that certain actions have occurred in the directory.
A report is generated in our web experience that goes over a few of the details of the import, I also downloaded the report and added it to this email.
From this web example I pulled open my browser's DevTools and watched the API call from our frontend web experience to our backend servers. I'm doing this from our Staging environment, the URL will be different for our Production environment.
And here is the "Parsed"/beautified JSON body. Everything that is found in this JSON body is from all the options I selected during the Import process from the web experience. There are a few items that are handled under the covers like the majority of the IDs. The numbers under the profileItemToHeaderMap like "222055" are the individual Profile Item ids and to which column they map to in the CSV, so "1" would be "first_name" from the csv. Also the csvText is the full text from the document
The report in the web experience is the response from the API request
Need Help?
Contact Technical Services
To get in contact with our technical services team for assistance select the chat bubble in the lower right corner. Initially you will connect with our AI bot Fin. If Fin is unable to answer your question please select the talk to a person button below his answer to speak with a member of our technical services department. Fin can also transfer you to a live representative at any time, just ask Fin to "transfer me to a live technician".