Skip to content

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

ParameterTypeRequiredDescription
limitnumberNoNumber of results to return (default: 20)
cursorstringNoPagination cursor from previous response

Response

Response Example
json
{
  "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
FieldTypeDescription
idstringListing ID
namestringListing name
descriptionstringShort description
categoryIdstringCategory ID
publisherIdstringPublisher user ID
versionstringSemantic version
installCountnumberTotal install count
ratingnumber | nullAverage rating (1–5)
reviewCountnumberNumber of reviews
pricing.typestringfree or credits
pricing.amountnumber | nullCredit cost (when type is credits)
tagsstring[]Searchable tags
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Code Examples

bash
curl "https://api.chainabit.com/api/v1/agents/marketplace/listings?limit=10" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/listings?limit=10`, {
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
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
json
{
  "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
FieldTypeDescription
idstringListing ID
namestringListing name
descriptionstringShort description
longDescriptionstring | nullFull Markdown description
categoryIdstringCategory ID
publisherIdstringPublisher user ID
definitionIdstringAgent definition ID
versionstringSemantic version
installCountnumberTotal install count
ratingnumber | nullAverage rating (1–5)
reviewCountnumberNumber of reviews
pricing.typestringfree or credits
pricing.amountnumber | nullCredit cost (when type is credits)
tagsstring[]Searchable tags
capabilitiesstring[]Agent capability keys
requirements.entitlementsstring[]Required entitlement keys
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Code Examples

bash
curl "https://api.chainabit.com/api/v1/agents/marketplace/listings/$LISTING_ID" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/listings/${LISTING_ID}`, {
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
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

FieldTypeRequiredConstraintsDescription
namestringYes1–100 charsListing name
descriptionstringYes1–300 charsShort description
longDescriptionstringNoMarkdown supportedFull detailed description
categoryIdstringYesValid category IDCategory ID
definitionIdstringYesValid definition IDAgent definition ID to publish
versionstringYesSemantic versionSemantic version string
pricingobjectYes{ type: "free" } or { type: "credits", amount: number }Pricing configuration
tagsstring[]NoSearchable 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
json
{
  "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
FieldTypeDescription
idstringListing ID
namestringListing name
descriptionstringShort description
categoryIdstringCategory ID
definitionIdstringAgent definition ID
versionstringSemantic version
installCountnumberTotal install count
ratingnumber | nullAverage rating (1–5)
reviewCountnumberNumber of reviews
pricing.typestringfree or credits
pricing.amountnumber | nullCredit cost (when type is credits)
tagsstring[]Searchable tags
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Code Examples

bash
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"]
  }'
javascript
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();
python
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

FieldTypeRequiredConstraintsDescription
namestringNo1–100 charsListing name
descriptionstringNo1–300 charsShort description
longDescriptionstringNoMarkdown supportedFull detailed description
categoryIdstringNoValid category IDCategory ID
versionstringNoSemantic versionSemantic version string
pricingobjectNo{ type: "free" } or { type: "credits", amount: number }Pricing configuration
tagsstring[]NoSearchable tags

Use the id of the listing you're updating (from a list, detail, or create response) as $LISTING_ID.

Response

Response Example
json
{
  "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
FieldTypeDescription
idstringListing ID
namestringListing name
descriptionstringShort description
categoryIdstringCategory ID
publisherIdstringPublisher user ID
versionstringSemantic version
installCountnumberTotal install count
ratingnumber | nullAverage rating (1–5)
reviewCountnumberNumber of reviews
pricing.typestringfree or credits
pricing.amountnumber | nullCredit cost (when type is credits)
tagsstring[]Searchable tags
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Code Examples

bash
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"]
  }'
javascript
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();
python
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
json
{
  "data": {
    "id": "cm5list01",
    "deletedAt": "2026-03-17T12:00:00.000Z"
  },
  "meta": null,
  "error": null
}
Response Fields
FieldTypeDescription
idstringListing ID
deletedAtstringISO 8601 deletion timestamp

Code Examples

bash
curl -X DELETE "https://api.chainabit.com/api/v1/agents/marketplace/listings/$LISTING_ID" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/listings/${LISTING_ID}`, {
  method: "DELETE",
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
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
json
{
  "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
FieldTypeDescription
idstringCategory ID
namestringCategory name
slugstringURL-friendly identifier
descriptionstringCategory description
listingCountnumberNumber of listings in category

Code Examples

bash
curl "https://api.chainabit.com/api/v1/agents/marketplace/categories?limit=10" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/categories?limit=10`, {
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
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
json
{
  "data": {
    "id": "cm5cat01",
    "name": "Productivity",
    "slug": "productivity",
    "description": "Agents focused on productivity and workflow automation",
    "listingCount": 15
  },
  "meta": null,
  "error": null
}
Response Fields
FieldTypeDescription
idstringCategory ID
namestringCategory name
slugstringURL-friendly identifier
descriptionstringCategory description
listingCountnumberNumber of listings in category

Code Examples

bash
curl "https://api.chainabit.com/api/v1/agents/marketplace/categories/$CATEGORY_ID" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/categories/${CATEGORY_ID}`, {
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
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

FieldTypeRequiredConstraintsDescription
namestringYes1–100 charsCategory name
slugstringYesLowercase, hyphensURL-friendly identifier
descriptionstringYes1–300 charsCategory description

Response

Response Example
json
{
  "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
FieldTypeDescription
idstringCategory ID
namestringCategory name
slugstringURL-friendly identifier
descriptionstringCategory description
listingCountnumberNumber of listings in category

Code Examples

bash
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"
  }'
javascript
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();
python
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

FieldTypeRequiredConstraintsDescription
namestringNo1–100 charsCategory name
slugstringNoLowercase, hyphensURL-friendly identifier
descriptionstringNo1–300 charsCategory description

Use the id of the category you're updating as $CATEGORY_ID.

Response

Response Example
json
{
  "data": {
    "id": "cm5cat01",
    "name": "Productivity",
    "slug": "productivity",
    "description": "Agents focused on personal and team productivity optimization",
    "listingCount": 15
  },
  "meta": null,
  "error": null
}
Response Fields
FieldTypeDescription
idstringCategory ID
namestringCategory name
slugstringURL-friendly identifier
descriptionstringCategory description
listingCountnumberNumber of listings in category

Code Examples

bash
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"
  }'
javascript
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();
python
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
json
{
  "data": {
    "id": "cm5cat01",
    "deletedAt": "2026-03-17T12:00:00.000Z"
  },
  "meta": null,
  "error": null
}
Response Fields
FieldTypeDescription
idstringCategory ID
deletedAtstringISO 8601 deletion timestamp

Code Examples

bash
curl -X DELETE "https://api.chainabit.com/api/v1/agents/marketplace/categories/$CATEGORY_ID" \
  -H "Authorization: Bearer $TOKEN"
javascript
const response = await fetch(`${BASE_URL}/agents/marketplace/categories/${CATEGORY_ID}`, {
  method: "DELETE",
  headers: {
    Authorization: `Bearer ${TOKEN}`,
  },
});
const data = await response.json();
python
import requests

response = requests.delete(
    f"{BASE_URL}/agents/marketplace/categories/{CATEGORY_ID}",
    headers={"Authorization": f"Bearer {TOKEN}"},
)
data = response.json()

Built with purpose.