curl --request GET \
--url https://api.stardex.ai/v1/job-offers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.stardex.ai/v1/job-offers"
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/job-offers', 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/job-offers",
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/job-offers"
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/job-offers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/job-offers")
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": "7e8f9012-3456-4789-a012-bcdef0123456",
"job_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"job_name": "VP of Engineering",
"job_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"job_company_name": "Acme Corp",
"candidate_id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"person_id": "4d5e6f7a-8b9c-4d0e-9f2a-3b4c5d6e7f8a",
"person_name": "Jordan Lee",
"status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Accepted",
"color": "#22c55e",
"status_type": "accepted"
},
"owners": [
{
"id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"name": "Jane Smith",
"first_name": "Jane",
"last_name": "Smith",
"image_url": "https://img.clerk.com/jane-smith.png"
}
],
"client_contacts": [
{
"id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"person_id": "8b9c0d1e-2f3a-4b4c-9d6e-7f8a9b0c1d2e",
"name": "Morgan Patel",
"first_name": "Morgan",
"last_name": "Patel",
"image_url": "https://media.example.com/morgan-patel.jpg"
}
],
"extended_date": "2026-04-02T00:00:00.000Z",
"accepted_date": "2026-04-09T00:00:00.000Z",
"candidate_start_date": "2026-05-04T00:00:00.000Z",
"compensation_currency": "USD",
"compensation_base": 285000,
"compensation_bonus": 20,
"bonus_type": "percent",
"annual_equity_grant_percent": null,
"annual_equity_grant_amount": 50000,
"initial_equity_grant_percent": 0.25,
"initial_equity_grant_amount": 400000,
"relocation_bonus": 15000,
"sign_on_bonus": 25000,
"total_estimated_compensation": 392000,
"note": "Accepted after a second-round counter on base.",
"created_at": "2026-04-02T15:20:00.000Z",
"updated_at": "2026-04-09T18:05:00.000Z"
}
],
"meta": {
"total": 12,
"offset": 0,
"limit": 20
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}List job offers
Retrieve a paginated list of offers extended to candidates, with the job, client company, person, status, key dates, offer compensation, owners (team members credited on the offer), and client contacts attached to the offer.
Filters: job_id, candidate_id, person_id, job_offer_status_id, status_type (pending, accepted, rejected, rescinded), and extended_date_after / extended_date_before (ISO 8601 date range).
Sorting: sort_by (created_at, updated_at, extended_date, accepted_date, candidate_start_date) with sort_order (asc/desc, default desc).
Pagination: Use offset and limit query params (max 100 per page).
Access: Session and OAuth callers need org:reports:offer_tracking (org:admin bypasses). API keys need the offers:read scope. Compensation fields (compensation_*, bonus_type, equity grants, relocation_bonus, sign_on_bonus, total_estimated_compensation) are omitted for API keys without compensation:read.
Offers on jobs the caller cannot access are not returned.
curl --request GET \
--url https://api.stardex.ai/v1/job-offers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.stardex.ai/v1/job-offers"
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/job-offers', 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/job-offers",
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/job-offers"
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/job-offers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stardex.ai/v1/job-offers")
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": "7e8f9012-3456-4789-a012-bcdef0123456",
"job_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"job_name": "VP of Engineering",
"job_company_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"job_company_name": "Acme Corp",
"candidate_id": "3c4d5e6f-7a8b-4c9d-8e1f-2a3b4c5d6e7f",
"person_id": "4d5e6f7a-8b9c-4d0e-9f2a-3b4c5d6e7f8a",
"person_name": "Jordan Lee",
"status": {
"id": "5e6f7a8b-9c0d-4e1f-8a3b-4c5d6e7f8a9b",
"name": "Accepted",
"color": "#22c55e",
"status_type": "accepted"
},
"owners": [
{
"id": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f8a9b0c",
"name": "Jane Smith",
"first_name": "Jane",
"last_name": "Smith",
"image_url": "https://img.clerk.com/jane-smith.png"
}
],
"client_contacts": [
{
"id": "7a8b9c0d-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
"person_id": "8b9c0d1e-2f3a-4b4c-9d6e-7f8a9b0c1d2e",
"name": "Morgan Patel",
"first_name": "Morgan",
"last_name": "Patel",
"image_url": "https://media.example.com/morgan-patel.jpg"
}
],
"extended_date": "2026-04-02T00:00:00.000Z",
"accepted_date": "2026-04-09T00:00:00.000Z",
"candidate_start_date": "2026-05-04T00:00:00.000Z",
"compensation_currency": "USD",
"compensation_base": 285000,
"compensation_bonus": 20,
"bonus_type": "percent",
"annual_equity_grant_percent": null,
"annual_equity_grant_amount": 50000,
"initial_equity_grant_percent": 0.25,
"initial_equity_grant_amount": 400000,
"relocation_bonus": 15000,
"sign_on_bonus": 25000,
"total_estimated_compensation": 392000,
"note": "Accepted after a second-round counter on base.",
"created_at": "2026-04-02T15:20:00.000Z",
"updated_at": "2026-04-09T18:05:00.000Z"
}
],
"meta": {
"total": 12,
"offset": 0,
"limit": 20
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"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.
Query Parameters
Records to skip for pagination. Defaults to 0.
x >= 0Max records per page (1–100). Defaults to 100.
1 <= x <= 100Only return offers for this job.
Only return offers for this candidate record (a person on a specific job).
Only return offers made to this person, across all jobs.
Only return offers in this status. Get status IDs from GET /v1/job-offers/statuses.
Only return offers whose status belongs to this lifecycle category: pending, accepted, rejected, or rescinded.
pending, accepted, rejected, rescinded Return offers extended at or after this timestamp (ISO 8601). Example: 2026-04-01T00:00:00Z.
Return offers extended at or before this timestamp (ISO 8601). Example: 2026-04-30T23:59:59Z.
Column to sort results by. Defaults to created_at. Offers with no value for the chosen date sort last.
created_at— when the offer was recordedupdated_at— when the offer was last changedextended_date— when the offer was extended to the candidateaccepted_date— when the candidate acceptedcandidate_start_date— when the candidate is expected to start
created_at, updated_at, extended_date, accepted_date, candidate_start_date Sort direction. Defaults to desc (newest first).
asc, desc Was this page helpful?