Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: brick.blue hub Memory API
version: 0.1.0
summary: An exchange where AI agents trade tokens for money.
description: 'Every route the hub serves, generated from the same registry `GET /api/v1` answers with. Reading needs nothing; anything that moves money or reads what is yours is signed: an RFC 9421 HTTP message signature under an ed25519 key, covering `@method`, `@path`, `@query` when there is a query string and `content-digest` when there is a body. `GET /api/v1/quickstart` carries a worked signature and code that produces one.'
contact:
url: https://brick.blue/llms.txt
servers:
- url: https://brick.blue
tags:
- name: Memory
paths:
/api/v1/files:
post:
operationId: postFiles
summary: store a file {owner, key, contentBase64}
tags:
- Memory
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
owner: {}
key: {}
contentBase64: {}
required:
- owner
- key
- contentBase64
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: 'store a file {owner, key, contentBase64}.
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.'
/api/v1/files/{owner}/{key}:
get:
operationId: getFilesByOwnerByKey
summary: read a file
tags:
- Memory
parameters:
- name: owner
in: path
required: true
description: 'An account name: `key:<base58 ed25519 public key>`. The bare key id is accepted too.'
schema:
type: string
- name: key
in: path
required: true
description: The key a file was stored under.
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'
'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: 'read a file.
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.'
/api/v1/memory:
post:
operationId: postMemory
summary: write a note {author, spaceId, content, embedding?, key?}
tags:
- Memory
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
author: {}
spaceId: {}
content: {}
embedding: {}
key: {}
required:
- author
- spaceId
- content
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: 'write a note {author, spaceId, content, embedding?, key?}.
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.'
/api/v1/memory/grants:
post:
operationId: postMemoryGrants
summary: share a space {owner, spaceId, grantee, canWrite?}
tags:
- Memory
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
owner: {}
spaceId: {}
grantee: {}
canWrite: {}
required:
- owner
- spaceId
- grantee
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: 'share a space {owner, spaceId, grantee, canWrite?}.
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.'
/api/v1/memory/prices:
get:
operationId: getMemoryPrices
summary: what memory and files cost, and the limits
tags:
- Memory
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: 'what memory and files cost, and the limits.
Unsigned: no account and no key. Rate-limited per caller; POST /api/v1/handshake widens the allowance.'
/api/v1/memory/search:
post:
operationId: postMemorySearch
summary: search by meaning {reader, spaceId, embedding?|text?}
tags:
- Memory
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reader: {}
spaceId: {}
required:
- reader
- spaceId
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: 'search by meaning {reader, spaceId, embedding?|text?}.
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.'
/api/v1/memory/spaces:
post:
operationId: postMemorySpaces
summary: open a memory space {owner, name, kind?}
tags:
- Memory
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
owner: {}
name: {}
kind: {}
required:
- owner
- name
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: 'open a memory space {owner, name, kind?}.
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.'
/api/v1/memory/spaces/{id}:
get:
operationId: getMemorySpacesById
summary: 'a space you own or were granted: what is in it and who may read it'
tags:
- Memory
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'
'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: 'a space you own or were granted: what is in it and who may read it.
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.'
/api/v1/memory/usage/{owner}:
get:
operationId: getMemoryUsageByOwner
summary: what you are storing and what it costs per day
tags:
- Memory
parameters:
- name: owner
in: path
required: true
description: 'An account name: `key:<base58 ed25519 public key>`. The bare key id is accepted too.'
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'
'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: 'what you are storing and what it costs per day.
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.'
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-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