curl --request POST \
--url https://pria.praxislxp.com/api/user/bulk/action \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"allVaults": true,
"institution": "<string>",
"mode": "full",
"target": "<string>"
}
'import requests
url = "https://pria.praxislxp.com/api/user/bulk/action"
payload = {
"ids": ["<string>"],
"allVaults": True,
"institution": "<string>",
"mode": "full",
"target": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ids: ['<string>'],
allVaults: true,
institution: '<string>',
mode: 'full',
target: '<string>'
})
};
fetch('https://pria.praxislxp.com/api/user/bulk/action', 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://pria.praxislxp.com/api/user/bulk/action",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'<string>'
],
'allVaults' => true,
'institution' => '<string>',
'mode' => 'full',
'target' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://pria.praxislxp.com/api/user/bulk/action"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pria.praxislxp.com/api/user/bulk/action")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/bulk/action")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyBulk action on files or collections
curl --request POST \
--url https://pria.praxislxp.com/api/user/bulk/action \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"allVaults": true,
"institution": "<string>",
"mode": "full",
"target": "<string>"
}
'import requests
url = "https://pria.praxislxp.com/api/user/bulk/action"
payload = {
"ids": ["<string>"],
"allVaults": True,
"institution": "<string>",
"mode": "full",
"target": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ids: ['<string>'],
allVaults: true,
institution: '<string>',
mode: 'full',
target: '<string>'
})
};
fetch('https://pria.praxislxp.com/api/user/bulk/action', 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://pria.praxislxp.com/api/user/bulk/action",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'<string>'
],
'allVaults' => true,
'institution' => '<string>',
'mode' => 'full',
'target' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://pria.praxislxp.com/api/user/bulk/action"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pria.praxislxp.com/api/user/bulk/action")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/bulk/action")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"<string>\"\n ],\n \"allVaults\": true,\n \"institution\": \"<string>\",\n \"mode\": \"full\",\n \"target\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
JWT token passed in authorization header
Body
Ignored (may be empty) for emptyTrash and emptyTrashPreview.
upload, collection For type=upload: delete moves files to the Trash; restore returns trashed files to their previous state (a file whose collection no longer exists returns to the vault root); purge permanently deletes the given trashed files; emptyTrash permanently deletes a whole Trash scope (see allVaults, institution). For type=collection: delete removes the collections and their sub-collections and moves every file in them that is not already in the Trash to the Trash. A personal collection (no Digital Twin) may be acted on only by its owner or a super admin. Two read-only previews change nothing and count exactly what the real action acts on: emptyTrashPreview (type=upload, same allVaults/institution as emptyTrash) answers count; deleteCollectionsPreview (type=collection, same ids as delete) answers trashedFileCount, collectionCount, descendantCollectionCount, with nested selections counted once. A request carrying a dryRun field is refused with 400. include and exclude (files, or every file of the given collections and their sub-collections) add files to, or take them out of, what the Digital Twin searches. Excluding a file stops its "keep if unused" countdown; including it starts a new one from now. A restored file that returns to "included" starts a new period when its countdown was running before it was moved to the Trash. reprocess sends files back through processing; they come out included, and a file that was not included starts its period. longevity (type=upload) changes how long files are kept while they are not used — see target.
delete, include, exclude, reprocess, moveToCollection, makePublic, makePrivate, makeConfidential, removeConfidential, longevity, restore, purge, emptyTrash, emptyTrashPreview, deleteCollectionsPreview emptyTrash and emptyTrashPreview only. Empty the cross-vault Trash: the caller's personal Trash, plus the home Digital Twin's Trash when the caller holds files.delete there, plus account-shared Trash files of the other twins in the same account when the caller may delete those. Other members' confidential files are never included.
emptyTrash and emptyTrashPreview only. A 24-character Digital Twin id (anything else is refused with 400). Empty that Digital Twin's Trash (requires files.delete there); other members' confidential files are not included. Without allVaults or institution, emptyTrash empties the personal Trash.
Applies only to the reprocess action. Controls which part of the ingestion pipeline reruns for each file: full (re-chunk + re-embed + rebuild Knowledge Graph), embed (re-embed existing chunks in place), or kag (rebuild the Knowledge Graph only, leaving chunks/vectors intact). Defaults to full when omitted. An explicit invalid value is rejected with 400.
full, embed, kag moveToCollection: the target collection ID (a 24-character id string). The caller must be allowed to edit the target (a personal collection: its owner or a super admin; a Digital Twin collection: files.edit there) and every file must be in the target's vault. longevity: an object { mode, days }. set with days N keeps each file until it has not been used for N days — every use of a file starts its period again. The countdown starts now for files that are included in search; an excluded file starts counting when it is included. set with days 0, or mode forever, keeps the files for good. extend with days 7, 30 or 90 adds that many days to a countdown that is running.
Response
Bulk action completed. emptyTrash returns purgedCount; emptyTrashPreview returns count (and preview: true); collection delete returns trashedFileCount (alias deletedFileCount), collectionCount and descendantCollectionCount; deleteCollectionsPreview returns the same counts with preview: true.
Was this page helpful?