curl --request GET \
--url https://api.agentpowers.ai/v1/searchimport requests
url = "https://api.agentpowers.ai/v1/search"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.agentpowers.ai/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"agentpowers": {
"items": [
{
"slug": "<string>",
"title": "<string>",
"description": "<string>",
"category": "<string>",
"type": "<string>",
"price_cents": 123,
"currency": "<string>",
"version": "<string>",
"security_status": "<string>",
"download_count": 123,
"long_description": "<string>",
"view_count": 0,
"install_count": 0,
"rating_average": 123,
"rating_count": 0,
"author": {
"display_name": "<string>",
"github_username": "<string>",
"display_name_slug": "<string>",
"avatar_url": "<string>",
"verified": false
},
"source": "<string>",
"source_url": "<string>",
"source_installs": 123,
"source_stars": 123
}
],
"total": 123,
"limit": 123,
"offset": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Search Marketplace
Full-text search across skills and agents. Returns sectioned results.
Sheds load past a process-wide concurrency cap so a request flood cannot starve the event loop and wedge /health into the liveness-watchdog crash loop seen in the 2026-06-16 outage (issue #197). Per-IP rate limiting still applies first via the @limiter decorator; this is the last-resort backstop.
Deliberately does NOT depend on the shared request connection: all of search’s DB work runs off the event loop on dedicated worker connections (issue #203, see _run_search_db), so the loop stays free to answer /health under load.
curl --request GET \
--url https://api.agentpowers.ai/v1/searchimport requests
url = "https://api.agentpowers.ai/v1/search"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.agentpowers.ai/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"agentpowers": {
"items": [
{
"slug": "<string>",
"title": "<string>",
"description": "<string>",
"category": "<string>",
"type": "<string>",
"price_cents": 123,
"currency": "<string>",
"version": "<string>",
"security_status": "<string>",
"download_count": 123,
"long_description": "<string>",
"view_count": 0,
"install_count": 0,
"rating_average": 123,
"rating_count": 0,
"author": {
"display_name": "<string>",
"github_username": "<string>",
"display_name_slug": "<string>",
"avatar_url": "<string>",
"verified": false
},
"source": "<string>",
"source_url": "<string>",
"source_installs": 123,
"source_stars": 123
}
],
"total": 123,
"limit": 123,
"offset": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Query Parameters
1 - 2001 <= x <= 100x >= 0^(skill|agent)$Response
Successful Response
Top-level search response with sections per source.
Always has 'agentpowers' key. External source keys added dynamically.
Show child attributes
Show child attributes
Was this page helpful?