curl --request GET \
--url https://api.stardex.ai/v1/retainer-packs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.stardex.ai/v1/retainer-packs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.stardex.ai/v1/retainer-packs', 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/retainer-packs",
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.stardex.ai/v1/retainer-packs"
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.stardex.ai/v1/retainer-packs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/retainer-packs")
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{
"success": true,
"data": [
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"organization_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"organization_company_name": "Acme Corp",
"name": "Q4 2026 GTM pack",
"currency_code": "USD",
"invoice_number": "INV-1042",
"link_extra_hires": true,
"firm_commission_percent": 10,
"is_closed": false,
"closed_at": null,
"fee_status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Paid",
"status_type": "paid",
"color": "#22c55e"
},
"expected_date": "2026-10-01",
"actual_payment_date": "2026-10-15",
"amount_each": 12000,
"default_split": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30
}
],
"retainers": [
{
"id": "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e",
"position": 1,
"amount": 12000,
"firm_commission_percent": 10,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f",
"job_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"job_title": "VP of Engineering",
"candidate_id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"person_id": "4d5e6f7a-8b9c-4d0e-9f2a-3b4c5d6e7f8a",
"person_name": "Jordan Lee",
"start_date": "2026-11-03"
},
"splits": [
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": "Recruiter",
"split_percentage": 60,
"split_amount": 6480
},
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 40,
"split_amount": 4320
}
]
},
{
"id": "2c3d4e5f-6a7b-4c8d-8e9f-1a2b3c4d5e6f",
"position": 2,
"amount": 12000,
"firm_commission_percent": 10,
"claim": {
"is_restricted": true,
"placement_fee_event_id": "0d1e2f3a-4b5c-4d6e-9f7a-8b9c0d1e2f3a"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70,
"split_amount": 7560
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30,
"split_amount": 3240
}
]
},
{
"id": "3d4e5f6a-7b8c-4d9e-8f0a-2b3c4d5e6f7a",
"position": 3,
"amount": 12000,
"firm_commission_percent": 10,
"claim": null,
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70,
"split_amount": 7560
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30,
"split_amount": 3240
}
]
}
],
"extra_hires": [],
"adjustments": [],
"summary": {
"retainer_count": 3,
"claimed_count": 2,
"open_count": 1,
"extra_hire_count": 0,
"total_amount": 36000,
"remaining_amount": 12000,
"adjustments_total": 0,
"net_retained": 36000
},
"created_at": "2026-09-28T09:12:44.000Z",
"updated_at": "2026-10-15T16:03:10.000Z"
},
{
"id": "4e5f6a7b-8c9d-4e0f-9a1b-3c4d5e6f7a8b",
"organization_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"organization_company_name": "Acme Corp",
"name": "H1 2026 leadership pack",
"currency_code": "EUR",
"invoice_number": "INV-0981",
"link_extra_hires": true,
"firm_commission_percent": 0,
"is_closed": true,
"closed_at": "2026-07-01T10:00:00.000Z",
"fee_status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Paid",
"status_type": "paid",
"color": "#22c55e"
},
"expected_date": "2026-01-15",
"actual_payment_date": "2026-02-01",
"amount_each": 10000,
"default_split": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100
}
],
"retainers": [
{
"id": "5f6a7b8c-9d0e-4f1a-8b2c-4d5e6f7a8b9c",
"position": 1,
"amount": 10000,
"firm_commission_percent": 0,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "1e2f3a4b-5c6d-4e7f-8a8b-9c0d1e2f3a4b",
"job_id": "6a7b8c9d-0e1f-4a2b-9c3d-5e6f7a8b9c0d",
"job_title": "Chief Financial Officer",
"candidate_id": "7b8c9d0e-1f2a-4b3c-8d4e-6f7a8b9c0d1e",
"person_id": "8c9d0e1f-2a3b-4c4d-9e5f-7a8b9c0d1e2f",
"person_name": "Priya Shah",
"start_date": "2026-03-02"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100,
"split_amount": 10000
}
]
},
{
"id": "6a7b8c9d-0e1f-4a2b-8c3d-5e6f7a8b9c0e",
"position": 2,
"amount": 10000,
"firm_commission_percent": 0,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "2f3a4b5c-6d7e-4f8a-9b9c-0d1e2f3a4b5c",
"job_id": "9d0e1f2a-3b4c-4d5e-8f6a-8b9c0d1e2f3a",
"job_title": "Head of Sales",
"candidate_id": "0e1f2a3b-4c5d-4e6f-9a7b-9c0d1e2f3a4b",
"person_id": "1f2a3b4c-5d6e-4f7a-8b8c-0d1e2f3a4b5c",
"person_name": "Marcus Webb",
"start_date": "2026-04-13"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100,
"split_amount": 10000
}
]
}
],
"extra_hires": [
{
"placement_fee_event_id": "3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d",
"job_id": "2a3b4c5d-6e7f-4a8b-9c9d-1e2f3a4b5c6e",
"job_title": "VP of Marketing",
"candidate_id": "4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d7e",
"person_id": "5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f",
"person_name": "Elena Novak",
"start_date": "2026-06-01"
}
],
"adjustments": [
{
"id": "6d7e8f9a-0b1c-4d2e-9f3a-4b5c6d7e8f9a",
"amount": 2500,
"comment": "Goodwill credit after a guarantee replacement",
"adjusted_on": "2026-07-01",
"created_at": "2026-07-01T10:00:00.000Z"
}
],
"summary": {
"retainer_count": 2,
"claimed_count": 2,
"open_count": 0,
"extra_hire_count": 1,
"total_amount": 20000,
"remaining_amount": 0,
"adjustments_total": 2500,
"net_retained": 17500
},
"created_at": "2026-01-10T08:30:00.000Z",
"updated_at": "2026-07-01T10:00:00.000Z"
}
],
"meta": {
"total": 2,
"offset": 0,
"limit": 20
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}List retainer packs
A retainer pack is a set of retainers sold to a client company on one invoice. Each placement at that client claims the next open retainer, which is deducted from what the placement bills. Placements claim retainers when they are logged in the app.
Filters: organization_company_id and is_closed (false returns the packs offered when logging a placement).
Sorting: newest first.
Pagination: offset and limit (default 20, max 100).
A retainer claimed by a placement on a confidential job you cannot see shows claim.is_restricted: true with only the placement ID.
Access: Everyone in the workspace can read retainer packs. API keys need the fees:read scope.
curl --request GET \
--url https://api.stardex.ai/v1/retainer-packs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.stardex.ai/v1/retainer-packs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.stardex.ai/v1/retainer-packs', 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/retainer-packs",
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.stardex.ai/v1/retainer-packs"
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.stardex.ai/v1/retainer-packs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/retainer-packs")
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{
"success": true,
"data": [
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"organization_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"organization_company_name": "Acme Corp",
"name": "Q4 2026 GTM pack",
"currency_code": "USD",
"invoice_number": "INV-1042",
"link_extra_hires": true,
"firm_commission_percent": 10,
"is_closed": false,
"closed_at": null,
"fee_status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Paid",
"status_type": "paid",
"color": "#22c55e"
},
"expected_date": "2026-10-01",
"actual_payment_date": "2026-10-15",
"amount_each": 12000,
"default_split": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30
}
],
"retainers": [
{
"id": "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e",
"position": 1,
"amount": 12000,
"firm_commission_percent": 10,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f",
"job_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"job_title": "VP of Engineering",
"candidate_id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"person_id": "4d5e6f7a-8b9c-4d0e-9f2a-3b4c5d6e7f8a",
"person_name": "Jordan Lee",
"start_date": "2026-11-03"
},
"splits": [
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": "Recruiter",
"split_percentage": 60,
"split_amount": 6480
},
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 40,
"split_amount": 4320
}
]
},
{
"id": "2c3d4e5f-6a7b-4c8d-8e9f-1a2b3c4d5e6f",
"position": 2,
"amount": 12000,
"firm_commission_percent": 10,
"claim": {
"is_restricted": true,
"placement_fee_event_id": "0d1e2f3a-4b5c-4d6e-9f7a-8b9c0d1e2f3a"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70,
"split_amount": 7560
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30,
"split_amount": 3240
}
]
},
{
"id": "3d4e5f6a-7b8c-4d9e-8f0a-2b3c4d5e6f7a",
"position": 3,
"amount": 12000,
"firm_commission_percent": 10,
"claim": null,
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 70,
"split_amount": 7560
},
{
"team_member_id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"team_member_name": "Ana Ruiz",
"role": null,
"split_percentage": 30,
"split_amount": 3240
}
]
}
],
"extra_hires": [],
"adjustments": [],
"summary": {
"retainer_count": 3,
"claimed_count": 2,
"open_count": 1,
"extra_hire_count": 0,
"total_amount": 36000,
"remaining_amount": 12000,
"adjustments_total": 0,
"net_retained": 36000
},
"created_at": "2026-09-28T09:12:44.000Z",
"updated_at": "2026-10-15T16:03:10.000Z"
},
{
"id": "4e5f6a7b-8c9d-4e0f-9a1b-3c4d5e6f7a8b",
"organization_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"organization_company_name": "Acme Corp",
"name": "H1 2026 leadership pack",
"currency_code": "EUR",
"invoice_number": "INV-0981",
"link_extra_hires": true,
"firm_commission_percent": 0,
"is_closed": true,
"closed_at": "2026-07-01T10:00:00.000Z",
"fee_status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Paid",
"status_type": "paid",
"color": "#22c55e"
},
"expected_date": "2026-01-15",
"actual_payment_date": "2026-02-01",
"amount_each": 10000,
"default_split": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100
}
],
"retainers": [
{
"id": "5f6a7b8c-9d0e-4f1a-8b2c-4d5e6f7a8b9c",
"position": 1,
"amount": 10000,
"firm_commission_percent": 0,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "1e2f3a4b-5c6d-4e7f-8a8b-9c0d1e2f3a4b",
"job_id": "6a7b8c9d-0e1f-4a2b-9c3d-5e6f7a8b9c0d",
"job_title": "Chief Financial Officer",
"candidate_id": "7b8c9d0e-1f2a-4b3c-8d4e-6f7a8b9c0d1e",
"person_id": "8c9d0e1f-2a3b-4c4d-9e5f-7a8b9c0d1e2f",
"person_name": "Priya Shah",
"start_date": "2026-03-02"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100,
"split_amount": 10000
}
]
},
{
"id": "6a7b8c9d-0e1f-4a2b-8c3d-5e6f7a8b9c0e",
"position": 2,
"amount": 10000,
"firm_commission_percent": 0,
"claim": {
"is_restricted": false,
"placement_fee_event_id": "2f3a4b5c-6d7e-4f8a-9b9c-0d1e2f3a4b5c",
"job_id": "9d0e1f2a-3b4c-4d5e-8f6a-8b9c0d1e2f3a",
"job_title": "Head of Sales",
"candidate_id": "0e1f2a3b-4c5d-4e6f-9a7b-9c0d1e2f3a4b",
"person_id": "1f2a3b4c-5d6e-4f7a-8b8c-0d1e2f3a4b5c",
"person_name": "Marcus Webb",
"start_date": "2026-04-13"
},
"splits": [
{
"team_member_id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"team_member_name": "Theo Grant",
"role": "Sales",
"split_percentage": 100,
"split_amount": 10000
}
]
}
],
"extra_hires": [
{
"placement_fee_event_id": "3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d",
"job_id": "2a3b4c5d-6e7f-4a8b-9c9d-1e2f3a4b5c6e",
"job_title": "VP of Marketing",
"candidate_id": "4b5c6d7e-8f9a-4b0c-9d1e-2f3a4b5c6d7e",
"person_id": "5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f",
"person_name": "Elena Novak",
"start_date": "2026-06-01"
}
],
"adjustments": [
{
"id": "6d7e8f9a-0b1c-4d2e-9f3a-4b5c6d7e8f9a",
"amount": 2500,
"comment": "Goodwill credit after a guarantee replacement",
"adjusted_on": "2026-07-01",
"created_at": "2026-07-01T10:00:00.000Z"
}
],
"summary": {
"retainer_count": 2,
"claimed_count": 2,
"open_count": 0,
"extra_hire_count": 1,
"total_amount": 20000,
"remaining_amount": 0,
"adjustments_total": 2500,
"net_retained": 17500
},
"created_at": "2026-01-10T08:30:00.000Z",
"updated_at": "2026-07-01T10:00:00.000Z"
}
],
"meta": {
"total": 2,
"offset": 0,
"limit": 20
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}Authorizations
Authenticate with a Bearer token: API key, OAuth token, or session token.
Query Parameters
Only return packs for this client company.
false returns open packs only (the ones offered when logging a placement), true closed packs only. Omit for both.
Records to skip for pagination. Defaults to 0.
x >= 0Max records per page (1-100). Defaults to 20.
1 <= x <= 100Was this page helpful?