Export Own Terms Events
curl --request GET \
--url https://api.bota.dev/v1/end-users/{id}/terms/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bota.dev/v1/end-users/{id}/terms/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bota.dev/v1/end-users/{id}/terms/events', 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.bota.dev/v1/end-users/{id}/terms/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <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"
"net/http"
"io"
)
func main() {
url := "https://api.bota.dev/v1/end-users/{id}/terms/events"
req, _ := http.NewRequest("GET", url, nil)
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.get("https://api.bota.dev/v1/end-users/{id}/terms/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bota.dev/v1/end-users/{id}/terms/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "presented",
"version": "<string>",
"content_sha256": "<string>",
"recorded_at": "2023-11-07T05:31:56Z",
"channel": "portal",
"subject_type": "dashboard_user",
"subject_id": "<string>",
"project_id": "<string>"
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "organization_access_quarantined",
"message": "Organization access is temporarily locked",
"request_id": "<string>"
}
}End Users
List Terms Events
Export this end user’s presentation and acceptance evidence
GET
/
end-users
/
{id}
/
terms
/
events
Export Own Terms Events
curl --request GET \
--url https://api.bota.dev/v1/end-users/{id}/terms/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bota.dev/v1/end-users/{id}/terms/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bota.dev/v1/end-users/{id}/terms/events', 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.bota.dev/v1/end-users/{id}/terms/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <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"
"net/http"
"io"
)
func main() {
url := "https://api.bota.dev/v1/end-users/{id}/terms/events"
req, _ := http.NewRequest("GET", url, nil)
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.get("https://api.bota.dev/v1/end-users/{id}/terms/events")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bota.dev/v1/end-users/{id}/terms/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "presented",
"version": "<string>",
"content_sha256": "<string>",
"recorded_at": "2023-11-07T05:31:56Z",
"channel": "portal",
"subject_type": "dashboard_user",
"subject_id": "<string>",
"project_id": "<string>"
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "organization_access_quarantined",
"message": "Organization access is temporarily locked",
"request_id": "<string>"
}
}Available in the Platform production API from October 22, 2026, including
migration 119. Mobile distribution and genuine customer acceptance evidence
remain separate from API availability.
end_users:read, or the same EndUser’s token. Device, upload and completion
credentials are refused. This grants no organization-wide export access.
Events are returned in ascending keyset order. limit is 1–100 and defaults
to 100. When has_more is true, pass the returned opaque next_cursor unchanged
to obtain the next page. Unknown query fields and malformed cursors are rejected.
Responses use Cache-Control: no-store.
Each event includes its version, content hash, server time, subject, project,
channel and event_type (presented or accepted). A presentation event is
not an acceptance. Events store no email, IP address, user agent or session token.
For an audit packet, retrieve the
immutable document for each event’s
version and verify its hash. Do not describe today’s document as the wording
accepted in an older event.
Soft deletion refuses current receipt access while retaining prior event rows.
Hard deletion of the subject or project cascades its events. This storage
behavior does not establish an approved retention period or a complete
account-deletion workflow.Authorizations
API key (sk_live_, sk_test_, rk_), device token (dtok_), or command-bound reset completion credential (rct_*; exact factory-reset ACK only)
Path Parameters
Was this page helpful?

