curl --request POST \
--url https://api.stardex.ai/v1/activity-reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"period": "custom",
"date_from": "2023-11-07T05:31:56Z",
"date_to": "2023-11-07T05:31:56Z",
"team_member_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"job_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"organization_company_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"include": []
}
'import requests
url = "https://api.stardex.ai/v1/activity-reports"
payload = {
"period": "custom",
"date_from": "2023-11-07T05:31:56Z",
"date_to": "2023-11-07T05:31:56Z",
"team_member_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"job_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"organization_company_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"include": []
}
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({
period: 'custom',
date_from: '2023-11-07T05:31:56Z',
date_to: '2023-11-07T05:31:56Z',
team_member_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
job_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
organization_company_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
include: []
})
};
fetch('https://api.stardex.ai/v1/activity-reports', 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.stardex.ai/v1/activity-reports",
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([
'period' => 'custom',
'date_from' => '2023-11-07T05:31:56Z',
'date_to' => '2023-11-07T05:31:56Z',
'team_member_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'job_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'organization_company_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'include' => [
]
]),
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://api.stardex.ai/v1/activity-reports"
payload := strings.NewReader("{\n \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\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://api.stardex.ai/v1/activity-reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/activity-reports")
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 \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"segment_by": "team_member",
"period": "weekly",
"date_from": "2026-06-19T19:00:00Z",
"date_to": "2026-06-26T19:00:00Z",
"aggregate": {
"activities_by_type": [
{
"type": "campaign_enrollment",
"label": "Campaign Enrollments",
"count": 18
},
{
"type": "secondary_note",
"label": "Notes",
"count": 12
},
{
"type": "email",
"label": "Emails",
"count": 8
},
{
"type": "linkedin_message",
"label": "LinkedIn Messages",
"count": 24
},
{
"type": "call_note",
"label": "Call Note",
"count": 4
}
],
"candidates_sourced": 42,
"stage_changes": 21,
"rejections": 6,
"enrollments": 18,
"tasks": 9,
"stage_changes_by_stage": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"count": 12
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"count": 9
}
],
"pipeline_snapshot": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"candidate_count": 30
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"candidate_count": 5
}
],
"job_breakdown": [
{
"job_id": "345e6789-e01b-23c4-d567-890123456789",
"job_title": "Senior Software Engineer",
"company_id": "111e2222-e333-4444-e555-666666666666",
"company_name": "Acme Corp",
"candidates_sourced": 28
}
]
},
"segments": [
{
"segment_type": "team_member",
"id": "234e5678-e90a-12b3-c456-789012345678",
"name": "Jane Smith",
"company_id": null,
"company_name": null,
"metrics": {
"activities_by_type": [
{
"type": "campaign_enrollment",
"label": "Campaign Enrollments",
"count": 18
},
{
"type": "secondary_note",
"label": "Notes",
"count": 12
},
{
"type": "email",
"label": "Emails",
"count": 8
},
{
"type": "linkedin_message",
"label": "LinkedIn Messages",
"count": 24
},
{
"type": "call_note",
"label": "Call Note",
"count": 4
}
],
"candidates_sourced": 42,
"stage_changes": 21,
"rejections": 6,
"enrollments": 18,
"tasks": 9,
"stage_changes_by_stage": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"count": 12
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"count": 9
}
],
"pipeline_snapshot": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"candidate_count": 30
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"candidate_count": 5
}
],
"job_breakdown": [
{
"job_id": "345e6789-e01b-23c4-d567-890123456789",
"job_title": "Senior Software Engineer",
"company_id": "111e2222-e333-4444-e555-666666666666",
"company_name": "Acme Corp",
"candidates_sourced": 28
}
]
}
}
]
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}Generate an activity & stage-change report
Aggregates recruiter activity, candidate sourcing, pipeline stage changes, campaign enrollments, and tasks for the requested date window. Group by recruiter, job, or company. Mirrors the in-app “Generate report” surface and is the recommended way to produce daily / weekly / monthly performance reports.
Date filter: applies to created_at for activities / candidates / tasks, entered_at for stage changes, and enrolled_at for campaign enrollments.
Optional sections via include:
pipeline_snapshot— current candidate count per pipeline stage (job/company segments only).job_breakdown— per-job candidates-sourced breakdown for each recruiter (team_member segments only).crm_activities— foldclient_activities+client_status_changesinto the company segment metrics.
curl --request POST \
--url https://api.stardex.ai/v1/activity-reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"period": "custom",
"date_from": "2023-11-07T05:31:56Z",
"date_to": "2023-11-07T05:31:56Z",
"team_member_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"job_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"organization_company_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"include": []
}
'import requests
url = "https://api.stardex.ai/v1/activity-reports"
payload = {
"period": "custom",
"date_from": "2023-11-07T05:31:56Z",
"date_to": "2023-11-07T05:31:56Z",
"team_member_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"job_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"organization_company_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"include": []
}
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({
period: 'custom',
date_from: '2023-11-07T05:31:56Z',
date_to: '2023-11-07T05:31:56Z',
team_member_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
job_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
organization_company_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
include: []
})
};
fetch('https://api.stardex.ai/v1/activity-reports', 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.stardex.ai/v1/activity-reports",
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([
'period' => 'custom',
'date_from' => '2023-11-07T05:31:56Z',
'date_to' => '2023-11-07T05:31:56Z',
'team_member_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'job_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'organization_company_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'include' => [
]
]),
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://api.stardex.ai/v1/activity-reports"
payload := strings.NewReader("{\n \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\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://api.stardex.ai/v1/activity-reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/activity-reports")
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 \"period\": \"custom\",\n \"date_from\": \"2023-11-07T05:31:56Z\",\n \"date_to\": \"2023-11-07T05:31:56Z\",\n \"team_member_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"job_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"organization_company_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"include\": []\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"segment_by": "team_member",
"period": "weekly",
"date_from": "2026-06-19T19:00:00Z",
"date_to": "2026-06-26T19:00:00Z",
"aggregate": {
"activities_by_type": [
{
"type": "campaign_enrollment",
"label": "Campaign Enrollments",
"count": 18
},
{
"type": "secondary_note",
"label": "Notes",
"count": 12
},
{
"type": "email",
"label": "Emails",
"count": 8
},
{
"type": "linkedin_message",
"label": "LinkedIn Messages",
"count": 24
},
{
"type": "call_note",
"label": "Call Note",
"count": 4
}
],
"candidates_sourced": 42,
"stage_changes": 21,
"rejections": 6,
"enrollments": 18,
"tasks": 9,
"stage_changes_by_stage": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"count": 12
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"count": 9
}
],
"pipeline_snapshot": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"candidate_count": 30
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"candidate_count": 5
}
],
"job_breakdown": [
{
"job_id": "345e6789-e01b-23c4-d567-890123456789",
"job_title": "Senior Software Engineer",
"company_id": "111e2222-e333-4444-e555-666666666666",
"company_name": "Acme Corp",
"candidates_sourced": 28
}
]
},
"segments": [
{
"segment_type": "team_member",
"id": "234e5678-e90a-12b3-c456-789012345678",
"name": "Jane Smith",
"company_id": null,
"company_name": null,
"metrics": {
"activities_by_type": [
{
"type": "campaign_enrollment",
"label": "Campaign Enrollments",
"count": 18
},
{
"type": "secondary_note",
"label": "Notes",
"count": 12
},
{
"type": "email",
"label": "Emails",
"count": 8
},
{
"type": "linkedin_message",
"label": "LinkedIn Messages",
"count": 24
},
{
"type": "call_note",
"label": "Call Note",
"count": 4
}
],
"candidates_sourced": 42,
"stage_changes": 21,
"rejections": 6,
"enrollments": 18,
"tasks": 9,
"stage_changes_by_stage": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"count": 12
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"count": 9
}
],
"pipeline_snapshot": [
{
"pipeline_stage_id": "567e8901-e23c-45d6-e789-012345678901",
"stage_name": "Sourced",
"stage_color": "#94a3b8",
"global_order": 1,
"candidate_count": 30
},
{
"pipeline_stage_id": "678e9012-e34d-56f7-a890-123456789012",
"stage_name": "Interview",
"stage_color": "#facc15",
"global_order": 3,
"candidate_count": 5
}
],
"job_breakdown": [
{
"job_id": "345e6789-e01b-23c4-d567-890123456789",
"job_title": "Senior Software Engineer",
"company_id": "111e2222-e333-4444-e555-666666666666",
"company_name": "Acme Corp",
"candidates_sourced": 28
}
]
}
}
]
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Authenticate with a Bearer token: API key, OAuth token, or session token.
Body
Dimension to group the report by:
team_member— one segment per recruiterjob— one segment per jobcompany— one segment per client/organization company
team_member, job, company Convenience preset that derives the date range when date_from / date_to are omitted:
daily— the start of today through nowweekly— the trailing 7 days through nowmonthly— the trailing 30 days through nowcustom— use the explicitdate_from/date_tovalues (required whencustom).
daily, weekly, monthly, custom Start of the report window (ISO 8601). Required when period=custom. Applied to created_at for activities, candidates, tasks, and entered_at for stage changes / enrolled_at for campaign enrollments. Custom windows are limited to 2 years.
End of the report window (ISO 8601). Required when period=custom. Custom windows are limited to 2 years.
Optional recruiter UUIDs to narrow the report. Affects both the aggregate totals and per-segment rows. Maximum 200 IDs. Get IDs from GET /v1/team-members.
200Optional job UUIDs to narrow the report. Affects both the aggregate totals and per-segment rows. Maximum 200 IDs.
200Optional client/company UUIDs to narrow the report. When provided, only activity tied to jobs at these companies (or directly to these client companies) is counted. Maximum 200 IDs.
200Optional sections to embed per segment. Values:
pipeline_snapshot— current candidate count per pipeline stage (forjob/companysegments)job_breakdown— per-job candidates-sourced breakdown (forteam_membersegments)crm_activities— foldclient_activitiesandclient_status_changesinto the company segment metrics
pipeline_snapshot, job_breakdown, crm_activities Was this page helpful?