curl --request POST \
--url https://api.scrapebento.com/v1/public/scrape/linkedin/employees \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"wait": true,
"waitTimeoutMs": 123,
"webhookUrl": "<string>",
"idempotencyKey": "<string>",
"cacheTtlSec": 302400,
"fresh": true,
"companyName": "<string>",
"limit": 10,
"knownProfiles": [
"<string>"
]
}
'import requests
url = "https://api.scrapebento.com/v1/public/scrape/linkedin/employees"
payload = {
"url": "<string>",
"wait": True,
"waitTimeoutMs": 123,
"webhookUrl": "<string>",
"idempotencyKey": "<string>",
"cacheTtlSec": 302400,
"fresh": True,
"companyName": "<string>",
"limit": 10,
"knownProfiles": ["<string>"]
}
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({
url: '<string>',
wait: true,
waitTimeoutMs: 123,
webhookUrl: '<string>',
idempotencyKey: '<string>',
cacheTtlSec: 302400,
fresh: true,
companyName: '<string>',
limit: 10,
knownProfiles: ['<string>']
})
};
fetch('https://api.scrapebento.com/v1/public/scrape/linkedin/employees', 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.scrapebento.com/v1/public/scrape/linkedin/employees",
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([
'url' => '<string>',
'wait' => true,
'waitTimeoutMs' => 123,
'webhookUrl' => '<string>',
'idempotencyKey' => '<string>',
'cacheTtlSec' => 302400,
'fresh' => true,
'companyName' => '<string>',
'limit' => 10,
'knownProfiles' => [
'<string>'
]
]),
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.scrapebento.com/v1/public/scrape/linkedin/employees"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\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.scrapebento.com/v1/public/scrape/linkedin/employees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrapebento.com/v1/public/scrape/linkedin/employees")
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 \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"jobId": "<string>",
"status": "succeeded",
"creditsCharged": 123,
"result": {
"employees": [
{
"name": "<string>",
"title": "<string>",
"bio": "<string>",
"avatarUrl": "<string>",
"linkedinUrl": "<string>",
"handle": "<string>",
"externalId": "<string>",
"raw": {}
}
],
"employeeTotalReported": 1,
"employeesComplete": false,
"verifiedProfiles": [
"<string>"
],
"inactiveProfiles": [
"<string>"
],
"discovery": {
"provider": "public_search",
"requestedLimit": 25,
"queriesAttempted": 1,
"queriesSucceeded": 1,
"queryOutcomes": [
{
"kind": "ceo",
"provider": "<string>",
"results": 1,
"status": "ok",
"error": "<string>"
}
],
"candidatesEvaluated": 1,
"leadershipFound": 1,
"otherEmployeesFound": 1,
"knownProfilesChecked": 1,
"knownProfilesVerified": 1,
"knownProfilesInactive": 1,
"rejectionReasons": {}
}
},
"kind": "linkedin_employees",
"cached": true,
"completedAt": "2023-11-07T05:31:56Z",
"resultTruncated": true
}
}Discover current employees for a LinkedIn company
Requires api.write. Employee discovery runs independently from the
company channel scrape. The default public-search provider discovers
personal profiles through SERPs and verifies the exact current LinkedIn
company link without an authenticated LinkedIn session.
Returns discovery records: name, title, headline, avatar and profile URL. It does NOT return email addresses or phone numbers, and it is priced against the discovery tier of the people-data market rather than the enriched one.
curl --request POST \
--url https://api.scrapebento.com/v1/public/scrape/linkedin/employees \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"wait": true,
"waitTimeoutMs": 123,
"webhookUrl": "<string>",
"idempotencyKey": "<string>",
"cacheTtlSec": 302400,
"fresh": true,
"companyName": "<string>",
"limit": 10,
"knownProfiles": [
"<string>"
]
}
'import requests
url = "https://api.scrapebento.com/v1/public/scrape/linkedin/employees"
payload = {
"url": "<string>",
"wait": True,
"waitTimeoutMs": 123,
"webhookUrl": "<string>",
"idempotencyKey": "<string>",
"cacheTtlSec": 302400,
"fresh": True,
"companyName": "<string>",
"limit": 10,
"knownProfiles": ["<string>"]
}
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({
url: '<string>',
wait: true,
waitTimeoutMs: 123,
webhookUrl: '<string>',
idempotencyKey: '<string>',
cacheTtlSec: 302400,
fresh: true,
companyName: '<string>',
limit: 10,
knownProfiles: ['<string>']
})
};
fetch('https://api.scrapebento.com/v1/public/scrape/linkedin/employees', 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.scrapebento.com/v1/public/scrape/linkedin/employees",
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([
'url' => '<string>',
'wait' => true,
'waitTimeoutMs' => 123,
'webhookUrl' => '<string>',
'idempotencyKey' => '<string>',
'cacheTtlSec' => 302400,
'fresh' => true,
'companyName' => '<string>',
'limit' => 10,
'knownProfiles' => [
'<string>'
]
]),
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.scrapebento.com/v1/public/scrape/linkedin/employees"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\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.scrapebento.com/v1/public/scrape/linkedin/employees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrapebento.com/v1/public/scrape/linkedin/employees")
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 \"url\": \"<string>\",\n \"wait\": true,\n \"waitTimeoutMs\": 123,\n \"webhookUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\",\n \"cacheTtlSec\": 302400,\n \"fresh\": true,\n \"companyName\": \"<string>\",\n \"limit\": 10,\n \"knownProfiles\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"jobId": "<string>",
"status": "succeeded",
"creditsCharged": 123,
"result": {
"employees": [
{
"name": "<string>",
"title": "<string>",
"bio": "<string>",
"avatarUrl": "<string>",
"linkedinUrl": "<string>",
"handle": "<string>",
"externalId": "<string>",
"raw": {}
}
],
"employeeTotalReported": 1,
"employeesComplete": false,
"verifiedProfiles": [
"<string>"
],
"inactiveProfiles": [
"<string>"
],
"discovery": {
"provider": "public_search",
"requestedLimit": 25,
"queriesAttempted": 1,
"queriesSucceeded": 1,
"queryOutcomes": [
{
"kind": "ceo",
"provider": "<string>",
"results": 1,
"status": "ok",
"error": "<string>"
}
],
"candidatesEvaluated": 1,
"leadershipFound": 1,
"otherEmployeesFound": 1,
"knownProfilesChecked": 1,
"knownProfilesVerified": 1,
"knownProfilesInactive": 1,
"rejectionReasons": {}
}
},
"kind": "linkedin_employees",
"cached": true,
"completedAt": "2023-11-07T05:31:56Z",
"resultTruncated": true
}
}Authorizations
Send a workspace API token in the Authorization: Bearer <token> header.
Keys carry the satk_ prefix and spend your organization's credit
balance. GET /v1/public/balance reports what is left.
Test-mode keys (satk_test_), which drew on a separate self-refilling
allowance, have been retired and no longer authenticate.
Headers
Optional deduplication key, scoped to your organization. Re-sending a request with a key that was already used returns the original job instead of creating and charging for a second one.
Supersedes the idempotencyKey body field, which remains supported as
a deprecated alias. If both are present, this header wins.
255Body
LinkedIn company URL.
Wait for a terminal response before falling back to async job polling.
Optional client-requested sync wait timeout, bounded by the server maximum.
Optional public callback URL for terminal job delivery. Available to every organization.
Naming a URL here registers it as a webhook endpoint if it is not
registered already, so the signing secret exists before the first
delivery does. Fetch it from
GET /v1/public/webhooks/endpoints/{endpointId}/secret, or register
the endpoint up front with POST /v1/public/webhooks/endpoints to
have the secret in hand before you run anything.
Deliveries carry X-Scrapebento-Signature, an HMAC-SHA256 over
"<timestamp>.<body>" under that endpoint's own secret, so the
secret you need to verify your deliveries cannot forge anyone
else's. Every attempt is recorded in
GET /v1/public/webhooks/deliveries and can be re-sent from there.
Deprecated alias for the Idempotency-Key header, which is the
conventional transport and takes precedence when both are sent.
Still honoured so existing integrations keep working.
255How long this result may be reused, in seconds. Capped at 7 days (604800); larger values are clamped.
Omit it to accept the per-kind server default. Slow-moving kinds
cache by default — infra and brand for 6h, seo, sitemap,
site, and producthunt for 1h, and hn_search, hn_post, and
rss for 5m. Everything else defaults to no caching.
A cached result is charged at the same rate as a fresh scrape, so
the TTL is how stale an answer you can be billed for. Send 0 to
prevent this result being cached, and fresh: true to bypass an
existing cache entry on read.
0 <= x <= 604800Bypass cache and force a new scrape or search execution.
Company name used by the Bright Data employee filter.
Maximum verified non-leadership employees. Verified CEO/founders are additional.
1 <= x <= 25Existing LinkedIn personal-profile URLs to revalidate conservatively.
25Response
LinkedIn employee discovery completed and returned a terminal response.
- Option 1
- Option 2
Show child attributes
Show child attributes