Skip to content

Jobs & Hiring Activity Integration

Understand company hiring activity to prioritize leads and personalize outreach.


Overview

The Jobs API provides insights into a company's hiring activity, helping you:

  • Prioritize leads based on hiring velocity (actively recruiting companies are more likely to be in growth mode)
  • Identify buyer signals (hiring for roles that use your product)
  • Personalize outreach with references to specific job postings
  • Track market trends across your target accounts

How It Works

graph LR
    A[Company ID] --> B{Jobs API}
    B --> C[Job Listings]
    B --> D[Activity Metrics]
    C --> E[Title, Location, Platform]
    D --> F[Velocity, Strength]
  1. Get a Company ID from the delivered companies endpoint
  2. Query Jobs API with optional filters (days_back, platform)
  3. Receive hiring metrics including activity strength and job listings

Endpoints

Endpoint Description Use Case
GET /companies/{id}/jobs Full job listings with pagination Detailed analysis, CRM enrichment
GET /companies/{id}/jobs/summary Lightweight metrics + latest job Quick overview, activity widgets

Activity Strength Levels

OpenProspect calculates hiring activity strength based on posting velocity (jobs per month):

Level Threshold Description
STRONG >= 3.0 jobs/month Actively recruiting - high growth signal
MODERATE >= 1.5 jobs/month Steady hiring - stable growth
LIGHT >= 0.5 jobs/month Occasional hiring
NONE < 0.5 jobs/month Minimal activity

Get Job Listings

Retrieve job postings for a company with activity metrics and pagination.

Request

GET /api/v1/companies/{company_id}/jobs

Query Parameters:

Parameter Type Default Description
days_back integer 30 Days to look back (1-365)
platform string null Filter by platform (linkedin, indeed, stepstone)
limit integer 50 Results per page (1-200)
offset integer 0 Results to skip

Code Examples

curl -X GET "https://api.openprospect.io/api/v1/companies/{company_id}/jobs?days_back=30&limit=50" \
  -H "Authorization: Bearer ${OPENPROSPECT_API_KEY}"
import httpx

API_KEY = "lnc_live_your_api_key_here"
BASE_URL = "https://api.openprospect.io/api/v1"

company_id = "a45e6452-496e-4bb3-86a0-3c99475c0fc3"

response = httpx.get(
    f"{BASE_URL}/companies/{company_id}/jobs",
    params={"days_back": 30, "limit": 50},
    headers={"Authorization": f"Bearer {API_KEY}"}
)

data = response.json()
print(f"Activity: {data['activity_strength']} ({data['velocity_per_month']:.1f} jobs/month)")
print(f"Total jobs: {data['total']}")

for job in data["items"]:
    print(f"  - {job['title']} ({job['location']})")
    print(f"    Platforms: {', '.join(job['platforms_listed'])}")
const API_KEY = "lnc_live_your_api_key_here";
const BASE_URL = "https://api.openprospect.io/api/v1";

const companyId = "a45e6452-496e-4bb3-86a0-3c99475c0fc3";

const response = await fetch(
  `${BASE_URL}/companies/${companyId}/jobs?days_back=30&limit=50`,
  { headers: { "Authorization": `Bearer ${API_KEY}` } }
);

const data = await response.json();
console.log(`Activity: ${data.activity_strength} (${data.velocity_per_month.toFixed(1)} jobs/month)`);
console.log(`Total jobs: ${data.total}`);

for (const job of data.items) {
  console.log(`  - ${job.title} (${job.location})`);
  console.log(`    Platforms: ${job.platforms_listed.join(", ")}`);
}
const API_KEY = "lnc_live_your_api_key_here";
const BASE_URL = "https://api.openprospect.io/api/v1";

interface JobListing {
  id: string;
  title: string;
  platforms_listed: string[];
  platform_urls: Record<string, string>;
  last_seen_at: string;
  date_posted?: string;
  location?: string;
  start_date?: string;
}

interface CompanyJobsResponse {
  items: JobListing[];
  total: number;
  limit: number;
  offset: number;
  has_more: boolean;
  activity_strength: "STRONG" | "MODERATE" | "LIGHT" | "NONE";
  velocity_per_month: number;
}

const companyId = "a45e6452-496e-4bb3-86a0-3c99475c0fc3";

const response = await fetch(
  `${BASE_URL}/companies/${companyId}/jobs?days_back=30&limit=50`,
  { headers: { "Authorization": `Bearer ${API_KEY}` } }
);

const data: CompanyJobsResponse = await response.json();
console.log(`Activity: ${data.activity_strength} (${data.velocity_per_month.toFixed(1)} jobs/month)`);

for (const job of data.items) {
  console.log(`  - ${job.title} (${job.location ?? "Remote"})`);
}
using System.Net.Http.Headers;
using System.Text.Json;

var apiKey = "lnc_live_your_api_key_here";
var baseUrl = "https://api.openprospect.io/api/v1";
var companyId = "a45e6452-496e-4bb3-86a0-3c99475c0fc3";

using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", apiKey);

var response = await client.GetAsync(
    $"{baseUrl}/companies/{companyId}/jobs?days_back=30&limit=50");

if (response.IsSuccessStatusCode)
{
    var json = await response.Content.ReadAsStringAsync();
    var options = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
        PropertyNameCaseInsensitive = true
    };
    var data = JsonSerializer.Deserialize<CompanyJobsResponse>(json, options);

    Console.WriteLine($"Activity: {data.ActivityStrength} ({data.VelocityPerMonth:F1} jobs/month)");
    Console.WriteLine($"Total jobs: {data.Total}");

    foreach (var job in data.Items)
    {
        Console.WriteLine($"  - {job.Title} ({job.Location ?? "Remote"})");
        Console.WriteLine($"    Platforms: {string.Join(", ", job.PlatformsListed)}");
    }
}

// Response classes
public record CompanyJobsResponse(
    List<JobListing> Items,
    int Total,
    int Limit,
    int Offset,
    bool HasMore,
    string ActivityStrength,
    double VelocityPerMonth
);

public record JobListing(
    string Id,
    string Title,
    List<string> PlatformsListed,
    Dictionary<string, string> PlatformUrls,
    DateTime LastSeenAt,
    DateTime? DatePosted,
    string? Location,
    DateTime? StartDate
);

Example Response

{
  "items": [
    {
      "id": "f8a12345-6789-4abc-def0-123456789abc",
      "title": "Senior Software Engineer",
      "platforms_listed": ["linkedin", "stepstone"],
      "platform_urls": {
        "linkedin": "https://www.linkedin.com/jobs/view/123456789",
        "stepstone": "https://www.stepstone.de/stellenangebot/123456"
      },
      "last_seen_at": "2025-11-30T10:00:00Z",
      "date_posted": "2025-11-25T09:00:00Z",
      "location": "Munich, Germany",
      "start_date": null
    },
    {
      "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
      "title": "Product Manager",
      "platforms_listed": ["linkedin"],
      "platform_urls": {
        "linkedin": "https://www.linkedin.com/jobs/view/987654321"
      },
      "last_seen_at": "2025-11-29T14:30:00Z",
      "date_posted": "2025-11-20T08:00:00Z",
      "location": "Berlin, Germany",
      "start_date": "2026-01-15T00:00:00Z"
    }
  ],
  "total": 12,
  "limit": 50,
  "offset": 0,
  "has_more": false,
  "activity_strength": "STRONG",
  "velocity_per_month": 4.2
}

Get Job Activity Summary

Get lightweight hiring metrics with the most recently posted job. Ideal for quick overview widgets.

Request

GET /api/v1/companies/{company_id}/jobs/summary

Query Parameters:

Parameter Type Default Description
days_back integer 30 Days to look back (1-365)
platform string null Filter by platform

Code Examples

curl -X GET "https://api.openprospect.io/api/v1/companies/{company_id}/jobs/summary?days_back=30" \
  -H "Authorization: Bearer ${OPENPROSPECT_API_KEY}"
response = httpx.get(
    f"{BASE_URL}/companies/{company_id}/jobs/summary",
    params={"days_back": 30},
    headers={"Authorization": f"Bearer {API_KEY}"}
)

data = response.json()
print(f"Hiring Activity: {data['activity_strength']}")
print(f"Velocity: {data['velocity_per_month']:.1f} jobs/month")
print(f"Total Open Positions: {data['total']}")

if data.get("latest_job"):
    job = data["latest_job"]
    print(f"Latest: {job['title']} - {job['location']}")
const response = await fetch(
  `${BASE_URL}/companies/${companyId}/jobs/summary?days_back=30`,
  { headers: { "Authorization": `Bearer ${API_KEY}` } }
);

const data = await response.json();
console.log(`Hiring Activity: ${data.activity_strength}`);
console.log(`Velocity: ${data.velocity_per_month.toFixed(1)} jobs/month`);

if (data.latest_job) {
  console.log(`Latest: ${data.latest_job.title} - ${data.latest_job.location}`);
}
interface CompanyJobsSummaryResponse {
  total: number;
  activity_strength: "STRONG" | "MODERATE" | "LIGHT" | "NONE";
  velocity_per_month: number;
  latest_job?: JobListing;
}

const response = await fetch(
  `${BASE_URL}/companies/${companyId}/jobs/summary?days_back=30`,
  { headers: { "Authorization": `Bearer ${API_KEY}` } }
);

const data: CompanyJobsSummaryResponse = await response.json();
console.log(`Hiring Activity: ${data.activity_strength}`);
console.log(`Velocity: ${data.velocity_per_month.toFixed(1)} jobs/month`);

if (data.latest_job) {
  console.log(`Latest: ${data.latest_job.title}`);
}
var response = await client.GetAsync(
    $"{baseUrl}/companies/{companyId}/jobs/summary?days_back=30");

if (response.IsSuccessStatusCode)
{
    var json = await response.Content.ReadAsStringAsync();
    var options = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
        PropertyNameCaseInsensitive = true
    };
    var data = JsonSerializer.Deserialize<CompanyJobsSummaryResponse>(json, options);

    Console.WriteLine($"Hiring Activity: {data.ActivityStrength}");
    Console.WriteLine($"Velocity: {data.VelocityPerMonth:F1} jobs/month");

    if (data.LatestJob != null)
    {
        Console.WriteLine($"Latest: {data.LatestJob.Title} - {data.LatestJob.Location}");
    }
}

public record CompanyJobsSummaryResponse(
    int Total,
    string ActivityStrength,
    double VelocityPerMonth,
    JobListing? LatestJob
);

Example Response

{
  "total": 12,
  "activity_strength": "STRONG",
  "velocity_per_month": 4.2,
  "latest_job": {
    "id": "f8a12345-6789-4abc-def0-123456789abc",
    "title": "Senior Software Engineer",
    "platforms_listed": ["linkedin", "stepstone"],
    "platform_urls": {
      "linkedin": "https://www.linkedin.com/jobs/view/123456789",
      "stepstone": "https://www.stepstone.de/stellenangebot/123456"
    },
    "last_seen_at": "2025-11-30T10:00:00Z",
    "date_posted": "2025-11-25T09:00:00Z",
    "location": "Munich, Germany",
    "start_date": null
  }
}

Use Cases

Lead Scoring Based on Hiring Activity

def calculate_lead_score(company: dict, jobs_data: dict) -> int:
    """Calculate lead score incorporating hiring activity."""
    base_score = company.get("match_score", 0)

    # Boost score based on hiring activity
    activity_boost = {
        "STRONG": 20,
        "MODERATE": 10,
        "LIGHT": 5,
        "NONE": 0
    }

    hiring_boost = activity_boost.get(jobs_data["activity_strength"], 0)

    return min(100, base_score + hiring_boost)

Finding Companies Hiring for Specific Roles

def find_companies_hiring_role(companies: list, role_keywords: list) -> list:
    """Find companies hiring for roles matching keywords."""
    matches = []

    for company in companies:
        jobs = httpx.get(
            f"{BASE_URL}/companies/{company['id']}/jobs",
            headers={"Authorization": f"Bearer {API_KEY}"}
        ).json()

        for job in jobs["items"]:
            if any(kw.lower() in job["title"].lower() for kw in role_keywords):
                matches.append({
                    "company": company["name"],
                    "job_title": job["title"],
                    "job_url": list(job["platform_urls"].values())[0]
                })

    return matches

# Find companies hiring engineers
engineering_leads = find_companies_hiring_role(
    delivered_companies,
    ["engineer", "developer", "architect"]
)

Next Steps