Read Current Terms and Own Acceptance
curl --request GET \
--url https://api.bota.dev/v1/end-users/{id}/terms \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bota.dev/v1/end-users/{id}/terms"
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', 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",
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"
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")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bota.dev/v1/end-users/{id}/terms")
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{
"document": {
"version": "<string>",
"title": "<string>",
"content_sha256": "<string>",
"content_text": "<string>",
"source_url": "<string>",
"effective_at": "2023-11-07T05:31:56Z"
},
"acceptance_required": true,
"acceptance": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"content_sha256": "<string>",
"subject_type": "dashboard_user",
"subject_id": "<string>",
"project_id": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"channel": "portal"
},
"notice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"content_sha256": "<string>",
"presented_at": "2023-11-07T05:31:56Z",
"channel": "portal"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "organization_access_quarantined",
"message": "Organization access is temporarily locked",
"request_id": "<string>"
}
}End Users
Get Terms and Acceptance
Read the current immutable terms and this end user’s receipt state
GET
/
end-users
/
{id}
/
terms
Read Current Terms and Own Acceptance
curl --request GET \
--url https://api.bota.dev/v1/end-users/{id}/terms \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bota.dev/v1/end-users/{id}/terms"
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', 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",
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"
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")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bota.dev/v1/end-users/{id}/terms")
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{
"document": {
"version": "<string>",
"title": "<string>",
"content_sha256": "<string>",
"content_text": "<string>",
"source_url": "<string>",
"effective_at": "2023-11-07T05:31:56Z"
},
"acceptance_required": true,
"acceptance": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"content_sha256": "<string>",
"subject_type": "dashboard_user",
"subject_id": "<string>",
"project_id": "<string>",
"accepted_at": "2023-11-07T05:31:56Z",
"channel": "portal"
},
"notice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"content_sha256": "<string>",
"presented_at": "2023-11-07T05:31:56Z",
"channel": "portal"
}
}{
"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.
Cache-Control: no-store.
Use a secret project key, a restricted key with end_users:read, or an
end-user token for its own exact id.
The authenticated project and active EndUser must match. Device, upload and
completion credentials cannot use these operations. Keep project keys on your
trusted backend and resolve the EndUser from your authenticated user’s mapping.
Review flow
- Display the returned exact
content_textfor itsversionandcontent_sha256. Do not substitute a mutable website page or an older cache. - Only after the document or notice is visibly rendered, record an in-app presentation.
- Offer an explicit Accept action. Submit an acceptance only after that action, using the displayed version and hash.
acceptance_required: true means this EndUser has no receipt for the current
version. The initial reminder is non-blocking: reading, login, dismissal and
continued use do not accept the terms. Preserve navigation, export,
cancellation, privacy requests, support and logout.
The current revision is 2026-10-14. Its public last-updated date does not
establish a historical legal effective date, so effective_at is currently
null. A personal receipt grants neither organizational signing authority
nor consent from recorded participants. No new data use is activated by this
release. See terms receipts.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?

