curl --request GET \
--url https://api.fetchin.io/api/v1/profile/skills \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/skills"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fetchin.io/api/v1/profile/skills', 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.fetchin.io/api/v1/profile/skills",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.fetchin.io/api/v1/profile/skills"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.fetchin.io/api/v1/profile/skills")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/skills")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"skills": [
{
"name": "Public Speaking",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)",
"endorsements": 99,
"endorsementsCapped": true
}
],
"hasMore": true,
"nextStart": 100
}Get Profile Skills
Fetch the skills of a professional profile, with how many members endorsed each one
curl --request GET \
--url https://api.fetchin.io/api/v1/profile/skills \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/skills"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fetchin.io/api/v1/profile/skills', 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.fetchin.io/api/v1/profile/skills",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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.fetchin.io/api/v1/profile/skills"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.fetchin.io/api/v1/profile/skills")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/skills")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"skills": [
{
"name": "Public Speaking",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)",
"endorsements": 99,
"endorsementsCapped": true
}
],
"hasMore": true,
"nextStart": 100
}Endpoint
GET /api/v1/profile/skills
Authentication
Include your API key in the request header:X-API-Key: your-api-key-here
How it works
Get Profile already returns every skill with its name andskillUrn. This endpoint adds, for each skill, how many members endorsed it, so you know which skills have endorsers and how many pages Get Profile Skill Endorsers will take for each.
A member lists 100 skills at most, so the default page of 100 holds them all.
Parameters
- Profile URN. Example:
urn:li:fsd_profile:ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM - Public identifier (slug). Example:
billcorbettauthor - Profile URL. Example:
https://www.linkedin.com/in/billcorbettauthor(a trailing slash makes no difference)
400 error, free of charge.- Minimum: 1 —
0or a negative value is rejected with400 - Maximum: 100 — a higher value is clamped, not rejected
- Default: 100. A call costs the same whatever the
count.
0 (or omit it) for the first page, then the nextStart the previous response gave you. See Pagination.- Minimum: 0 — a negative value is rejected with
400 - Maximum: 100,000 — a higher value is capped, not rejected
Response
Show Skill object
Show Skill object
skills[].name on Get Profile.99 and carries endorsementsCapped. 0 when nobody endorsed the skill. Absent when the count could not be read on this call.true only when the source shows “99+”: the skill has more endorsements than endorsements says. Absent otherwise — never false. The full list is at Get Profile Skill Endorsers.true when the profile has more skills after this page. false on the last page.start value to request next. Present only when hasMore is true.Example Request
curl -X GET "https://api.fetchin.io/api/v1/profile/skills?profileUrlOrUrn=billcorbettauthor" \
-H "X-API-Key: your-api-key-here"
const response = await fetch(
'https://api.fetchin.io/api/v1/profile/skills?profileUrlOrUrn=billcorbettauthor',
{ headers: { 'X-API-Key': 'your-api-key-here' } }
);
const data = await response.json();
console.log(data.skills);
import requests
response = requests.get(
'https://api.fetchin.io/api/v1/profile/skills',
params={'profileUrlOrUrn': 'billcorbettauthor'},
headers={'X-API-Key': 'your-api-key-here'},
)
data = response.json()
print(data['skills'])
Example Response
{
"skills": [
{
"name": "Illustration",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,9)",
"endorsements": 0
},
{
"name": "Tweens",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,24)",
"endorsements": 2
},
{
"name": "Public Speaking",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)",
"endorsements": 99,
"endorsementsCapped": true
}
],
"hasMore": false
}
Errors
See Error Handling for the full list of error codes and recommended handling.400—MISSING_PARAMETER/INVALID_PARAMETER/INVALID_URN401—INVALID_API_KEY402—QUOTA_EXHAUSTED404—PROFILE_NOT_FOUND429—RATE_LIMITED500—INTERNAL_ERROR503—SERVICE_UNAVAILABLE. The page could not be fetched on this call: retry. A failed page is never returned as an empty list.
Pagination
The list is paged by offset, up to 100 skills per page.- Request the first page with
start=0(or omitstart). - If
hasMoreistrue, request the next page with thenextStartthe response gave you. - Continue until
hasMoreisfalse.
count of 100, one page holds every skill of a profile.
Notes
count. Errors are free — with one exception: a 404 not found costs 1 credit. See Quotas.endorsements: 0, then page through Get Profile Skill Endorsers for the others. A skill with endorsements under 100 fits in one page; one with endorsementsCapped takes two or more.Authorizations
Query Parameters
The professional profile. Accepts a profile URN (example urn:li:fsd_profile:ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM), a public identifier/slug (example billcorbettauthor), or a full profile URL (example https://www.linkedin.com/in/billcorbettauthor; a trailing slash is ignored). Member profiles only: a company page URL or URN is rejected with a 400 error, free of charge.
"billcorbettauthor"
Number of entries per page (default: 100, the most a page holds). A value above 100 is clamped to 100, not rejected. A call costs the same whatever the count.
1 <= x <= 100Offset of the first entry to return. Pass 0 (or omit) for the first page, then the nextStart of the previous response. Keep paging while hasMore is true.
x >= 0Response
Successfully fetched the skills