curl --request GET \
--url https://api.exec.com/rest/v1/skills \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/skills"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/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.exec.com/rest/v1/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 => [
"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.exec.com/rest/v1/skills"
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.exec.com/rest/v1/skills")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/skills")
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{
"data": [
{
"id": "sk1a2b3c4d5e",
"name": "Procurement Selling",
"slug": "procurement-selling",
"description": "Ability to identify and sell procurement solutions effectively.",
"created_at": "2026-01-10T09:00:00Z",
"proficiency_summary": {
"participant_count": 25,
"scored_participant_count": 20,
"pct_proficient_plus": 60,
"avg_score": 72.5
}
},
{
"id": "sk6f7g8h9i0j",
"name": "Objection Handling",
"slug": "objection-handling",
"description": "Skill in addressing and overcoming prospect objections.",
"created_at": "2026-01-15T14:30:00Z",
"proficiency_summary": {
"participant_count": 18,
"scored_participant_count": 15,
"pct_proficient_plus": 40,
"avg_score": 65.3
}
}
],
"pagination": {
"page": 1,
"page_size": 50,
"total_count": 2,
"total_pages": 1
}
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}List skills
Returns a paginated list of skills in the workspace, ordered alphabetically by name.
Skills represent competencies that are evaluated during roleplay sessions and calls (e.g. “Discovery Questions”, “Objection Handling”, “Procurement Selling”). Each skill can be linked to evaluation criteria across multiple scenarios.
Use ?include=proficiency to add aggregate proficiency stats per skill (participant
count, scored participant count, percentage proficient+, and average score). This is
computed across all workspace members who have practiced each skill.
curl --request GET \
--url https://api.exec.com/rest/v1/skills \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/skills"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/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.exec.com/rest/v1/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 => [
"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.exec.com/rest/v1/skills"
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.exec.com/rest/v1/skills")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/skills")
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{
"data": [
{
"id": "sk1a2b3c4d5e",
"name": "Procurement Selling",
"slug": "procurement-selling",
"description": "Ability to identify and sell procurement solutions effectively.",
"created_at": "2026-01-10T09:00:00Z",
"proficiency_summary": {
"participant_count": 25,
"scored_participant_count": 20,
"pct_proficient_plus": 60,
"avg_score": 72.5
}
},
{
"id": "sk6f7g8h9i0j",
"name": "Objection Handling",
"slug": "objection-handling",
"description": "Skill in addressing and overcoming prospect objections.",
"created_at": "2026-01-15T14:30:00Z",
"proficiency_summary": {
"participant_count": 18,
"scored_participant_count": 15,
"pct_proficient_plus": 40,
"avg_score": 65.3
}
}
],
"pagination": {
"page": 1,
"page_size": 50,
"total_count": 2,
"total_pages": 1
}
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}Authorizations
API key created in Settings > API.
Format: exec_live_ followed by 40 alphanumeric characters.
Query Parameters
Comma-separated list of optional data to include.
Available values: proficiency (aggregate proficiency stats per skill).
"proficiency"
Page number (1-indexed)
x >= 1Number of results per page (max 100)
1 <= x <= 100