emem Cite API

The cite API from emem — 4 operation(s) for cite.

Operations 4

POST /v1/derive Register a derivation YOU computed over facts this responder holds, and get… #
POST /v1/echo_verify Close the last mile: check the value YOU emitted against the signed fact your… #
POST /v1/memory_bundle Compose N (cell, band, tslot?) triples into ONE signed envelope. #
GET /v1/memory_bundle/{token} Dereference a bundle token back to its signed envelope: the citations, the… #

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/emem-dev-cite-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

emem-dev-cite-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  description: emem is shared memory for AI agents working together in the real world.
  license:
    name: Apache-2.0
  title: emem Cite API
  version: 2.4.0
  x-emem-surface-asymmetry:
    memory_notes: MCP only
    reach_them_at: POST /mcp, method tools/call
    read_side_is_here:
    - /v1/memory/search
    - /v1/memory/sse
    - /memories/{path}
    tools:
    - emem_memory_create
    - emem_memory_view
    - emem_memory_delete
    - emem_memory_rename
    - emem_memory_str_replace
    - emem_memory_supersede
    why_not_here: These write the agent correspondence plane, which is prose and untrusted-by-declaration. It is deliberately not part of the REST fact surface, and the two planes are kept apart rather than merged for convenience.
servers:
- description: Hosted instance (HTTPS-only)
  url: https://emem.dev
tags:
- name: cite
paths:
  /v1/derive:
    post:
      description: 'Register a value YOU computed from facts this responder holds, and get back a citeable `emem:fact:` token whose lineage terminates in emem-signed measurements. The registered fact names its parents by CID, so a stranger walks the DAG down to signed sensor data instead of trusting your summary. Requires an ed25519 `attester` block. What the responder signs is narrow and it says so on the response: that YOU submitted this derivation, over these parents, at this time, and it stored it. NOT that the value is true. Memory algebra: the `derive` operation (https://emem.dev/docs/model.html).


        When to use: Call when you have computed something from emem facts (a delta, a zone classification, a per-plot verdict, a model output) and need to hand another agent a token for it rather than a claim. Every input token must already resolve here; recall or backfill the parents first. Provenance class is model_output or human_curated; the sensor classes are refused, since this responder did not compute your value. Note the tenancy rule: a derived fact carries no canonical (cell, band, tslot) key, so it will NOT appear in anyone''s emem_recall at that cell. That is the point: you are getting citation and resolution, not an injection into the shared commons. Read it back with emem_memory_token_resolve, or list your own with emem_derive_list. Idempotent per (your key, derivation body): re-registering an identical derivation returns the same token rather than a twin, so retrying a timed-out call is safe.'
      operationId: emem_derive
      requestBody:
        content:
          application/json:
            schema:
              properties:
                attester:
                  properties:
                    pubkey_b32:
                      type: string
                    sig_b32:
                      type: string
                  required:
                  - pubkey_b32
                  - sig_b32
                  type: object
                band:
                  type: string
                budget_ms:
                  description: optional soft budget in ms; if registration does not finish in time it returns 202 {status:pending} and completes in the background, and since derive is idempotent a re-POST of the identical body returns the token once it persists (a build under load never exits half-registered). Omit for synchronous 200-or-error.
                  type: integer
                cell:
                  type: string
                code_cid:
                  description: optional blake3 of the code that computed the value; recorded, never fetched or run
                  type: string
                confidence:
                  maximum: 1
                  minimum: 0
                  type: number
                fn_key:
                  description: your recipe key, e.g. same_doy_ndvi_delta@1; not an entry in this responder's registry and never executed by it
                  type: string
                inputs:
                  description: parent tokens emem:fact:<cell64>:<fact_cid>; order is significant and signed
                  items:
                    type: string
                  minItems: 1
                  type: array
                op:
                  description: delta | mean | trend | rate | anomaly
                  type: string
                provenance_class:
                  enum:
                  - model_output
                  - human_curated
                  - estimator
                  type: string
                tslot_window:
                  description: inclusive [start, end]
                  items:
                    type: integer
                  maxItems: 2
                  minItems: 2
                  type: array
                value:
                  description: any JSON value
              required:
              - fn_key
              - inputs
              - cell
              - band
              - tslot_window
              - op
              - value
              - confidence
              - provenance_class
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ok
        '202':
          description: registration in progress; re-POST the identical body to collect the token
        '400':
          content:
            application/json:
              schema:
                properties:
                  details:
                    type: object
                  error:
                    type: string
                type: object
          description: invalid argument; `details.code` names which rule refused
        '401':
          content:
            application/json:
              schema:
                properties:
                  details:
                    type: object
                  error:
                    type: string
                type: object
          description: the caller's ed25519 attester binding is missing or does not verify; `details.how_to_sign` carries the exact digest to sign for this request
        '404':
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                type: object
          description: not found
        '409':
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                type: object
          description: conflict (the request contradicts a signed fact, e.g. a token whose cell does not match the fact's own cell)
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: 'error, the emem.error.v1 envelope. Branch on the stable `code` (see GET /v1/errors), not the message. A malformed or missing-field request body returns `code: invalid_argument` with the offending field named in `message`.'
      summary: Register a derivation YOU computed over facts this responder holds, and get…
      tags:
      - cite
  /v1/echo_verify:
    post:
      description: 'Grade a value you are about to emit against the signed fact your citation points at. Returns `matches` and, when it does not, the `drift` between what you were about to say and what emem holds. This is the step that turns a transcription error into a caught event instead of a silent wrong number: a model that resolves a fact correctly can still retype `0.2411` for `0.241103`, and nothing else in the loop notices. Memory algebra: the `verify` operation (https://emem.dev/docs/model.html).


        When to use: Call immediately before publishing, logging, or handing on any value you took from an emem fact, and treat a false `matches` as a gate rather than a warning. Pair it with `value_verbatim` from resolve: quote that exact decimal string rather than reformatting the number, then echo-verify what you actually emitted. For a due-diligence or compliance record this is what lets you assert `every cited value was echo-verified` with a signed check per citation instead of a promise. Accepts a bare cid too, so a damaged citation still grades rather than failing closed.'
      operationId: emem_echo_verify
      requestBody:
        content:
          application/json:
            schema:
              properties:
                claimed_value:
                  description: the value you emitted, string or number; a string is compared verbatim first
                  type:
                  - string
                  - number
                token:
                  description: emem:fact:<cell64>:<fact_cid>, or a bare fact_cid (degraded)
                  type: string
              required:
              - token
              - claimed_value
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ok
        '400':
          content:
            application/json:
              schema:
                properties:
                  details:
                    type: object
                  error:
                    type: string
                type: object
          description: invalid argument; `details.code` names which rule refused
        '404':
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                type: object
          description: not found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: 'error, the emem.error.v1 envelope. Branch on the stable `code` (see GET /v1/errors), not the message. A malformed or missing-field request body returns `code: invalid_argument` with the offending field named in `message`.'
      summary: 'Close the last mile: check the value YOU emitted against the signed fact your…'
      tags:
      - cite
  /v1/memory_bundle:
    post:
      description: 'Compose N (cell, band, tslot?) triples into ONE signed envelope. Each triple runs through the standard auto-materialize recall path; the resulting fact_cids are bundled into a content-addressed envelope and the responder signs over the full receipt. The composed `bundle_token` is `emem:bundle:`, a single rebindable string that cites the whole set. Memory algebra: the `merge` operation (https://emem.dev/docs/model.html).


        When to use: Call when the agent wants to cite multiple (place, band, vintage) facts as one handle. The bundle stays verifiable offline via /v1/verify_receipt (the receipt covers all cited fact_cids and cells). Use this instead of N separate `emem_memory_token` composers when the citation is conceptually one thing (e.g. "the EUDR-relevant baseline for these 8 plots at 2020-12-31"). Caps at 256 triples per call, and the response reports `members` and `resolved` so a bundle that only partly resolved is visible without walking every citation.'
      operationId: emem_memory_bundle
      requestBody:
        content:
          application/json:
            schema:
              properties:
                purpose:
                  description: Optional free-text purpose folded into the bundle_cid, so the same triples bundled for a different purpose get a distinct id.
                  type: string
                triples:
                  description: At most 256 per call; 257 is a typed 400. Chunk larger sets into ceil(N/256) bundles.
                  items:
                    properties:
                      band:
                        type: string
                      cell:
                        type: string
                      tslot:
                        type: integer
                    type: object
                  maxItems: 256
                  type: array
              required:
              - triples
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ok
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: 'error, the emem.error.v1 envelope. Branch on the stable `code` (see GET /v1/errors), not the message. A malformed or missing-field request body returns `code: invalid_argument` with the offending field named in `message`.'
      summary: Compose N (cell, band, tslot?) triples into ONE signed envelope.
      tags:
      - cite
  /v1/memory_bundle/{token}:
    get:
      description: 'Parse a `emem:bundle:` token and return the signed bundle envelope: every citation (cell, band, resolved_tslot, fact_cid, memory_token), the receipt, the responder pubkey, and the deduped flat cells[] / fact_cids[] arrays. Returns 404 with a typed code when the responder does not hold the bundle.


        When to use: Call when an agent receives an `emem:bundle:` token from another agent (or earlier turn) and wants the underlying signed citation set. The response is byte-identical to what `emem_memory_bundle` returned at the original responder.'
      operationId: emem_memory_bundle_resolve
      parameters:
      - description: 'emem:bundle:<bundle_cid> (legacy memb: or bare cid accepted)'
        in: path
        name: token
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: ok
        '404':
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                type: object
          description: not found
      summary: 'Dereference a bundle token back to its signed envelope: the citations, the…'
      tags:
      - cite
components:
  schemas:
    ErrorEnvelope:
      description: The `emem.error.v1` failure envelope returned by every endpoint on a 4xx/5xx. Branch on the stable `code` (not the human `message`). See GET /v1/errors for the full code catalog.
      properties:
        code:
          description: Stable machine-readable error code. One of the codes in GET /v1/errors.
          example: invalid_argument
          type: string
        details:
          description: Optional structured recovery hints; present on errors that ship machine-readable next-steps.
          type: object
        message:
          description: Human-readable detail. For invalid_argument this names the offending field (e.g. "missing field `q`").
          type: string
        path:
          description: Request path that produced the error.
          example: /v1/ask
          type: string
        schema:
          const: emem.error.v1
          type: string
      required:
      - code
      - message
      - schema
      type: object