Listings & Categories
Listings
Browse and manage agent listings in the marketplace.
GET /agents/marketplace/listings
List all available marketplace listings with cursor-based pagination.
Authentication: JWT Bearer token + active entitlement Rate limit: 60 requests/min
Request
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | No | Number of results to return (default: 20) |
cursor | string | No | Pagination cursor from previous response |
Response
Response Example
{
"data": [
{
"id": "cm5list01",
"name": "Productivity Coach Pro",
"description": "An advanced AI agent for workflow automation and productivity optimization",
"categoryId": "cm5cat01",
"publisherId": "cm5user01",
"version": "2.1.0",
"installCount": 1250,
"rating": 4.7,
"reviewCount": 89,
"pricing": {
"type": "free"
},
"tags": ["productivity", "workflows", "coaching"],
"createdAt": "2026-02-01T00:00:00.000Z",
"updatedAt": "2026-03-15T00:00:00.000Z"
},
{
"id": "cm5list02",
"name": "Team Standup Bot",
"description": "Automates daily standup collection and summaries for teams",
"categoryId": "cm5cat02",
"publisherId": "cm5user02",
"version": "1.3.0",
"installCount": 340,
"rating": 4.2,
"reviewCount": 28,
"pricing": {
"type": "credits",
"amount": 5
},
"tags": ["team", "standup", "automation"],
"createdAt": "2026-01-15T00:00:00.000Z",
"updatedAt": "2026-03-10T00:00:00.000Z"
}
],
"meta": {
"total": 2,
"cursor": null,
"hasMore": false
},
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Listing ID |
name | string | Listing name |
description | string | Short description |
categoryId | string | Category ID |
publisherId | string | Publisher user ID |
version | string | Semantic version |
installCount | number | Total install count |
rating | number | null | Average rating (1–5) |
reviewCount | number | Number of reviews |
pricing.type | string | free or credits |
pricing.amount | number | null | Credit cost (when type is credits) |
tags | string[] | Searchable tags |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last update timestamp |
Code Examples
curl "https://api.chainabit.com/api/v1/agents/marketplace/listings?limit=10" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/listings?limit=10`, {
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.get(
f"{BASE_URL}/agents/marketplace/listings",
params={"limit": 10},
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()GET /agents/marketplace/listings/:id
Retrieve full details for a single marketplace listing.
Authentication: JWT Bearer token + active entitlement Rate limit: 60 requests/min
Request
Use the id of a listing (from the list above, or a create/update response) as $LISTING_ID.
Response
Response Example
{
"data": {
"id": "cm5list01",
"name": "Productivity Coach Pro",
"description": "An advanced AI agent for workflow automation and productivity optimization",
"longDescription": "This agent leverages behavioral science principles to help you build lasting workflows...",
"categoryId": "cm5cat01",
"publisherId": "cm5user01",
"definitionId": "cm5def01",
"version": "2.1.0",
"installCount": 1250,
"rating": 4.7,
"reviewCount": 89,
"pricing": {
"type": "free"
},
"tags": ["productivity", "workflows", "coaching"],
"capabilities": ["coaching", "analysis", "scheduling"],
"requirements": {
"entitlements": ["ai.agent.use"]
},
"createdAt": "2026-02-01T00:00:00.000Z",
"updatedAt": "2026-03-15T00:00:00.000Z"
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Listing ID |
name | string | Listing name |
description | string | Short description |
longDescription | string | null | Full Markdown description |
categoryId | string | Category ID |
publisherId | string | Publisher user ID |
definitionId | string | Agent definition ID |
version | string | Semantic version |
installCount | number | Total install count |
rating | number | null | Average rating (1–5) |
reviewCount | number | Number of reviews |
pricing.type | string | free or credits |
pricing.amount | number | null | Credit cost (when type is credits) |
tags | string[] | Searchable tags |
capabilities | string[] | Agent capability keys |
requirements.entitlements | string[] | Required entitlement keys |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last update timestamp |
Code Examples
curl "https://api.chainabit.com/api/v1/agents/marketplace/listings/$LISTING_ID" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/listings/${LISTING_ID}`, {
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.get(
f"{BASE_URL}/agents/marketplace/listings/{LISTING_ID}",
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()POST /agents/marketplace/listings
Publish a new agent listing to the marketplace.
Authentication: JWT Bearer token + active entitlement Rate limit: 10 requests/min
Request
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | Yes | 1–100 chars | Listing name |
description | string | Yes | 1–300 chars | Short description |
longDescription | string | No | Markdown supported | Full detailed description |
categoryId | string | Yes | Valid category ID | Category ID |
definitionId | string | Yes | Valid definition ID | Agent definition ID to publish |
version | string | Yes | Semantic version | Semantic version string |
pricing | object | Yes | { type: "free" } or { type: "credits", amount: number } | Pricing configuration |
tags | string[] | No | Searchable tags |
Use the id of an existing category (from GET /agents/marketplace/categories below) as $CATEGORY_ID, and the id of an agent definition you own as $DEFINITION_ID.
Response
Response Example
{
"data": {
"id": "cm5list03",
"name": "Focus Timer Agent",
"description": "An AI agent that helps manage focus sessions with adaptive timing",
"categoryId": "cm5cat01",
"definitionId": "cm5def02",
"version": "1.0.0",
"installCount": 0,
"rating": null,
"reviewCount": 0,
"pricing": { "type": "free" },
"tags": ["focus", "timer", "pomodoro"],
"createdAt": "2026-03-17T10:00:00.000Z",
"updatedAt": "2026-03-17T10:00:00.000Z"
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Listing ID |
name | string | Listing name |
description | string | Short description |
categoryId | string | Category ID |
definitionId | string | Agent definition ID |
version | string | Semantic version |
installCount | number | Total install count |
rating | number | null | Average rating (1–5) |
reviewCount | number | Number of reviews |
pricing.type | string | free or credits |
pricing.amount | number | null | Credit cost (when type is credits) |
tags | string[] | Searchable tags |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last update timestamp |
Code Examples
curl -X POST "https://api.chainabit.com/api/v1/agents/marketplace/listings" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Focus Timer Agent",
"description": "An AI agent that helps manage focus sessions with adaptive timing",
"categoryId": "'"$CATEGORY_ID"'",
"definitionId": "'"$DEFINITION_ID"'",
"version": "1.0.0",
"pricing": { "type": "free" },
"tags": ["focus", "timer", "pomodoro"]
}'const response = await fetch(`${BASE_URL}/agents/marketplace/listings`, {
method: "POST",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Focus Timer Agent",
description: "An AI agent that helps manage focus sessions with adaptive timing",
categoryId: CATEGORY_ID, // an existing category's id
definitionId: DEFINITION_ID, // the agent definition's id to publish
version: "1.0.0",
pricing: { type: "free" },
tags: ["focus", "timer", "pomodoro"],
}),
});
const data = await response.json();import requests
response = requests.post(
f"{BASE_URL}/agents/marketplace/listings",
headers={
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json",
},
json={
"name": "Focus Timer Agent",
"description": "An AI agent that helps manage focus sessions with adaptive timing",
"categoryId": CATEGORY_ID, # an existing category's id
"definitionId": DEFINITION_ID, # the agent definition's id to publish
"version": "1.0.0",
"pricing": {"type": "free"},
"tags": ["focus", "timer", "pomodoro"],
},
)
data = response.json()PATCH /agents/marketplace/listings/:id
Partially update an existing marketplace listing.
Authentication: JWT Bearer token + active entitlement Rate limit: 30 requests/min
Request
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | No | 1–100 chars | Listing name |
description | string | No | 1–300 chars | Short description |
longDescription | string | No | Markdown supported | Full detailed description |
categoryId | string | No | Valid category ID | Category ID |
version | string | No | Semantic version | Semantic version string |
pricing | object | No | { type: "free" } or { type: "credits", amount: number } | Pricing configuration |
tags | string[] | No | Searchable tags |
Use the id of the listing you're updating (from a list, detail, or create response) as $LISTING_ID.
Response
Response Example
{
"data": {
"id": "cm5list01",
"name": "Productivity Coach Pro",
"description": "An advanced AI agent for workflow automation and productivity optimization",
"categoryId": "cm5cat01",
"publisherId": "cm5user01",
"version": "2.2.0",
"installCount": 1250,
"rating": 4.7,
"reviewCount": 89,
"pricing": {
"type": "free"
},
"tags": ["productivity", "workflows", "coaching", "ai"],
"createdAt": "2026-02-01T00:00:00.000Z",
"updatedAt": "2026-03-17T11:00:00.000Z"
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Listing ID |
name | string | Listing name |
description | string | Short description |
categoryId | string | Category ID |
publisherId | string | Publisher user ID |
version | string | Semantic version |
installCount | number | Total install count |
rating | number | null | Average rating (1–5) |
reviewCount | number | Number of reviews |
pricing.type | string | free or credits |
pricing.amount | number | null | Credit cost (when type is credits) |
tags | string[] | Searchable tags |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last update timestamp |
Code Examples
curl -X PATCH "https://api.chainabit.com/api/v1/agents/marketplace/listings/$LISTING_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"version": "2.2.0",
"tags": ["productivity", "workflows", "coaching", "ai"]
}'const response = await fetch(`${BASE_URL}/agents/marketplace/listings/${LISTING_ID}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
version: "2.2.0",
tags: ["productivity", "workflows", "coaching", "ai"],
}),
});
const data = await response.json();import requests
response = requests.patch(
f"{BASE_URL}/agents/marketplace/listings/{LISTING_ID}",
headers={
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json",
},
json={
"version": "2.2.0",
"tags": ["productivity", "workflows", "coaching", "ai"],
},
)
data = response.json()DELETE /agents/marketplace/listings/:id
Remove a marketplace listing.
Authentication: JWT Bearer token + active entitlement Rate limit: 10 requests/min
Request
Use the id of the listing you're removing as $LISTING_ID.
Response
Response Example
{
"data": {
"id": "cm5list01",
"deletedAt": "2026-03-17T12:00:00.000Z"
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Listing ID |
deletedAt | string | ISO 8601 deletion timestamp |
Code Examples
curl -X DELETE "https://api.chainabit.com/api/v1/agents/marketplace/listings/$LISTING_ID" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/listings/${LISTING_ID}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.delete(
f"{BASE_URL}/agents/marketplace/listings/{LISTING_ID}",
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()Categories
Browse and manage marketplace categories for agent discovery.
GET /agents/marketplace/categories
List all available marketplace categories.
Authentication: JWT Bearer token + active entitlement Rate limit: 60 requests/min
Request
Response
Response Example
{
"data": [
{
"id": "cm5cat01",
"name": "Productivity",
"slug": "productivity",
"description": "Agents focused on productivity and workflow automation",
"listingCount": 15
},
{
"id": "cm5cat02",
"name": "Team Collaboration",
"slug": "team-collaboration",
"description": "Agents for team workflows and communication",
"listingCount": 8
}
],
"meta": {
"total": 2,
"cursor": null,
"hasMore": false
},
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Category ID |
name | string | Category name |
slug | string | URL-friendly identifier |
description | string | Category description |
listingCount | number | Number of listings in category |
Code Examples
curl "https://api.chainabit.com/api/v1/agents/marketplace/categories?limit=10" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/categories?limit=10`, {
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.get(
f"{BASE_URL}/agents/marketplace/categories",
params={"limit": 10},
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()GET /agents/marketplace/categories/:id
Retrieve full details for a single marketplace category.
Authentication: JWT Bearer token + active entitlement Rate limit: 60 requests/min
Request
Use the id of a category (from the list above, or a create response) as $CATEGORY_ID.
Response
Response Example
{
"data": {
"id": "cm5cat01",
"name": "Productivity",
"slug": "productivity",
"description": "Agents focused on productivity and workflow automation",
"listingCount": 15
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Category ID |
name | string | Category name |
slug | string | URL-friendly identifier |
description | string | Category description |
listingCount | number | Number of listings in category |
Code Examples
curl "https://api.chainabit.com/api/v1/agents/marketplace/categories/$CATEGORY_ID" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/categories/${CATEGORY_ID}`, {
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.get(
f"{BASE_URL}/agents/marketplace/categories/{CATEGORY_ID}",
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()POST /agents/marketplace/categories
Create a new marketplace category.
Authentication: JWT Bearer token + active entitlement Rate limit: 10 requests/min
Request
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | Yes | 1–100 chars | Category name |
slug | string | Yes | Lowercase, hyphens | URL-friendly identifier |
description | string | Yes | 1–300 chars | Category description |
Response
Response Example
{
"data": {
"id": "cm5cat03",
"name": "Developer Tools",
"slug": "developer-tools",
"description": "Agents for software development and engineering workflows",
"listingCount": 0
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Category ID |
name | string | Category name |
slug | string | URL-friendly identifier |
description | string | Category description |
listingCount | number | Number of listings in category |
Code Examples
curl -X POST "https://api.chainabit.com/api/v1/agents/marketplace/categories" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Developer Tools",
"slug": "developer-tools",
"description": "Agents for software development and engineering workflows"
}'const response = await fetch(`${BASE_URL}/agents/marketplace/categories`, {
method: "POST",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Developer Tools",
slug: "developer-tools",
description: "Agents for software development and engineering workflows",
}),
});
const data = await response.json();import requests
response = requests.post(
f"{BASE_URL}/agents/marketplace/categories",
headers={
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json",
},
json={
"name": "Developer Tools",
"slug": "developer-tools",
"description": "Agents for software development and engineering workflows",
},
)
data = response.json()PATCH /agents/marketplace/categories/:id
Partially update an existing marketplace category.
Authentication: JWT Bearer token + active entitlement Rate limit: 30 requests/min
Request
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
name | string | No | 1–100 chars | Category name |
slug | string | No | Lowercase, hyphens | URL-friendly identifier |
description | string | No | 1–300 chars | Category description |
Use the id of the category you're updating as $CATEGORY_ID.
Response
Response Example
{
"data": {
"id": "cm5cat01",
"name": "Productivity",
"slug": "productivity",
"description": "Agents focused on personal and team productivity optimization",
"listingCount": 15
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Category ID |
name | string | Category name |
slug | string | URL-friendly identifier |
description | string | Category description |
listingCount | number | Number of listings in category |
Code Examples
curl -X PATCH "https://api.chainabit.com/api/v1/agents/marketplace/categories/$CATEGORY_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "Agents focused on personal and team productivity optimization"
}'const response = await fetch(`${BASE_URL}/agents/marketplace/categories/${CATEGORY_ID}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
description: "Agents focused on personal and team productivity optimization",
}),
});
const data = await response.json();import requests
response = requests.patch(
f"{BASE_URL}/agents/marketplace/categories/{CATEGORY_ID}",
headers={
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json",
},
json={
"description": "Agents focused on personal and team productivity optimization",
},
)
data = response.json()DELETE /agents/marketplace/categories/:id
Remove a marketplace category.
Authentication: JWT Bearer token + active entitlement Rate limit: 10 requests/min
Request
Use the id of the category you're removing as $CATEGORY_ID.
Response
Response Example
{
"data": {
"id": "cm5cat01",
"deletedAt": "2026-03-17T12:00:00.000Z"
},
"meta": null,
"error": null
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Category ID |
deletedAt | string | ISO 8601 deletion timestamp |
Code Examples
curl -X DELETE "https://api.chainabit.com/api/v1/agents/marketplace/categories/$CATEGORY_ID" \
-H "Authorization: Bearer $TOKEN"const response = await fetch(`${BASE_URL}/agents/marketplace/categories/${CATEGORY_ID}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${TOKEN}`,
},
});
const data = await response.json();import requests
response = requests.delete(
f"{BASE_URL}/agents/marketplace/categories/{CATEGORY_ID}",
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()