curl --request POST \
--url https://api.decimal.ai/api/v1/agents/skills/batch-assign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"skill_ids": [
"<string>"
],
"agent_names": [
"<string>"
],
"pairs": [
{
"agent_name": "<string>",
"skill_id": "<string>",
"pin_version_id": "<string>"
}
],
"pin_version_id": "<string>"
}
'import requests
url = "https://api.decimal.ai/api/v1/agents/skills/batch-assign"
payload = {
"skill_ids": ["<string>"],
"agent_names": ["<string>"],
"pairs": [
{
"agent_name": "<string>",
"skill_id": "<string>",
"pin_version_id": "<string>"
}
],
"pin_version_id": "<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({
skill_ids: ['<string>'],
agent_names: ['<string>'],
pairs: [{agent_name: '<string>', skill_id: '<string>', pin_version_id: '<string>'}],
pin_version_id: '<string>'
})
};
fetch('https://api.decimal.ai/api/v1/agents/skills/batch-assign', 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.decimal.ai/api/v1/agents/skills/batch-assign",
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([
'skill_ids' => [
'<string>'
],
'agent_names' => [
'<string>'
],
'pairs' => [
[
'agent_name' => '<string>',
'skill_id' => '<string>',
'pin_version_id' => '<string>'
]
],
'pin_version_id' => '<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.decimal.ai/api/v1/agents/skills/batch-assign"
payload := strings.NewReader("{\n \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\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.decimal.ai/api/v1/agents/skills/batch-assign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/agents/skills/batch-assign")
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 \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Assign many skills to many agents in a single request
Batch equivalent of POST /{agent_name}/skills/{skill_id}.
Idempotent per pair (re-assigning an existing pair updates its pin). One unknown/foreign skill or a single bad pair does NOT fail the batch — it’s reported as an error item so the caller can surface a partial result, the same way the old client-side loop tolerated per-agent failures.
curl --request POST \
--url https://api.decimal.ai/api/v1/agents/skills/batch-assign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"skill_ids": [
"<string>"
],
"agent_names": [
"<string>"
],
"pairs": [
{
"agent_name": "<string>",
"skill_id": "<string>",
"pin_version_id": "<string>"
}
],
"pin_version_id": "<string>"
}
'import requests
url = "https://api.decimal.ai/api/v1/agents/skills/batch-assign"
payload = {
"skill_ids": ["<string>"],
"agent_names": ["<string>"],
"pairs": [
{
"agent_name": "<string>",
"skill_id": "<string>",
"pin_version_id": "<string>"
}
],
"pin_version_id": "<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({
skill_ids: ['<string>'],
agent_names: ['<string>'],
pairs: [{agent_name: '<string>', skill_id: '<string>', pin_version_id: '<string>'}],
pin_version_id: '<string>'
})
};
fetch('https://api.decimal.ai/api/v1/agents/skills/batch-assign', 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.decimal.ai/api/v1/agents/skills/batch-assign",
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([
'skill_ids' => [
'<string>'
],
'agent_names' => [
'<string>'
],
'pairs' => [
[
'agent_name' => '<string>',
'skill_id' => '<string>',
'pin_version_id' => '<string>'
]
],
'pin_version_id' => '<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.decimal.ai/api/v1/agents/skills/batch-assign"
payload := strings.NewReader("{\n \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\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.decimal.ai/api/v1/agents/skills/batch-assign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/agents/skills/batch-assign")
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 \"skill_ids\": [\n \"<string>\"\n ],\n \"agent_names\": [\n \"<string>\"\n ],\n \"pairs\": [\n {\n \"agent_name\": \"<string>\",\n \"skill_id\": \"<string>\",\n \"pin_version_id\": \"<string>\"\n }\n ],\n \"pin_version_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Enter your API key (e.g. dai_sk_test_key_001)
Cookies
Body
Assign many skills to many agents in one call.
Two ways to specify the work; each resulting pair behaves exactly like a
single POST /{agent_name}/skills/{skill_id} call:
• pairs — explicit (agent_name, skill_id[, pin_version_id]) tuples.
• skill_ids × agent_names — the cartesian product (assign every
listed skill to every listed agent), i.e. the common "install this
bundle onto these agents" case. pin_version_id applies to all pairs
built this way.
pairs wins when both forms are present.
Response
Successful Response
The response is of type Response Batch Assign Skills To Agents Api V1 Agents Skills Batch Assign Post · object.