Vidi is the only enterprise offering of native PDF tracking for security and analytics. We enable a better understanding of how documents are read and by who, without breaking the portability of a PDF document itself.
Supporting our developers and users is extremely important to us. If you have any feedback, questions, and or issues we are here for you.
Contact us with support@vidi.fyi
This chapter focuses on a quick overview of our most valuable features.
While document formats have varied over the past decade, PDF has continued to remain popular in a host of industries. They remain a standard in document portability, storage, feature richness, and accessibility.
Document tracking solutions come in two distinct flavors. First and the most popular being web based where the document is in the format of a webpage. The second is a DRM plugin installed on the viewer device. Both of these options break the chain of trust as to what a PDF is and how it’s read. Webpages are not a PDF, they cannot be saved or stored/processed similar to the native file.
Vidi tracks the native file itself, we enable tracking within Adobe Acrobat without any additional required software. It enables enterprises to use preferred file storage solutions (SharePoint, HubSpot) without any infrastructure/process changes.
Native tracking offers a frictionless experience in both security and analytics of native PDF documents.
Tracking availability while is robust, is not always possible due to device environments. In use cases where the contents of the PDF should only be accessed when tracked, we include a toolset named Forced Tracking Mode.
When Forced Tracking Mode is enabled via the Dashboard or API, the document’s contents are only accessible when the document successfully connects to Vidi services and tracking initiates. This ensures content can not be viewed on non-tracked PDF readers, offline reading, and or if the user does not agree to tracking.
This feature can include a custom error message if the contents are not accessible. See Modify Document Settings within the Documents REST API.
User communication and transparency is important. We have included a customizable dialog box that enables custom text, icon choice, and more precise enable/disable of tracking.
For enabling and customizing the privacy dialog box, see Modify Document Settings within the Documents REST API.
When Forced Tracking Mode is enabled, error messages are displayed on non-tracked PDF readers. We support various variables and BBCode formatting.
Currently only URL BBCode is supported.
Example:
[url=https://vidi.fyi]Our Website[/url]
| Variable | Description | Example |
|---|---|---|
| #WebView | Link to tracked web view of PDF | documentloading.com/viewer/{id generated on PDF conversion}} |
| #ID | ID of PDF | {id generated on PDF conversion} |
| #PDFName | Name of PDF including file extension | example.pdf |
| #OpenAcrobat | Open Acrobat from url experimental | none |
See Modify Document Settings within the Documents REST API.
No specific method of PDF tracking fits all device ecosystems or goal requirements. This section is an overview of differing tracking methods and their intended use case.
Native PDF tracking utilizes features mostly only available in fully featured PDF readers such as Adobe Acrobat.
This is a compromise of tracking for keeping the document in its native format and it’s portability as a file. Using Forced Tracking Mode, this can mitigate the lack of tracking availability in most readers.
Using a web-based PDF reader, we enable PDF tracking within the browser. This provides a frictionless experience of opening a document via a link and a highly robust tracking solution that works across all platforms and devices.
The majoring difference is tracking is done on the reader level, instead of within the PDF itself.
For finding endpoints for a tracked PDF, see Document Endpoints within the Documents REST API.
Combining both native and web tracking produces a highly resilient methodology capable of all devices and ensuring the document is tracked when saved to the device itself.
Users are able to view the PDF within a browser, while also downloading it to their local device. Tracking persists allowing for a full contextual story of a document’s journey viewed in native PDF readers.
List of data obtained via sessions/events.
| Node | Description |
|---|---|
ip |
IPv4/v6 address of viewer |
user_agent |
User agent, viewer device info |
hostname |
Domain attached to IP, can be IPv4/v6 |
created_at |
Timestamp generated at creation of session |
updated_at |
Timestamp updated when change within session occurs |
| Event | Description |
|---|---|
viFrame |
Both initial and keep alive event |
viPrint |
Registered when a preview/physical print event occurs |
viLink |
Registered when a URL is clicked |
Both initial and keep alive event. viFrame is fired within every 3-5 seconds during a session.
| Node | Description |
|---|---|
id |
Event id |
session_id |
Session UUID |
type |
Event type |
currentPage |
Current page in view of the PDF viewer, starting page is 0 |
currentZoom |
Current zoom level of PDF viewport in percent |
currentZoomType |
Name of current zoom type reflected by currentZoom Due to the inconsistency of Acrobat vs browser, the zoom name type can vary and possibly be null in web sessions |
location |
File path document was viewed at location often contains viewers OS user account, only present if viewed in Adobe Acrobat otherwise browser URL or null |
pageViewRect |
The pages rectangle expressed in lower-left x, lower-left y, upper-right x, upper-right y pageViewRect can be used to determine page size at time of viewing, it’s coordinates are not based on screenspace. |
mouseX |
Mouse x position at time of event, coordinate system is within pageViewRect |
mouseY |
Mouse y position at time of event, coordinate system is within pageViewRect |
created_at |
Timestamp generated at creation of event |
updated_at |
Timestamp updated when change within event occurs |
[
{
"events": [
{
"id": "f04ca01136454744beb958272ca5b328",
"session_id": "9e324f4a99804bde9affd58a1318f314",
"type": "viFrame",
"event": {
"mouseX": 300,
"mouseY": -1684,
"currentPage": 0,
"currentZoom": 125,
"pageViewRect": "127, -1417, 1137, 2846",
"currentZoomType": "auto"
},
"created_at": "2020-01-14 22:44:09",
"updated_at": "2020-01-14 22:44:09"
}
]
}
]
Registered when a print preview or physical print event occurs.
Some browsers include inconstancies where print preview and printing can fire simultaneously multiple times within a short time span. Printing events in web browser sessions should only be understood as either printed or not printed.
If print event was within Acrobat, the print type can be trusted with accuracy.
| Node | Description |
|---|---|
id |
Event id |
session_id |
Session UUID |
type |
Event type |
printType |
Print type 0 - Print error 1 - Print preview 2 - Print job |
created_at |
Timestamp generated at creation of event |
updated_at |
Timestamp updated when change within event occurs |
[
{
"events": [
{
"id": "4019f0251232c89b8646b9fb1af9c2ce",
"session_id": "454afbc06c8eee0a8e2007c593c1d34b",
"type": "viPrint",
"event": {
"printType": 1
}
},
"created_at": "2020-01-14 22:44:09",
"updated_at": "2020-01-14 22:44:09"
]
}
]
Registered when a user interacts with a PDF link for both internal/external URLs. The event is reported with the PDF object ID as designated within the structure of the PDF.
| Node | Description |
|---|---|
id |
Event id |
session_id |
Session UUID |
type |
Event type |
annoId |
PDF Object ID |
created_at |
Timestamp generated at creation of event |
updated_at |
Timestamp updated when change within event occurs |
[
{
"events": [
{
"id": "40040ed37b58373b80039df5c88f1b68",
"session_id": "454afbc06c8eee0a8e2007c593c1d34b",
"type": "viLink",
"event": {
"annoId": "2899R"
}
},
"created_at": "2020-01-14 22:44:09",
"updated_at": "2020-01-14 22:44:09"
]
}
]
Vidi utilizes a static token generated with your account for API access. Authorization is required as a Bearer token defined in the consumers header.
Without authorization, expect a 401 – Unauthorized/403 – Forbidden.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/
Multiple users is a planned feature, all actions are defaulted to DefaultUser.
List users associated with token.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/users/
[
{
"Users": "DefaultUser"
}
]
This section is specific to document actions.
List global settings for future tracked documents.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/settings/
[
{
"ForcedTracking": false,
"ForcedTrackingErrorMsg": "Denied Access\nUse Adobe Acrobat",
"ForcedTrackingCheckingCon": "Getting document...",
"ForcedTrackingDisabledCon": "You are not connected to the internet.",
"PrivacyDialog": false,
"PrivacyDialogTitle": null,
"PrivacyDialogIconType": 2,
"PrivacyDialogMsg": null
}
]
Modify global settings that effect all future tracked documents. Documents that are processed before a change will remain unaffected.
| Name | Possible Type | Description |
|---|---|---|
ForcedTrackingErrorMsg |
string, null |
Message displayed when Forced Tracking Mode is enabled and PDF can not be tracked. \n, variables, and BBCode are supported. |
ForcedTrackingCheckingCon |
string, null |
Message displayed when Forced Tracking Mode is enabled and PDF is checking tracking availability. \n, variables, and BBCode are supported. |
ForcedTrackingDisabledCon |
string, null |
Message displayed when Forced Tracking Mode is enabled and tracking is not available. \n, variables, and BBCode are supported. |
PrivacyDialog |
bool |
Toggles GDPR Privacy Dialog. |
PrivacyDialogTitle |
string, null |
Title of GDPR Privacy Dialog. |
PrivacyDialogMsg |
string, null |
Text within GDPR Privacy Dialog. Newline characters, BBCode are not supported. |
PrivacyDialogIconType |
int |
Icon of GDPR Privacy Dialog 0 – Error (default) 1 – Warning 2 – Question 3 – Status Note: Mac OS, no distinction is made between warnings and questions. |
$ curl -X POST -H "Accept: application/json" -H "Authorization: Bearer {token}" -d "{ "ForcedTracking": true }" https://api.vidi.fyi/v1/documents/settings/
[
{
"ForcedTracking": true,
"ForcedTrackingErrorMsg": "Denied Access\nUse Adobe Acrobat",
"ForcedTrackingCheckingCon": "Getting document...",
"ForcedTrackingDisabledCon": "You are not connected to the internet.",
"PrivacyDialog": false,
"PrivacyDialogTitle": null,
"PrivacyDialogIconType": 2,
"PrivacyDialogMsg": null
}
]
List documents associated with user.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/
[
{
"Documents":[
{
"id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"original_name": "Swan.pdf",
"nick_name": null,
"updated_at":{
"date": "2020-01-14 22:09:09.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"created_at":{
"date": "2020-01-14 19:58:33.000000",
"timezone_type": 3,
"timezone":"UTC"
}
},
{
"id":"nd0afecb07c15b5093d858cbegd4e2ba",
"original_name": "Ant.pdf",
"nick_name": null,
"updated_at": {
"date": "2020-01-14 17:52:53.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"created_at":{
"date": "2019-02-20 07:12:14.000000",
"timezone_type": 3,
"timezone": "UTC"
}
}
]
}
]
Upload document
| Property | Description |
|---|---|
document |
location of PDF |
$ curl -X POST -H "Authorization: Bearer {token}" -F "document=@/Users/Jacob/Docs/sample.pdf" https://api.vidi.fyi/v1/documents/
[
{
"Documents":[
{
"id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"original_name": "Swan.pdf",
"nick_name": null,
"updated_at":{
"date": "2020-01-14 22:09:09.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"created_at":{
"date": "2020-01-14 19:58:33.000000",
"timezone_type": 3,
"timezone":"UTC"
}
}
]
}
]
Retrieve metadata associated with document.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/
[
{
"Documents":[
{
"id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"original_name": "Swan.pdf",
"nick_name": null,
"updated_at":{
"date": "2020-01-14 22:09:09.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"created_at":{
"date": "2020-01-14 19:58:33.000000",
"timezone_type": 3,
"timezone":"UTC"
}
}
]
}
]
Delete metadata and document associated with document.
If successful, will return 200.
$ curl -X DELETE -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/
Returns tracked PDF (binary blob) using the current global settings.
$ curl -X GET -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/pdf/
List of endpoints that enable tracking. This can be Native PDF Tracking and or Web Tracking.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/endpoints/
[
{
"Endpoints": [
"pdf",
"https://documentloading.com/viewer/9bf33ce0392a43bd89b40fcb4674a4a2"
]
}
]
Sessions are the instance of time a viewer reads a document. They are correlated by either document id or the persistent viewer id.
If a user closes a document but reopens it within 15 minutes, this will be considered the same session.
List sessions associated with document.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/sessions
[
{
"Sessions":[
{
"id": "3159e119ccd64bafa03057f136a78554",
"doc_id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"viewer_id": "1fdf44c801094655a327df95fc893cb2",
"ip": "172.93.12.18",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",
"hostname": "172.93.12.18",
"created_at": "2020-01-14 20:02:24",
"updated_at": "2020-01-14 21:06:45"
},
{
"id": "565154b6f7e842bb93153cf59c4f9226",
"doc_id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"viewer_id": "a9da1a2e222747b9ba973971c5174338",
"ip": "172.93.12.18",
"user_agent": "Mozilla/3.0 (compatible; Acrobat Annots 19.21.20058 )",
"hostname": "172.93.12.18",
"created_at": "2020-01-14 20:00:24",
"updated_at": "2020-01-14 20:01:13"
}
]
}
]
Retrieve metadata associated with session.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/sessions/{id}/
[
{
"Sessions":[
{
"id": "3159e119ccd64bafa03057f136a78554",
"doc_id": "9bf33ce0392a43bd89b40fcb4674a4a2",
"viewer_id": "1fdf44c801094655a327df95fc893cb2",
"ip": "172.93.12.18",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",
"hostname": "172.93.12.18",
"created_at": "2020-01-14 20:02:24",
"updated_at": "2020-01-14 21:06:45"
}
]
}
]
Events are a mixture of initial, keep alive, and user events that occur through the duration of a session. You can read more about event types and data captured here.
List events associated with session.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/sessions/{id}/events/
[
{
"events": [
{
"id": "f04ca01136454744beb958272ca5b328",
"session_id": "9e324f4a99804bde9affd58a1318f314",
"type": "viFrame",
"event":{
"mouseX": 300,
"mouseY": -1684,
"currentPage": 0,
"currentZoom": 125,
"pageViewRect": "127,-1417,1137,2846",
"currentZoomType": "auto"
},
"created_at": "2020-01-14 22:44:09",
"updated_at": "2020-01-14 22:44:09"
},
{
"id": "96c44871f65146c79f11779e300a8b58",
"session_id": "9e324f4a99804bde9affd58a1318f314",
"type": "viFrame",
"event": {
"mouseX": 1500,
"mouseY": -1680,
"currentPage": 0,
"currentZoom": 125,
"pageViewRect": "127,-1417,1137,2846",
"currentZoomType": "auto"
},
"created_at": "2020-01-14 22:44:04",
"updated_at": "2020-01-14 22:44:04"
}
]
}
]
Retrieve metadata associated with event.
$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer {token}" https://api.vidi.fyi/v1/documents/{id}/sessions/{id}/events/{id}/
[
{
"events": [
{
"id": "96c44871f65146c79f11779e300a8b58",
"session_id": "9e324f4a99804bde9affd58a1318f314",
"type": "viFrame",
"event": {
"mouseX": 1343,
"mouseY": -1680,
"currentPage": 0,
"currentZoom": 125,
"pageViewRect": "127,-1417,1137,2846",
"currentZoomType": "auto"
},
"created_at": "2020-01-14 22:44:04",
"updated_at": "2020-01-14 22:44:04"
}
]
}
]