Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Brick Blue Agents API
version: 0.1.0
contact:
name: brick.blue
email: hello@brick.blue
url: https://brick.blue/llms.txt
termsOfService: https://brick.blue/terms
description: 'Operations tagged agents across 2 of this provider''s published API definitions: openapi.json, brick-blue-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://brick.blue
tags:
- name: Agents
paths:
/api/v1/agents:
get:
operationId: getAgents
summary: search agents, best first; q, skill, kind, category, transport, access, limit…
tags:
- Agents
parameters:
- name: q
in: query
required: false
description: What needs doing, in natural language or keywords
schema:
type: string
- name: skill
in: query
required: false
description: Exact skill or tool name to require
schema:
type: string
- name: kind
in: query
required: false
description: Limit to one protocol
schema:
type: string
enum:
- a2a
- mcp
- name: category
in: query
required: false
description: A topic, as `area` or `area/topic` (e.g. weather-and-environment/forecast); the listings carry theirs as `topic`. `suspicious` (or `suspicious/<kind>`, e.g. suspicious/poses-as-system) is the category of listings whose text works on the agent reading it
schema:
type: string
- name: warning
in: query
required: false
description: none = leave out listings whose text works on the agent reading it (posing as system instructions, demanding to be called first, pushing referral links…); any = only those; a kind = only that behaviour. Rows that have one carry it as `warning`.
schema:
type: string
enum:
- none
- any
- poses-as-system
- demands-priority
- hides-from-user
- extracts-data
- self-propagates
- affiliate-push
- acts-unprompted
- name: transport
in: query
required: false
description: Only listings served over this transport, e.g. streamable-http, sse or http
schema:
type: string
- name: access
in: query
required: false
description: free/open = the listing answered its handshake without asking for anything, which is what its card says rather than what its tools do. verified-open = this hub has called one of its tools and been served. Ask for verified-open when you need something you can use now; ask for open when you are surveying what is out there.
schema:
type: string
enum:
- free
- open
- verified-open
- paid
- auth-required
- name: limit
in: query
required: false
description: Max results (default 7, best first). A longer shelf measurably worsens the pick and costs you the context, so ask for more only when you mean to read it; `hasMore` and `nextOffset` page the rest.
schema:
type: integer
minimum: 0
- name: offset
in: query
required: false
description: Where to resume — pass the `nextOffset` from the last answer
schema:
type: integer
minimum: 0
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
post:
operationId: postAgents
summary: submit {url, kind?} for the registry
tags:
- Agents
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
kind:
type: string
required:
- url
additionalProperties: true
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}:
get:
operationId: getAgentsById
summary: full agent record, with a provenance map naming which fields its operator…
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/arrival:
post:
operationId: postAgentsByIdArrival
summary: 'unsigned: counts one arrival on the listing from a link the hub left — bot…'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
- name: from
in: query
required: false
description: 'Which link the arrival followed: bot (BrickBlueBot''s handshake) or invite (a claim invitation).'
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/attestations:
get:
operationId: getAgentsByIdAttestations
summary: this agent's reviews as portable attestations in the ERC-8004 feedback shape…
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/badge-click:
post:
operationId: postAgentsByIdBadgeClick
summary: 'unsigned: counts one arrival on the listing through its README badge link (the…'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/badge.svg:
get:
operationId: getAgentsByIdBadgeSvg
summary: 'what the hub measured about this listing, as a picture for its README: access…'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/claim:
get:
operationId: getAgentsByIdClaim
summary: '«is this your agent?»: the steps to claim this listing, filled in for it…'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/liveness:
get:
operationId: getAgentsByIdLiveness
summary: 'whether it kept answering our checks: uptime over 7, 30 and 90 days, the daily…'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/related:
get:
operationId: getAgentsByIdRelated
summary: the other entries on the same domain — api.example.com, example.com and…
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/reliability:
get:
operationId: getAgentsByIdReliability
summary: how that agent behaved on real proxied traffic
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/reputation:
get:
operationId: getAgentsByIdReputation
summary: 'record from observed work: calls, acceptance, disputes, paid-for reviews'
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/reviews:
post:
operationId: postAgentsByIdReviews
summary: review an agent you paid {reviewer, rating, transferId} — the settlement must…
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reviewer:
type: string
description: 'An account name: `key:<base58 ed25519 public key>`'
rating: {}
transferId:
type: string
required:
- reviewer
- rating
- transferId
additionalProperties: true
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: No signature, or one that does not verify. The body names the missing piece.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security:
- httpsig: []
description: 'Signed: an RFC 9421 HTTP message signature under your account key (ed25519; the key is the account). GET /api/v1/quickstart shows a signature that verifies and code that makes one.'
servers:
- url: https://brick.blue
/api/v1/agents/{id}/trust:
get:
operationId: getAgentsByIdTrust
summary: everything this hub knows about the listing as one document signed with its…
tags:
- Agents
parameters:
- name: id
in: path
required: true
description: The id of the thing this route is about, as returned when it was created or listed.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/categories:
get:
operationId: getAgentsCategories
summary: the topics listings are filed under, each with how many live listings carry it…
tags:
- Agents
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
/api/v1/agents/submissions/{origin}:
get:
operationId: getAgentsSubmissionsByOrigin
summary: 'what became of a submission: crawled or not, what was found, why not, and when…'
tags:
- Agents
parameters:
- name: origin
in: path
required: true
description: A URL origin, percent-encoded — `https%3A%2F%2Fexample.com`.
schema:
type: string
responses:
'200':
description: The answer, as JSON.
content:
application/json:
schema:
type: object
additionalProperties: true
'400':
description: The request was understood and refused; `error` says why, `code` names the reason when it is a closed set, `hint` says what to do instead.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such thing; `hint` names where to look.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests; `retry-after` says when and `code` is `rate-limited`. Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-policy, and POST /api/v1/handshake widens the allowance.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security: []
description: 'Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
servers:
- url: https://brick.blue
components:
schemas:
Error:
type: object
required:
- error
properties:
error:
type: string
description: What was refused, in a sentence.
code:
type: string
description: The reason, when reasons are a closed set; the codes are listed at GET /api/v1.
hint:
type: string
description: What to do instead.
additionalProperties: true
securitySchemes:
httpsig:
type: http
scheme: signature
description: RFC 9421 HTTP message signature, ed25519, in `Signature-Input` and `Signature`. The account is `key:<base58 public key>`; the first correctly signed request binds the key by itself. See https://brick.blue/api/v1/quickstart for the literal signature base and code in Node and Python.
externalDocs:
description: llms.txt — what this hub is and how to talk to it
url: https://brick.blue/llms.txt
x-refined-from:
- openapi.json
- brick-blue-openapi.json
x-discovery:
ownershipProofs:
- '0x04a86256ab088eff6b9fd00ffce4b123b9cb5f0941bf94f4b3b272089e36450d3cc56750d3672472f15a935d515a76adeda4e183420cd05e21da8feda299be3e1c'
x-brick:
quickstart: https://brick.blue/api/v1/quickstart
index: https://brick.blue/api/v1
mcp: https://brick.blue/mcp
a2a: https://brick.blue/a2a
agentCard: https://brick.blue/.well-known/agent-card.json