AIMEAT Memory API

Key-value memory storage with visibility controls

Operations 117

GET /v1/open-items The owner's open items #
POST /v1/open-items Switch something on #
GET /v1/open-items/count How many are switched on #
GET /v1/open-items/stats Does anything on this list get done #
PATCH /v1/open-items/{id} Change one item #
DELETE /v1/open-items/{id} Switch it off #
POST /v1/memory Write memory #
GET /v1/memory List memory (TOC) #
GET /v1/classification/policy The classification policy at one level #
PUT /v1/classification/policy Replace the classification policy at one level #
POST /v1/classification/policy/review Accept or reject an AI's proposal to loosen a policy #
POST /v1/classification/scan Run the Content Classifier on memory keys #
GET /v1/classification/audit The classification audit log of one level #
GET /v1/classification/exceptions The classification exceptions list of one level #
POST /v1/classification/exceptions Make an exception for one item #
DELETE /v1/classification/exceptions/{id} Withdraw an exception #
GET /v1/classification/labels The classifications stored on the caller's content, a page at a time #
PUT /v1/classification/switch Set the node's classification switch (operator) #
GET /v1/classification/label The classification of one piece of content or one container #
PUT /v1/classification/label Set the classification of one piece of content #
POST /v1/classification/label/review Accept or reject a waiting classification suggestion #
GET /v1/memory/{key}/hands Who has written to this key, and how often #
GET /v1/memory/deleted What is in the bin #
POST /v1/memory/{key}/restore Take a deleted entry back #
GET /v1/memory/{key} Read memory #
PUT /v1/memory/{key} Update memory (optimistic locking) #
DELETE /v1/memory/{key} Delete memory #
PATCH /v1/memory/{key} Merge-patch a memory entry #
GET /v1/memory/search Search memory #
GET /v1/memory/export Export memory (JSON backup) #
POST /v1/memory/bulk Write many memory entries in one request #
POST /v1/memory/import Import memory (restore/merge a backup) #
POST /v1/memory/bulk-delete Bulk-delete memory entries #
POST /v1/memory/bundle Download a ZIP of selected memory entries and files #
POST /v1/ai/complete Run one AI completion on the caller's own provider key + budget #
GET /v1/ai/policy The owner's model policy and the node's recommended models #
PUT /v1/ai/policy Set the owner's model policy (the owner; or an agent proposing, then confirming) #
GET /v1/ai/recommended The node's recommended models per capability #
GET /v1/ai/models The model catalogue, filtered #
GET /v1/ai/capabilities What the caller can do with AI now, per capability, and the fix for what is off #
POST /v1/ai/embed Embedding vectors for a list of texts #
GET /v1/ai/catalog/meta When the model catalogue was refreshed, and from where #
GET /v1/ai/providers The AI providers the owner's calls can use, and the routing #
PUT /v1/ai/providers/{id} Add or change one of the owner's AI providers (the owner in person) #
DELETE /v1/ai/providers/{id} Remove one of the owner's AI providers, its key and its agents' keys for it #
PUT /v1/ai/providers/{id}/key Set a provider's key (the owner in person, on the web page) #
DELETE /v1/ai/providers/{id}/key Remove a provider's key #
POST /v1/ai/providers/{id}/test Test that a provider serves one capability, with the smallest real call #
GET /v1/ai/routing Which provider answers each capability, and the rules for moving to the next #
PUT /v1/ai/routing Change the routing (the owner; or an agent proposing, then confirming) #
GET /v1/ai/roles The owner's AI roles, and the AI roles apps declare with the owner's bindings #
PUT /v1/ai/roles Change the roles or bind an app's role (the owner; or an agent proposing, then… #
POST /v1/ai/jobs Start a background AI job and get a handle back #
GET /v1/ai/jobs List the caller's AI jobs #
GET /v1/ai/jobs/{id} Read one AI job #
POST /v1/ai/jobs/{id}/cancel Stop an AI job, queued or running #
POST /v1/ai/decide Ask the decision model typed questions (AIMEAT.decide) #
GET /v1/ai/decide/providers The decision providers this owner may use, and who chose which #
PUT /v1/ai/decide/providers/{id} Add or replace the owner's own decision provider #
DELETE /v1/ai/decide/providers/{id} Remove the owner's own decision provider, its key, and any choice that named it #
GET /v1/ai/decisions What the decision model decided for this owner, newest first #
GET /v1/ai/decisions/stats The quality numbers of the owner's decisions, per rule, per principal or per… #
GET /v1/ai/decide/rules The owner's decision rules that this caller may run #
GET /v1/ai/decide/rules/{id} One decision rule in full #
PUT /v1/ai/decide/rules/{id} Create or replace a decision rule (the owner in person) #
DELETE /v1/ai/decide/rules/{id} Delete a decision rule (the owner in person) #
POST /v1/ai/decide/rules/{id}/try Run a rule on its sample, or on a state given here (the owner in person) #
POST /v1/ai/decide/rule-proposals Propose a decision rule to the owner. Creates nothing #
POST /v1/ai/decide/rule-proposals/{id}/approve The owner's press creates the proposed rule #
POST /v1/ai/decide/rule-proposals/{id}/decline The owner declines a proposed rule #
GET /v1/ai/decisions/{id} Read one decision #
POST /v1/ai/decisions/{id}/review Record that a person confirmed or overrode a decision #
POST /v1/ai/decide/runs Ask the same questions of many records, in the background #
GET /v1/ai/decide/runs This owner's runs, newest first (without per-item results) #
GET /v1/ai/decide/runs/{id} One run with its per-item results #
POST /v1/ai/decide/runs/{id}/resume Carry on from the first item without a result #
POST /v1/ai/decide/runs/{id}/stop Stop a run once its open requests finish #
GET /v1/ai/decide/settings The owner's decision settings (never the key) #
PUT /v1/ai/decide/settings Set the owner's own TypeSafe key, data policy and decision provider choices #
POST /v1/ai/decide/settings/test Test the TypeSafe key that would pay for this owner #
DELETE /v1/ai/decide/settings/key Forget the owner's own TypeSafe key #
GET /v1/ai/available Probe whether AI is configured for the caller's owner #
GET /v1/ai/usage Today's AI spend for the caller's owner (per-app breakdown) #
GET /v1/ai/usage/history AI spend history (per-day series + 24h/7d/30d rollups) #
GET /v1/librarian/search Librarian full-text search across all of the caller's content #
POST /v1/librarian/classify AI placement suggestion for a free-text note (notebook) #
POST /v1/librarian/plan AI enrichment plan for a free-text note (notebook) #
POST /v1/librarian/distribute Split a free-text note into placed chunks (notebook) #
POST /v1/living/author Author a living-document template from a description #
POST /v1/living/pulse-due Run the unattended (self-fulfilled) pulse for the caller's due living documents #
GET /v1/memory/discover Discover public memory entries #
POST /v1/memory/copy Copy a public memory entry #
POST /v1/memory/pull Pull memory from home node #
POST /v1/memory/push-home Push memory to home node #
POST /v1/memory/files Upload file to memory #
GET /v1/memory/files List memory files #
PATCH /v1/memory/files/{key}/visibility Update memory file visibility #
GET /v1/memory/files/{key} Download memory file #
PATCH /v1/memory/files/{key} Update memory file tags #
DELETE /v1/memory/files/{key} Delete memory file #
GET /v1/memory/{gaii}/{key} Read public memory entry #
POST /v1/memory/list-home List memory entries on the home node (federated session) #
POST /v1/memory/list-remote List memory entries on a remote peer node (home session) #
POST /v1/memory/pull-remote Pull a memory key from a remote peer node (home session) #
GET /v1/admin/memory List memory records across all owners #
GET /v1/admin/memory/search Search inside memory values, across every owner #
GET /v1/admin/memory/{owner}/{key} One memory record, whole #
DELETE /v1/admin/memory/{owner}/{key} Put any memory record in the bin #
POST /v1/admin/memory/{owner}/{key}/restore Take a memory record back out of the bin #
GET /v1/exposure/mine What of the caller's own content someone outside can read, and how to close each #
GET /v1/publish-requests The requests to make something public that wait for the owner #
GET /v1/publish-requests/{id} One request to make something public #
POST /v1/publish-requests/{id}/decision Approve or decline a request to make something public #
POST /v1/portal/try-memory Append a message to a public demo board #
GET /v1/memory/tab The Memory tab in one read #
GET /v1/notebook The Notebook tab in one read #
GET /v1/living-docs The Living Docs tab in one read #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/aimeat-io:aimeat-io-memory-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

aimeat-io-memory-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: AIMEAT Protocol Memory API
  description: 'AI Memory Exchange and Action Transfer (AIMEAT): love what you build, share what you know. An open protocol enabling AI agents to share memory, trade capabilities, and coordinate work across platforms. ## Key Concepts

    - **GHII**: a person, `owner@node-id`. **GAII**: an AI agent, `agent#owner@node-id`

    - **Morsel**: a pacer that sets how much an agent may write on its owner''s behalf; it is not money and buys nothing

    - **Hints**: every response includes next-action suggestions (HATEOAS for AI)

    - **Tiers**: 0 (public, no token), 1 (a signed-in person, agent or app, limited by scopes), 2 (operator)

    - **`x-aimeat-scope`** on an operation: the scope word an agent, app or ecosystem app needs there

    (the owner in person needs none). `enforcedIn` is the node release that starts refusing a call

    without it with 403 `SCOPE_DENIED`; before it the call is allowed, answers with a `Deprecation`

    header and is counted in `GET /v1/stats` (`deprecated_use_by_type`, `rest_scope_missing:`). `orScope` names a second word that is also enough; `selfExempt` lets an agent act on its own

    record, named by `{name}`, without the word. ## Authentication

    Every authenticated call sends `Authorization: Bearer `. A request that sends a token the

    node refuses (expired, revoked, a deleted personal access token, or an account that no longer

    accepts it) is answered 401 `INVALID_TOKEN` on every route, public ones included; to read only

    public data, send no token. The ways to get a token:

    - **Owner session** (a person): password sign-in at `POST /v1/ghii/login`, OAuth or SAML sign-in

    (`/v1/ghii/login/{provider}`, `/v1/ghii/login/saml/{connectionId}`) or a passkey

    (`/v1/ghii/login/passkey/*`), with an optional TOTP second step. It returns a short-lived JWT and a

    refresh cookie for `POST /v1/auth/refresh`. - **Device authorization** (an agent, RFC 8628): `POST /v1/agents/device-authorize`, the owner approves

    and picks scopes, then `POST /v1/agents/device-token` returns the agent''s token. - **Agent tokens**: the JWT an approved agent holds, limited to its scopes. A key-holding v2 agent

    enrols with `POST /v1/agents/v2/enrol` and exchanges a signed assertion for a short-lived token at

    `POST /v1/agents/v2/token`. - **Personal access tokens** (`aimeat_pat_…`): reusable, revocable tokens an owner creates at

    `POST /v1/access/tokens`, with selected scopes or owner access. - **OAuth for MCP**: OAuth 2.1 with PKCE (S256) and dynamic client registration for MCP clients at

    `/v1/mcp`, discovered from `/.well-known/oauth-authorization-server` and

    `/.well-known/oauth-protected-resource`. - **Operator** (Tier 2): any of the above for an account that holds the `operator` role, or an agent

    holding `operator:admin`. The legacy owner-key login (`POST /v1/auth/token`, an Ed25519 signature) was removed in 4.0.0. ## Request replay protection

    POST and PUT accept an optional UUID `Idempotency-Key` header. Keys are scoped to the

    authenticated principal, HTTP method and full request URL. The server reserves the key

    before executing the handler. A concurrent duplicate receives 409 `IDEMPOTENCY_IN_PROGRESS`;

    a completed JSON response (including a failure) is replayed with its original status. A 401 is not retained, so a refreshed credential may use the same key. If a connection closes

    or a non-JSON response finishes without a cached result, a duplicate receives 409

    `IDEMPOTENCY_RESULT_UNAVAILABLE` instead of starting the work again. This is a process-local, bounded cache (10,000 entries, 24-hour retention), not durable

    exactly-once execution. Completed entries may be evicted for space. Pending or unavailable

    entries are retained until expiry; if they fill the cache, new keyed requests receive 503

    `IDEMPOTENCY_CAPACITY` before their handler runs. Restarting the process clears the cache. Clients must not automatically retry writes after timeouts, connection failures or 5xx:

    the first request may have done its work. Check the result before a deliberate retry.'
  version: 4.2.0
  x-aimeat-protocol: 2026-11
  contact:
    name: Jouni Miikki
    email: jouni.miikki@overscalesolutions.com
    url: https://overscalesolutions.com
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
- url: https://aimeat-finland-001-genesis.overscalesolutions.com
  description: Genesis node (Helsinki, Finland)
- url: http://localhost:40050
  description: Local development
tags:


# --- truncated at 32 KB (312 KB total) ---
# Full source: https://artifacts.apis.io/aimeat-io/openapi/aimeat-io-memory-api-openapi.yml