Skip to main content
POST
/
v1
/
activity-reports
Generate an activity & stage-change report
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

Authorization
string
header
required

Authenticate with a Bearer token: API key, OAuth token, or session token.

Body

application/json
segment_by
enum<string>
required

Dimension to group the report by:

  • team_member — one segment per recruiter
  • job — one segment per job
  • company — one segment per client/organization company
Available options:
team_member,
job,
company
period
enum<string>
default:custom

Convenience preset that derives the date range when date_from / date_to are omitted:

  • daily — the start of today through now
  • weekly — the trailing 7 days through now
  • monthly — the trailing 30 days through now
  • custom — use the explicit date_from / date_to values (required when custom).
Available options:
daily,
weekly,
monthly,
custom
date_from
string<date-time>

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.

date_to
string<date-time>

End of the report window (ISO 8601). Required when period=custom. Custom windows are limited to 2 years.

team_member_ids
string<uuid>[]

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.

Maximum array length: 200
job_ids
string<uuid>[]

Optional job UUIDs to narrow the report. Affects both the aggregate totals and per-segment rows. Maximum 200 IDs.

Maximum array length: 200
organization_company_ids
string<uuid>[]

Optional 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.

Maximum array length: 200
include
enum<string>[]

Optional sections to embed per segment. Values:

  • pipeline_snapshot — current candidate count per pipeline stage (for job / company segments)
  • job_breakdown — per-job candidates-sourced breakdown (for team_member segments)
  • crm_activities — fold client_activities and client_status_changes into the company segment metrics
Available options:
pipeline_snapshot,
job_breakdown,
crm_activities

Response

Activity report generated

success
enum<boolean>
required
Available options:
true
data
object
required