curl --request POST \
--url https://api.example.com/api/plugins/install \
--header 'Content-Type: application/json' \
--header 'X-Session-API-Key: <api-key>' \
--data '
{
"source": "<string>",
"force": false,
"ref": "<string>",
"repo_path": "<string>"
}
'import requests
url = "https://api.example.com/api/plugins/install"
payload = {
"source": "<string>",
"force": False,
"ref": "<string>",
"repo_path": "<string>"
}
headers = {
"X-Session-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Session-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({source: '<string>', force: false, ref: '<string>', repo_path: '<string>'})
};
fetch('https://api.example.com/api/plugins/install', 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.example.com/api/plugins/install",
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([
'source' => '<string>',
'force' => false,
'ref' => '<string>',
'repo_path' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Session-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/plugins/install"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Session-API-Key", "<api-key>")
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.example.com/api/plugins/install")
.header("X-Session-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/plugins/install")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Session-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"install_path": "<string>",
"installed_at": "<string>",
"name": "<string>",
"source": "<string>",
"description": "",
"enabled": true,
"files": [
"<string>"
],
"repo_path": "<string>",
"resolved_ref": "<string>",
"skills": [
{
"name": "<string>",
"description": "<string>"
}
],
"version": ""
}Install Plugin Endpoint
Install a plugin from a git URL, GitHub shorthand, or local path.
curl --request POST \
--url https://api.example.com/api/plugins/install \
--header 'Content-Type: application/json' \
--header 'X-Session-API-Key: <api-key>' \
--data '
{
"source": "<string>",
"force": false,
"ref": "<string>",
"repo_path": "<string>"
}
'import requests
url = "https://api.example.com/api/plugins/install"
payload = {
"source": "<string>",
"force": False,
"ref": "<string>",
"repo_path": "<string>"
}
headers = {
"X-Session-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Session-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({source: '<string>', force: false, ref: '<string>', repo_path: '<string>'})
};
fetch('https://api.example.com/api/plugins/install', 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.example.com/api/plugins/install",
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([
'source' => '<string>',
'force' => false,
'ref' => '<string>',
'repo_path' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Session-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/plugins/install"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Session-API-Key", "<api-key>")
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.example.com/api/plugins/install")
.header("X-Session-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/plugins/install")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Session-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source\": \"<string>\",\n \"force\": false,\n \"ref\": \"<string>\",\n \"repo_path\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"install_path": "<string>",
"installed_at": "<string>",
"name": "<string>",
"source": "<string>",
"description": "",
"enabled": true,
"files": [
"<string>"
],
"repo_path": "<string>",
"resolved_ref": "<string>",
"skills": [
{
"name": "<string>",
"description": "<string>"
}
],
"version": ""
}Authorizations
Body
Request body for installing a plugin.
Plugin source - git URL, GitHub shorthand, or local path. Examples: 'github:OpenHands/extensions/plugins/city-weather', '/path/to/plugin'
1If true, overwrite existing installation
Optional branch, tag, or commit to install
Subdirectory path within the repository (for monorepos)
Response
Successful Response
Response containing installed plugin information.
Path where the plugin is installed
ISO 8601 timestamp of installation
Plugin name
Original source (e.g., 'github:owner/repo')
Plugin description
Whether the plugin is enabled
Plugin files, relative to install_path (None if load failed)
Subdirectory path within the repository
Resolved git commit SHA
Skills bundled in the plugin (None if it failed to load)
Show child attributes
Show child attributes
Plugin version
Was this page helpful?

