Create document resource
Create a document (FILE-type) resource in the Trust Knowledge Base. Accepts the document as a multipart/form-data upload.
Example: send multipart/form-data with a required file (e.g. PDF)
and title; optional fields include description, customerVisibility,
downloadPermission, isUsedInQuestionnaires (“true”/“false”),
expirationDate (ISO 8601), tags (JSON array string), categoryId,
and ownerAssignment (JSON object string).
curl --request POST \
--url https://api.vanta.com/v1/knowledge-base/resources/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form 'title=<string>' \
--form 'description=<string>' \
--form 'ownerAssignment=<string>' \
--form 'customerVisibility=<string>' \
--form 'downloadPermission=<string>' \
--form 'isUsedInQuestionnaires=<string>' \
--form 'expirationDate=<string>' \
--form 'tags=<string>' \
--form 'categoryId=<string>'import requests
url = "https://api.vanta.com/v1/knowledge-base/resources/documents"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"title": "<string>",
"description": "<string>",
"ownerAssignment": "<string>",
"customerVisibility": "<string>",
"downloadPermission": "<string>",
"isUsedInQuestionnaires": "<string>",
"expirationDate": "<string>",
"tags": "<string>",
"categoryId": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('title', '<string>');
form.append('description', '<string>');
form.append('ownerAssignment', '<string>');
form.append('customerVisibility', '<string>');
form.append('downloadPermission', '<string>');
form.append('isUsedInQuestionnaires', '<string>');
form.append('expirationDate', '<string>');
form.append('tags', '<string>');
form.append('categoryId', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.vanta.com/v1/knowledge-base/resources/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vanta.com/v1/knowledge-base/resources/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vanta.com/v1/knowledge-base/resources/documents"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vanta.com/v1/knowledge-base/resources/documents")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vanta.com/v1/knowledge-base/resources/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "507f1f77bcf86cd799439021",
"type": "FILE",
"title": "SOC 2 Type II Report",
"description": "Annual SOC 2 Type II report covering 2024.",
"fileUrl": "https://vanta-uploaded-documents.s3.amazonaws.com/507f1f77bcf86cd799439021?X-Amz-Expires=3600&X-Amz-Signature=...",
"customerVisibility": "REQUEST_ACCESS",
"downloadPermission": "VIEW_AND_DOWNLOAD",
"isUsedInQuestionnaires": true,
"ownerAssignment": {
"type": "User",
"id": "507f1f77bcf86cd799439041",
"displayName": "Alex Rivera"
},
"expirationStatus": "CURRENT",
"expirationDate": "2025-12-31T00:00:00.000Z",
"lastUpdated": "2024-12-15T17:42:11.000Z",
"lastVerified": "2024-12-20T09:00:00.000Z",
"tags": [
{
"categoryId": "507f1f77bcf86cd799439011",
"tagId": "507f1f77bcf86cd799439013"
}
],
"categoryId": "507f1f77bcf86cd799439051"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Title of the document resource.
1Description of the document resource.
Owner to assign as a JSON string: {"type":"User","id":""}.
Customer visibility on the Trust Center: PRIVATE | SHAREABLE | REQUEST_ACCESS | PUBLIC.
Trust Center download permission: VIEW_ONLY | VIEW_AND_DOWNLOAD.
Whether to use this resource for Questionnaire Automation answer generation ("true" / "false").
Expiration date in ISO 8601.
Tags as a JSON array: [{"categoryId":"","tagId":""}].
Trust Center category id to associate this resource with. Only
applied when customerVisibility is REQUEST_ACCESS or PUBLIC;
other visibilities don't place the resource on the Trust Center, so
the category is ignored. Pass an unknown id to fall back to
uncategorized.
Response
Ok
FILE Presigned S3 URL for the underlying document. Expires after 1 hour due to AWS IAM Role limitations on presigned URL lifetimes. Re-fetch the resource to obtain a fresh URL once this one expires.
PUBLIC, SHAREABLE, PRIVATE, REQUEST_ACCESS, null VIEW_ONLY, VIEW_AND_DOWNLOAD, null Show child attributes
Show child attributes
Customer-facing expiration status used by knowledge-base API responses
(answer library entries and resources). Derived from the persisted
expiresAt field at read time.
CURRENT, EXPIRED Show child attributes
Show child attributes
Trust Center category id the resource is currently filed under, or
null if uncategorized (or not on the Trust Center, which is the case
for PRIVATE / SHAREABLE resources).
Related topics
Create Trust Center documentCreate a custom documentCreate document linkUpdate document resourceCreate webpage resourceWas this page helpful?
curl --request POST \
--url https://api.vanta.com/v1/knowledge-base/resources/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form 'title=<string>' \
--form 'description=<string>' \
--form 'ownerAssignment=<string>' \
--form 'customerVisibility=<string>' \
--form 'downloadPermission=<string>' \
--form 'isUsedInQuestionnaires=<string>' \
--form 'expirationDate=<string>' \
--form 'tags=<string>' \
--form 'categoryId=<string>'import requests
url = "https://api.vanta.com/v1/knowledge-base/resources/documents"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"title": "<string>",
"description": "<string>",
"ownerAssignment": "<string>",
"customerVisibility": "<string>",
"downloadPermission": "<string>",
"isUsedInQuestionnaires": "<string>",
"expirationDate": "<string>",
"tags": "<string>",
"categoryId": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('title', '<string>');
form.append('description', '<string>');
form.append('ownerAssignment', '<string>');
form.append('customerVisibility', '<string>');
form.append('downloadPermission', '<string>');
form.append('isUsedInQuestionnaires', '<string>');
form.append('expirationDate', '<string>');
form.append('tags', '<string>');
form.append('categoryId', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.vanta.com/v1/knowledge-base/resources/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vanta.com/v1/knowledge-base/resources/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vanta.com/v1/knowledge-base/resources/documents"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vanta.com/v1/knowledge-base/resources/documents")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vanta.com/v1/knowledge-base/resources/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ownerAssignment\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"customerVisibility\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"downloadPermission\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"isUsedInQuestionnaires\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"expirationDate\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "507f1f77bcf86cd799439021",
"type": "FILE",
"title": "SOC 2 Type II Report",
"description": "Annual SOC 2 Type II report covering 2024.",
"fileUrl": "https://vanta-uploaded-documents.s3.amazonaws.com/507f1f77bcf86cd799439021?X-Amz-Expires=3600&X-Amz-Signature=...",
"customerVisibility": "REQUEST_ACCESS",
"downloadPermission": "VIEW_AND_DOWNLOAD",
"isUsedInQuestionnaires": true,
"ownerAssignment": {
"type": "User",
"id": "507f1f77bcf86cd799439041",
"displayName": "Alex Rivera"
},
"expirationStatus": "CURRENT",
"expirationDate": "2025-12-31T00:00:00.000Z",
"lastUpdated": "2024-12-15T17:42:11.000Z",
"lastVerified": "2024-12-20T09:00:00.000Z",
"tags": [
{
"categoryId": "507f1f77bcf86cd799439011",
"tagId": "507f1f77bcf86cd799439013"
}
],
"categoryId": "507f1f77bcf86cd799439051"
}