curl --request GET \
--url https://api.runaether.dev/v1/integration-search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/v1/integration-search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/v1/integration-search', 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.runaether.dev/v1/integration-search",
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.runaether.dev/v1/integration-search"
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.runaether.dev/v1/integration-search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/integration-search")
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{
"results": [
{
"integration": {
"aliases": [
"<string>"
],
"category": "issue_tracking",
"default_credential_policy": "creator",
"description": "<string>",
"display_name": "<string>",
"homepage": "<string>",
"installs_as": "server",
"key": "<string>",
"source": {
"kind": "marketplace",
"marketplace_url": "<string>",
"plugin": "<string>"
}
},
"kind": "integration",
"installed": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "plugin"
}
}
],
"sources": [
{
"kind": "directory",
"status": {
"state": "available"
}
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Search integrations by name
Finds integrations across Aether’s integration directory and the organization’s plugin marketplaces (the official Claude Code and Codex ones), one result per integration: an integration of the directory, installed by its key, or a plugin a marketplace lists, installed by the marketplace’s URL and its name. A directory entry hides every marketplace plugin of its name, the one it prefers included. An integration’s source says what it contains and its default_credential_policy whose connection it takes; a marketplace’s listing does not say what a plugin bundles, which Aether reads from its files when it installs it. installed names the card of what the organization installed: an integration’s plugin or, installed as its server alone, that server; the organization’s plugin of a marketplace plugin’s name. It is absent for what is not installed. sources reports every source with its status: a marketplace Aether could not read is unavailable, with why, and contributes no results; it is never reported as listing none. A marketplace’s listing is read again once it is ten minutes old, and a marketplace that could not be read is tried again a minute later.
curl --request GET \
--url https://api.runaether.dev/v1/integration-search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/v1/integration-search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/v1/integration-search', 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.runaether.dev/v1/integration-search",
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.runaether.dev/v1/integration-search"
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.runaether.dev/v1/integration-search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/integration-search")
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{
"results": [
{
"integration": {
"aliases": [
"<string>"
],
"category": "issue_tracking",
"default_credential_policy": "creator",
"description": "<string>",
"display_name": "<string>",
"homepage": "<string>",
"installs_as": "server",
"key": "<string>",
"source": {
"kind": "marketplace",
"marketplace_url": "<string>",
"plugin": "<string>"
}
},
"kind": "integration",
"installed": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "plugin"
}
}
],
"sources": [
{
"kind": "directory",
"status": {
"state": "available"
}
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
What to find: matched, ignoring case, against each integration's and plugin's name, then its description, category and, for an integration of the directory, its aliases.
1 - 100\SResponse
OK
One per integration: a directory entry hides every marketplace plugin of its name, the one it prefers included, and of the plugins marketplaces list under one name the first that matches is the result. Results whose name holds the query come first, then those whose description, category or aliases do; within each, the directory's, then each marketplace's in turn.
- Option 1
- Option 2
Show child attributes
Show child attributes
The integration directory, then each of the organization's marketplaces, each with its status.
- Option 1
- Option 2
Show child attributes
Show child attributes