Add Activity Logs
curl --request POST \
--url https://api.velt.dev/v2/activities/add \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"organizationId": "<string>",
"documentId": "<string>",
"activities": [
{
"id": "<string>",
"featureType": "<string>",
"actionType": "<string>",
"actionUser": {},
"targetEntityId": "<string>",
"targetSubEntityId": "<string>",
"changes": {},
"entityData": "<any>",
"entityTargetData": "<any>",
"displayMessageTemplate": "<string>",
"displayMessageTemplateData": {},
"actionIcon": "<string>",
"isActivityResolverUsed": true
}
]
}
}
'import requests
url = "https://api.velt.dev/v2/activities/add"
payload = { "data": {
"organizationId": "<string>",
"documentId": "<string>",
"activities": [
{
"id": "<string>",
"featureType": "<string>",
"actionType": "<string>",
"actionUser": {},
"targetEntityId": "<string>",
"targetSubEntityId": "<string>",
"changes": {},
"entityData": "<any>",
"entityTargetData": "<any>",
"displayMessageTemplate": "<string>",
"displayMessageTemplateData": {},
"actionIcon": "<string>",
"isActivityResolverUsed": True
}
]
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
organizationId: '<string>',
documentId: '<string>',
activities: [
{
id: '<string>',
featureType: '<string>',
actionType: '<string>',
actionUser: {},
targetEntityId: '<string>',
targetSubEntityId: '<string>',
changes: {},
entityData: '<any>',
entityTargetData: '<any>',
displayMessageTemplate: '<string>',
displayMessageTemplateData: {},
actionIcon: '<string>',
isActivityResolverUsed: true
}
]
}
})
};
fetch('https://api.velt.dev/v2/activities/add', 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.velt.dev/v2/activities/add",
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([
'data' => [
'organizationId' => '<string>',
'documentId' => '<string>',
'activities' => [
[
'id' => '<string>',
'featureType' => '<string>',
'actionType' => '<string>',
'actionUser' => [
],
'targetEntityId' => '<string>',
'targetSubEntityId' => '<string>',
'changes' => [
],
'entityData' => '<any>',
'entityTargetData' => '<any>',
'displayMessageTemplate' => '<string>',
'displayMessageTemplateData' => [
],
'actionIcon' => '<string>',
'isActivityResolverUsed' => true
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-token>"
],
]);
$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.velt.dev/v2/activities/add"
payload := strings.NewReader("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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://api.velt.dev/v2/activities/add")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/activities/add")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Activity(s) added successfully.",
"data": {
"success": true,
"message": "Activity(s) added successfully."
}
}
}
Activity Logs
Add Activity Logs
POST
/
v2
/
activities
/
add
Add Activity Logs
curl --request POST \
--url https://api.velt.dev/v2/activities/add \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"organizationId": "<string>",
"documentId": "<string>",
"activities": [
{
"id": "<string>",
"featureType": "<string>",
"actionType": "<string>",
"actionUser": {},
"targetEntityId": "<string>",
"targetSubEntityId": "<string>",
"changes": {},
"entityData": "<any>",
"entityTargetData": "<any>",
"displayMessageTemplate": "<string>",
"displayMessageTemplateData": {},
"actionIcon": "<string>",
"isActivityResolverUsed": true
}
]
}
}
'import requests
url = "https://api.velt.dev/v2/activities/add"
payload = { "data": {
"organizationId": "<string>",
"documentId": "<string>",
"activities": [
{
"id": "<string>",
"featureType": "<string>",
"actionType": "<string>",
"actionUser": {},
"targetEntityId": "<string>",
"targetSubEntityId": "<string>",
"changes": {},
"entityData": "<any>",
"entityTargetData": "<any>",
"displayMessageTemplate": "<string>",
"displayMessageTemplateData": {},
"actionIcon": "<string>",
"isActivityResolverUsed": True
}
]
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
organizationId: '<string>',
documentId: '<string>',
activities: [
{
id: '<string>',
featureType: '<string>',
actionType: '<string>',
actionUser: {},
targetEntityId: '<string>',
targetSubEntityId: '<string>',
changes: {},
entityData: '<any>',
entityTargetData: '<any>',
displayMessageTemplate: '<string>',
displayMessageTemplateData: {},
actionIcon: '<string>',
isActivityResolverUsed: true
}
]
}
})
};
fetch('https://api.velt.dev/v2/activities/add', 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.velt.dev/v2/activities/add",
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([
'data' => [
'organizationId' => '<string>',
'documentId' => '<string>',
'activities' => [
[
'id' => '<string>',
'featureType' => '<string>',
'actionType' => '<string>',
'actionUser' => [
],
'targetEntityId' => '<string>',
'targetSubEntityId' => '<string>',
'changes' => [
],
'entityData' => '<any>',
'entityTargetData' => '<any>',
'displayMessageTemplate' => '<string>',
'displayMessageTemplateData' => [
],
'actionIcon' => '<string>',
'isActivityResolverUsed' => true
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-token>"
],
]);
$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.velt.dev/v2/activities/add"
payload := strings.NewReader("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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://api.velt.dev/v2/activities/add")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/activities/add")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"organizationId\": \"<string>\",\n \"documentId\": \"<string>\",\n \"activities\": [\n {\n \"id\": \"<string>\",\n \"featureType\": \"<string>\",\n \"actionType\": \"<string>\",\n \"actionUser\": {},\n \"targetEntityId\": \"<string>\",\n \"targetSubEntityId\": \"<string>\",\n \"changes\": {},\n \"entityData\": \"<any>\",\n \"entityTargetData\": \"<any>\",\n \"displayMessageTemplate\": \"<string>\",\n \"displayMessageTemplateData\": {},\n \"actionIcon\": \"<string>\",\n \"isActivityResolverUsed\": true\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Activity(s) added successfully.",
"data": {
"success": true,
"message": "Activity(s) added successfully."
}
}
}
Use this API to create activity log records for a document within an organization.
Adding activity logs via the REST API requires
activityServiceConfig to be enabled at the workspace level in the Velt Console.Endpoint
POST https://api.velt.dev/v2/activities/add
Headers
string
required
Your API key.
string
required
Your Auth Token.
Body
Params
object
required
Show properties
Show properties
string
required
Organization ID
string
required
Document ID
object[]
required
Array of activity log objects to create.
Show properties
Show properties
string
Optional Firestore document ID for the activity record. Use this to control the ID for idempotent writes — if an activity with this ID already exists it will be overwritten.
string
required
Feature that generated the activity log. Must be one of:
"comment", "reaction", "recorder", "crdt", "custom".string
required
Specific action performed (e.g.,
"comment.add").User
required
User who performed the action.
string
ID of the primary entity the activity log targets (e.g., annotation ID). Required when
featureType is "custom"; optional for all other feature types.string
ID of a sub-entity within the target (e.g., a specific comment ID).
object
Map of field names to
{ from, to } objects describing what changed.any
Snapshot of the entity at the time of the action.
any
Snapshot of the target entity at the time of the action.
string
Message template string. Use
{{variable}} syntax for dynamic values.object
Key-value data to populate
displayMessageTemplate variables.string
URL or identifier for the icon representing this action.
boolean
Use this for self-hosting activity data. Set to
true if you are using the activity resolver data provider in the SDK. When true, indicates that PII has been stripped from the activity record and the record is pending resolver re-hydration.Example Requests
Add a single activity log (non-custom featureType, targetEntityId optional)
{
"data": {
"organizationId": "org-123",
"documentId": "doc-456",
"activities": [
{
"featureType": "comment",
"actionType": "comment.add",
"actionUser": {
"userId": "user-1",
"email": "user@example.com",
"name": "User Name"
},
"displayMessageTemplate": "{{user}} added a comment"
}
]
}
}
Add an activity log with a custom ID (idempotent write)
{
"data": {
"organizationId": "org-123",
"documentId": "doc-456",
"activities": [
{
"id": "my-custom-activity-id",
"featureType": "comment",
"actionType": "comment.add",
"actionUser": {
"userId": "user-1",
"email": "user@example.com",
"name": "User Name"
},
"targetEntityId": "annotation-789",
"displayMessageTemplate": "{{user}} added a comment"
}
]
}
}
Add a custom featureType activity (targetEntityId required)
{
"data": {
"organizationId": "org-123",
"documentId": "doc-456",
"activities": [
{
"featureType": "custom",
"actionType": "statusChanged",
"actionUser": {
"userId": "user-1",
"email": "user@example.com",
"name": "User Name"
},
"targetEntityId": "entity-456",
"displayMessageTemplate": "{{user}} changed the status"
}
]
}
}
Add an activity log with changes and template data
{
"data": {
"organizationId": "org-123",
"documentId": "doc-456",
"activities": [
{
"featureType": "comment",
"actionType": "comment.update",
"actionUser": {
"userId": "user-1",
"email": "user@example.com",
"name": "User Name"
},
"targetEntityId": "annotation-789",
"targetSubEntityId": "comment-001",
"changes": {
"commentText": {
"from": "Original text",
"to": "Updated text"
}
},
"displayMessageTemplate": "{{user}} updated a comment",
"displayMessageTemplateData": {
"user": {
"userId": "user-1",
"name": "User Name"
}
}
}
]
}
}
Response
Success Response
{
"result": {
"status": "success",
"message": "Activity(s) added successfully.",
"data": {
"success": true,
"message": "Activity(s) added successfully."
}
}
}
Failure Response
{
"error": {
"message": "ERROR_MESSAGE",
"status": "INVALID_ARGUMENT"
}
}
{
"result": {
"status": "success",
"message": "Activity(s) added successfully.",
"data": {
"success": true,
"message": "Activity(s) added successfully."
}
}
}
Was this page helpful?
⌘I

