curl --request GET \
--url https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats', 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://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"entity_type": "PERSON",
"entity_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"by_user": [
{
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
}
],
"top_email_user": {
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
},
"top_meeting_user": {
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
}
}Person activity stats
Returns activity counts (emails, meetings, total) across different time periods.
curl --request GET \
--url https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats', 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://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/persons/{person_uuid}/activity-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"entity_type": "PERSON",
"entity_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"by_user": [
{
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
}
],
"top_email_user": {
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
},
"top_meeting_user": {
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"periods": [
{
"activity_counts": {
"emails": 0,
"meetings": 0,
"total": 0
},
"period": "<string>",
"last_activity_date": "<string>"
}
],
"name": "<string>"
}
}Authorizations
Path Parameters
Query Parameters
Comma-separated list of periods to retrieve stats for. Valid values: '30_days', '90_days', '180_days', '365_days', 'all_time'. If not specified, returns all available periods.
Optional grouping. internal_user returns a per-user breakdown under by_user in addition to the aggregate periods.
"internal_user"Optional. top_user populates top_email_user and top_meeting_user (each user's name + 90-day counts) without requiring group_by=internal_user's full by_user array. Combine with group_by=internal_user to get both.
"top_user"Response
Activity statistics response for an entity.
Contains stats across multiple time periods (e.g., 30_days, 90_days, all_time).
by_user is only populated when group_by=internal_user is passed (the
full per-user breakdown); the top-level periods still carries the
aggregate. top_email_user/top_meeting_user are the by_user entries
with the highest emails/meetings count (90-day window) — populated
whenever group_by=internal_user OR the lighter-weight sort_by=top_user
is passed, without requiring the full by_user array. None when there's
no internal-user activity for that metric.
PERSON, COMPANY Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes