Overview
Client-mode REST API connector for Veeva Vault QMS and QualityDocs: query effective SOPs and controlled documents, read document versions, renditions and lifecycle actions, query and read quality events, read object metadata, picklists and audit trails, and turn a line alarm into a deviation, through the Vault REST API v26.2. This is one of the templates in the Veeva Vault (QMS, QualityDocs) REST API app (veeva-vault). Deploy it alongside the other connectors of that app when they depend on each other (for example a token connector plus an API connector).
Not yet verified against the live vendor API: No Veeva Vault DNS, API access token or Vault user on the factory box (no VEEVA_VAULT_* variables) and Veeva offers no public sandbox Vault; the ready gate needs an authenticated live call (CreateSession or an API access token, then QueryDocuments and a create on a test object, or a broker MQTT round trip). Mock-server checks, the public login.veevavault.com discovery call and lot_lint do not clear the gate.
Auth
Authorization header from payload field authorization: an API access token as ‘Bearer veeva-vault-…’ (recommended) or a Vault session ID sent as is. Session from VeevaVaultAuth CreateSession (form username + password, reply sessionId / userId / vaultIds) or VeevaVaultLogin CreateOAuthSession (Bearer IdP access token + profile id, form vaultDNS + client_id). KeepAlive extends a session. DiscoverAuthType (public) tells password vs SSO users apart. Auth headers used by the template:Authorization: {value.json.authorization}.
Template parameters
| Placeholder | Type | Description | Required |
|---|---|---|---|
RouteName | string | Name of the Veeva Vault Api connector | no |
BaseUrl | string | Veeva Vault Api base URL without trailing slash (e.g. https://YOUR_VAULT_DNS) | yes |
BASE_ADDRESS default: https://YOUR_VAULT_DNS.
Events
| Event | Method | Endpoint | Request topic | Response topic | Payload fields |
|---|---|---|---|---|---|
ValidateSessionUser | GET | /api/v26.2/objects/users/me | mes/veeva-vault/session-user/get | mes/veeva-vault/session-user/get/response | authorization |
VqlQuery | POST | /api/v26.2/query | mes/veeva-vault/query/run | mes/veeva-vault/query/run/response | authorization, q |
QueryDocuments | POST | /api/v26.2/query | mes/veeva-vault/documents/query | mes/veeva-vault/documents/query/response | authorization, where |
QueryQualityEvents | POST | /api/v26.2/query | mes/veeva-vault/quality-events/query | mes/veeva-vault/quality-events/query/response | authorization, where |
GetDocument | GET | /api/v26.2/objects/documents/{value.json.doc_id} | mes/veeva-vault/document/get | mes/veeva-vault/document/get/response | authorization, doc_id |
GetDocumentVersions | GET | /api/v26.2/objects/documents/{value.json.doc_id}/versions | mes/veeva-vault/document-versions/get | mes/veeva-vault/document-versions/get/response | authorization, doc_id |
GetDocumentVersion | GET | /api/v26.2/objects/documents/{value.json.doc_id}/versions/{value.json.major}/{value.json.minor} | mes/veeva-vault/document-version/get | mes/veeva-vault/document-version/get/response | authorization, doc_id, major, minor |
GetDocumentRenditions | GET | /api/v26.2/objects/documents/{value.json.doc_id}/renditions | mes/veeva-vault/document-renditions/get | mes/veeva-vault/document-renditions/get/response | authorization, doc_id |
GetDocumentAttachments | GET | /api/v26.2/objects/documents/{value.json.doc_id}/attachments | mes/veeva-vault/document-attachments/get | mes/veeva-vault/document-attachments/get/response | authorization, doc_id |
GetDocumentUserActions | GET | /api/v26.2/objects/documents/{value.json.doc_id}/versions/{value.json.major}/{value.json.minor}/lifecycle_actions | mes/veeva-vault/document-actions/get | mes/veeva-vault/document-actions/get/response | authorization, doc_id, major, minor |
ListDocumentTypes | GET | /api/v26.2/metadata/objects/documents/types | mes/veeva-vault/document-types/list | mes/veeva-vault/document-types/list/response | authorization |
ListDocumentFields | GET | /api/v26.2/metadata/objects/documents/properties | mes/veeva-vault/document-fields/list | mes/veeva-vault/document-fields/list/response | authorization |
ListObjects | GET | /api/v26.2/metadata/vobjects | mes/veeva-vault/objects/list | mes/veeva-vault/objects/list/response | authorization |
GetObjectMetadata | GET | /api/v26.2/metadata/vobjects/{value.json.object_name} | mes/veeva-vault/object-metadata/get | mes/veeva-vault/object-metadata/get/response | authorization, object_name |
GetObjectFieldMetadata | GET | /api/v26.2/metadata/vobjects/{value.json.object_name}/fields/{value.json.field_name} | mes/veeva-vault/object-field-metadata/get | mes/veeva-vault/object-field-metadata/get/response | authorization, field_name, object_name |
GetObjectRecord | GET | /api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id} | mes/veeva-vault/object-record/get | mes/veeva-vault/object-record/get/response | authorization, object_name, record_id |
GetObjectRecordUserActions | GET | /api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id}/actions | mes/veeva-vault/object-record-actions/get | mes/veeva-vault/object-record-actions/get/response | authorization, object_name, record_id |
GetPicklistValues | GET | /api/v26.2/objects/picklists/{value.json.picklist_name} | mes/veeva-vault/picklist/get | mes/veeva-vault/picklist/get/response | authorization, picklist_name |
ListAuditTypes | GET | /api/v26.2/metadata/audittrail | mes/veeva-vault/audit-types/list | mes/veeva-vault/audit-types/list/response | authorization |
GetAuditTrail | GET | /api/v26.2/audittrail/{value.json.audit_trail_type}?start_date={value.json.start_date}&end_date={value.json.end_date} | mes/veeva-vault/audit-trail/get | mes/veeva-vault/audit-trail/get/response | audit_trail_type, authorization, end_date, start_date |
CreateQualityEvent | POST | /api/v26.2/vobjects/quality_event__qdm | mes/veeva-vault/quality-event/create | mes/veeva-vault/quality-event/create/response | authorization, request |
CreateObjectRecords | POST | /api/v26.2/vobjects/{value.json.object_name} | mes/veeva-vault/object-records/create | mes/veeva-vault/object-records/create/response | authorization, object_name, request |
InitiateObjectAction | POST | /api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id}/actions/{value.json.action_name} | mes/veeva-vault/object-action/run | mes/veeva-vault/object-action/run/response | action_name, authorization, form, object_name, record_id |
Deploy
Get the template card (JSON withtemplate and metadata) from the broker, then deploy the connector:
mosquitto_pub -t '$SYS/Coreflux/Command' -m "-routeCode VEEVA_VAULT"
BASE_ADDRESS already filled in:
DEFINE ROUTE VeevaVaultApi WITH TYPE REST_API
ADD REST_API_CONFIG
WITH BASE_ADDRESS "https://YOUR_VAULT_DNS"
WITH ENABLE_CLIENT "true"
WITH USE_SSL "true"
WITH REQUEST_TIMEOUT '60'
WITH DEFAULT_CONTENT_TYPE "application/json"
ADD EVENT ValidateSessionUser
WITH SOURCE_TOPIC "mes/veeva-vault/session-user/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/session-user/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/users/me"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT VqlQuery
WITH SOURCE_TOPIC "mes/veeva-vault/query/run"
WITH DESTINATION_TOPIC "mes/veeva-vault/query/run/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/query"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/x-www-form-urlencoded"
WITH BODY "q={value.json.q}"
ADD EVENT QueryDocuments
WITH SOURCE_TOPIC "mes/veeva-vault/documents/query"
WITH DESTINATION_TOPIC "mes/veeva-vault/documents/query/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/query"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/x-www-form-urlencoded"
WITH BODY "q=SELECT id, document_number__v, name__v, type__v, status__v, major_version_number__v, minor_version_number__v FROM documents WHERE {value.json.where}"
ADD EVENT QueryQualityEvents
WITH SOURCE_TOPIC "mes/veeva-vault/quality-events/query"
WITH DESTINATION_TOPIC "mes/veeva-vault/quality-events/query/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/query"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/x-www-form-urlencoded"
WITH BODY "q=SELECT id, name__v, status__v, date_occurred__qdm, severity__qdm FROM quality_event__qdm WHERE {value.json.where}"
ADD EVENT GetDocument
WITH SOURCE_TOPIC "mes/veeva-vault/document/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetDocumentVersions
WITH SOURCE_TOPIC "mes/veeva-vault/document-versions/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-versions/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}/versions"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetDocumentVersion
WITH SOURCE_TOPIC "mes/veeva-vault/document-version/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-version/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}/versions/{value.json.major}/{value.json.minor}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetDocumentRenditions
WITH SOURCE_TOPIC "mes/veeva-vault/document-renditions/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-renditions/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}/renditions"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetDocumentAttachments
WITH SOURCE_TOPIC "mes/veeva-vault/document-attachments/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-attachments/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}/attachments"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetDocumentUserActions
WITH SOURCE_TOPIC "mes/veeva-vault/document-actions/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-actions/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/documents/{value.json.doc_id}/versions/{value.json.major}/{value.json.minor}/lifecycle_actions"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT ListDocumentTypes
WITH SOURCE_TOPIC "mes/veeva-vault/document-types/list"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-types/list/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/objects/documents/types"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT ListDocumentFields
WITH SOURCE_TOPIC "mes/veeva-vault/document-fields/list"
WITH DESTINATION_TOPIC "mes/veeva-vault/document-fields/list/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/objects/documents/properties"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT ListObjects
WITH SOURCE_TOPIC "mes/veeva-vault/objects/list"
WITH DESTINATION_TOPIC "mes/veeva-vault/objects/list/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/vobjects"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetObjectMetadata
WITH SOURCE_TOPIC "mes/veeva-vault/object-metadata/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-metadata/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/vobjects/{value.json.object_name}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetObjectFieldMetadata
WITH SOURCE_TOPIC "mes/veeva-vault/object-field-metadata/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-field-metadata/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/vobjects/{value.json.object_name}/fields/{value.json.field_name}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetObjectRecord
WITH SOURCE_TOPIC "mes/veeva-vault/object-record/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-record/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetObjectRecordUserActions
WITH SOURCE_TOPIC "mes/veeva-vault/object-record-actions/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-record-actions/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id}/actions"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetPicklistValues
WITH SOURCE_TOPIC "mes/veeva-vault/picklist/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/picklist/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/objects/picklists/{value.json.picklist_name}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT ListAuditTypes
WITH SOURCE_TOPIC "mes/veeva-vault/audit-types/list"
WITH DESTINATION_TOPIC "mes/veeva-vault/audit-types/list/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/metadata/audittrail"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT GetAuditTrail
WITH SOURCE_TOPIC "mes/veeva-vault/audit-trail/get"
WITH DESTINATION_TOPIC "mes/veeva-vault/audit-trail/get/response"
WITH METHOD "GET"
WITH ENDPOINT "/api/v26.2/audittrail/{value.json.audit_trail_type}?start_date={value.json.start_date}&end_date={value.json.end_date}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD EVENT CreateQualityEvent
WITH SOURCE_TOPIC "mes/veeva-vault/quality-event/create"
WITH DESTINATION_TOPIC "mes/veeva-vault/quality-event/create/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/vobjects/quality_event__qdm"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/json"
WITH BODY "{value.json.request}"
ADD EVENT CreateObjectRecords
WITH SOURCE_TOPIC "mes/veeva-vault/object-records/create"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-records/create/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/vobjects/{value.json.object_name}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/json"
WITH BODY "{value.json.request}"
ADD EVENT InitiateObjectAction
WITH SOURCE_TOPIC "mes/veeva-vault/object-action/run"
WITH DESTINATION_TOPIC "mes/veeva-vault/object-action/run/response"
WITH METHOD "POST"
WITH ENDPOINT "/api/v26.2/vobjects/{value.json.object_name}/{value.json.record_id}/actions/{value.json.action_name}"
WITH HEADERS
ADD "Accept" "application/json"
ADD "Authorization" "{value.json.authorization}"
ADD "Content-Type" "application/x-www-form-urlencoded"
WITH BODY "{value.json.form}"
-addRoute (do not include ADD METADATA).
Usage example
CallValidateSessionUser by publishing a JSON payload to its request topic, and read the reply on the response topic:
mosquitto_sub -t 'mes/veeva-vault/session-user/get/response' &
mosquitto_pub -t 'mes/veeva-vault/session-user/get' -m '{"authorization": "<authorization>"}'

