Get job details
Retrieve a job posting: its top card (title, company, location, pills, applicant count, hiring status) and its full description. Use the jobId from search results, or any jobId — the endpoint does not need a prior search. `postedOn` is not returned. LinkedIn shows the posting's age rather than a date, so `postedText` carries it verbatim ("2 weeks ago").
/search/jobs/detailsCode Examples
curl -X POST 'https://api.connectsafely.ai/linkedin/search/jobs/details' \ -H 'Authorization: Bearer <your_api_key>' \ -H 'Content-Type: application/json' \ -d '{"jobId":"12345"}'Retrieve a job posting: its top card (title, company, location, pills, applicant count, hiring status) and its full description. Use the jobId from search results, or any jobId — the endpoint does not need a prior search.
postedOn is not returned. LinkedIn shows the posting's age rather than a date, so postedText carries it verbatim ("2 weeks ago").
Parameters
No parameters.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | No | LinkedIn account ID to use. If not provided, uses the default account. |
jobId | string | Yes | LinkedIn job ID from search results |
Example
{
"jobId": "12345"
}Responses
| Status | Description |
|---|---|
| 200 | Job details retrieved successfully |
| 400 | Bad Request - Missing required jobId parameter |
| 401 | Unauthorized - Invalid or missing API key |
| 404 | Not Found - the job id is invalid, or the posting has been removed |
| 500 | Internal Server Error - Failed to get LinkedIn credentials or job details |
200 Response Parameters
| Name | Type | Description |
|---|---|---|
success | boolean | |
jobId | string | LinkedIn job ID |
title | string | Job title |
companyName | string | Hiring company |
companyLogo | string | Company logo URL |
location | string | Job location, without the workplace suffix |
workplaceType | string | Workplace pill. Absent when LinkedIn shows none. |
employmentType | string | Employment pill as LinkedIn labels it: "Full-time", "Internship", "Contract"… |
postedText | string | How long ago the job was posted, as LinkedIn words it ("2 weeks ago") |
applicantsText | string | The applicant metric LinkedIn chose to show, verbatim — it varies per posting ("100 applicants", "Over 100 people clicked apply") |
hiringStatus | string | Hiring-team signal under the applicant count ("Actively reviewing applicants", "Responses managed off LinkedIn") |
promoted | boolean | True when the posting is promoted by the hirer |
verified | boolean | True when LinkedIn shows its "Verified job" shield |
easyApply | boolean | True when the application is completed on LinkedIn rather than the company site |
description | string | Full job description with requirements and responsibilities |
jobUrl | string | Direct URL to the job posting |
linkedinUrl | string | Direct URL to the job posting (same as jobUrl) |
200 Example
{
"success": true,
"jobId": "4445130437",
"title": "Demand Generation Executive",
"companyName": "BeFiSc",
"companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQF0ZsoNx5Jm4A/company-logo_100_100/...",
"location": "Delhi, India",
"workplaceType": "On-site",
"employmentType": "Internship",
"postedText": "2 weeks ago",
"applicantsText": "100 applicants",
"hiringStatus": "Actively reviewing applicants",
"promoted": true,
"verified": true,
"easyApply": true,
"description": "What you will do • Execute high velocity outbound prospecting...",
"jobUrl": "https://www.linkedin.com/jobs/view/4445130437/",
"linkedinUrl": "https://www.linkedin.com/jobs/view/4445130437/"
}400 Response Parameters
| Name | Type | Description |
|---|---|---|
success | boolean | |
error | object |
400 Example
{
"success": false,
"error": {
"issues": [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"jobId"
],
"message": "Required"
}
],
"name": "ZodError"
}
}401 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
401 Example
{
"error": "Unauthorized - Invalid credentials"
}404 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
404 Example
{
"error": "Job details not found",
"success": false
}500 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
500 Example
{
"error": "Failed to get job details",
"success": false
}Search LinkedIn jobs
Search for job postings on LinkedIn with various filters. Supports pagination and multiple filter criteria including location, employment type, experience level, and more. Filters changed when LinkedIn rebuilt its job search. `industry`, `locationId`, `geoUrn` and `jobType` are rejected with a 400 rather than ignored — LinkedIn no longer offers those filters. Use `employmentType`, `experienceLevel`, `geoId`, and `segmentIds` (filter-pill ids, e.g. `"225001:272001"` for Remote). | Old filter | Use instead | | --- | --- | | `jobType: ["F"]` | `employmentType: ["full-time"]` | | `experienceLevel: ["4","5","6"]` | `experienceLevel: ["senior","director","executive"]` | | `workplaceType: ["2"]` (Remote) | `workplaceType: ["remote"]` | | `industry` | `segmentIds` (the ids LinkedIn offers vary by keyword) | | `locationId` / `geoUrn` | `geoId` | `workplaceType` is applied to the returned cards, not by LinkedIn. LinkedIn honours the Remote segment, but when the fully-filtered pool is thin it BACKFILLS the page with rows that do not match and still answers 200. Measured on one account with keywords "VP of Marketing" and the Remote segment held constant: alone 10/10 remote, plus `experienceLevel` 9/10, plus `past-month` 8/10, plus `past-week` 5/10, plus `past-24h` 5/10, plus `past-24h` and `experienceLevel` 4/10. It tracks how narrow the filter set is, not the keyword, so no segment id avoids it. Filtering on each card's own pill is therefore the only reliable option, with two consequences: a page may return fewer than `count` rows (check `hasMore` and page on), and jobs LinkedIn labels with no workplace pill are excluded rather than assumed. Rate limit: 1,000 search calls per account per day (resets at midnight UTC), and 30 calls per minute. One request counts as one call regardless of `count`.
Search LinkedIn companies
Search for companies on LinkedIn by keywords and filters. Filter by headquarters location, industry, and company size. Useful for lead generation, market research, and finding potential business partners. Handles LinkedIn's page-based pagination internally: ask for the total `count` you want and the API walks as many ~10-result pages as it takes (max 11). `filters.companyType` and `filters.followedCompanies` are still accepted but no longer narrow the result set — LinkedIn's current company search offers no such facet. Sales Navigator Support: Pass a Sales Navigator company search URL in the `url` parameter to search using Sales Navigator filters (revenue, employees, etc.). Requires Sales Navigator license on the LinkedIn account. Rate limit: 1,000 search calls per account per day (resets at midnight UTC), and 30 calls per minute. Pagination is billed per page walked, so a `count` of 25 spends about 3 calls.
