> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreflux.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Veeva Vault Api

> 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

Technical Preview

## 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).

> [!NOTE]
>
> 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 with `template` and `metadata`) from the broker, then deploy the connector:

```bash theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
mosquitto_pub -t '$SYS/Coreflux/Command' -m "-routeCode VEEVA_VAULT"
```

The deployable connector from the REST API app, with `BASE_ADDRESS` already filled in:

```lot theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
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}"
```

Deploy it with `-addRoute` (do not include `ADD METADATA`).

## Usage example

Call `ValidateSessionUser` by publishing a JSON payload to its request topic, and read the reply on the response topic:

```bash theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
mosquitto_sub -t 'mes/veeva-vault/session-user/get/response' &
mosquitto_pub -t 'mes/veeva-vault/session-user/get' -m '{"authorization": "<authorization>"}'
```

## Related

* [REST API Connectors](/latest/lot-language/routes/rest-api-routes)
* [REST API Apps catalog](/latest/lot-language/routes/rest-api-apps)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.