inite-ai Ingest API

Writing memory: the declared-fact path (scope `brain:write`). Every write goes through bitemporal conflict resolution, so the response reports a decision, not an acknowledgement.

Operations 2

POST /v1/ingest/fact Record a declared structured fact #
POST /v1/ingest/mention Record free text and let brain extract the facts #

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/inite-ai:inite-ai-ingest-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

inite-ai-ingest-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  description: 'Generated from the zod wire contracts (`pnpm openapi:build` — scripts/build-openapi.ts); do not edit by hand. Excluded on purpose: the operator/ops surface (jobs, leases, policy, stats, maintenance, GDPR cascades), which is indexed in docs/api.md, and the MCP transport `ALL /mcp/{companyId}`, which is JSON-RPC over Streamable HTTP rather than REST — MCP clients discover it through `tools/list` (docs/mcp.md). Scopes are plain bearer-key grants, not OAuth flows — each operation states its required scope.'
  license:
    identifier: AGPL-3.0-or-later
    name: AGPL-3.0-or-later
  summary: 'The community-facing platform surface: the memory core (fact ingest, search, multi-hop, synthesize, entity and fact reads), the Domain Pack registry and tenant pack admin, the document pipeline, the external-indexer work protocol, the raw-substrate driver, the evidence substrate, and source reputation reads.'
  title: INITE Brain — Platform Ingest API
  version: 2.6.0
servers:
- description: Hosted instance (placeholder — self-hosted deployments serve the same paths on their own origin).
  url: https://brain.inite.ai
security:
- bearerAuth: []
tags:
- description: 'Writing memory: the declared-fact path (scope `brain:write`). Every write goes through bitemporal conflict resolution, so the response reports a decision, not an acknowledgement.'
  name: Ingest
paths:
  /v1/ingest/fact:
    post:
      description: 'The headline write. Resolves the entity, embeds the claim and runs bitemporal conflict resolution against the standing timeline: the response `outcome` says what the resolver decided (INSERTED / INSERTED_HISTORICAL / CORROBORATED / SUPERSEDED / COMPETING / REJECTED), never just "ok". `userId` stamps a per-user memory scope (migration 0055) — scope-local conflict resolution, invisible to every other user of the tenant and to requests that don''t assert one. `explain: true` adds the deterministic conflict narrative on a SUPERSEDED / COMPETING outcome. Source: src/ingest/ingest.controller.ts.


        Required scope: `brain:write`.'
      operationId: ingestFact
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IngestFactRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IngestFactResponse'
          description: The resolver's decision.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      summary: Record a declared structured fact
      tags:
      - Ingest
  /v1/ingest/mention:
    post:
      description: 'The simplest write, and the one to reach for when the caller has prose rather than a structured claim: a chat turn, a meeting note, an email body. The text is captured as an episode, an LLM extracts entities, facts and edges from it, and each extracted fact goes through the same bitemporal resolver as `POST /v1/ingest/fact` — so extraction is noisy by design and conflict resolution cleans up at read time. Only `text` is required: `contextRef` defaults to the `chat` vertical and `emittedAt` to the moment the request arrives. `userId` stamps the per-user memory scope on the episode and every extracted fact and edge. `skipped: true` means nothing new was recorded — `reason` says why: `empty` text, `no_entities` (the extractor found nothing worth recording), or `duplicate` (this user already sent this exact text; the document store keys on the content hash and a replay commits nothing new) — a normal outcome, not an error. Prefer `POST /v1/ingest/document` for anything long enough to need chunking. Source: src/ingest/ingest.controller.ts.


        Required scope: `brain:write`.'
      operationId: ingestMention
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IngestMentionRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IngestMentionResponse'
          description: What the extractor wrote.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      summary: Record free text and let brain extract the facts
      tags:
      - Ingest
components:
  schemas:
    SourceEvidence:
      additionalProperties: false
      properties:
        kind:
          enum:
          - event
          - message
          - conversation
          - url
          - document
          - commit
          - other
          type: string
        note:
          type: string
        ref:
          type: string
      required:
      - kind
      - ref
      type: object
    IngestMentionResponse:
      additionalProperties: false
      properties:
        episodeId:
          type: string
        extractedEdgeIds:
          items:
            type: string
          type: array
        extractedEntityIds:
          items:
            type: string
          type: array
        extractedFactIds:
          items:
            type: string
          type: array
        reason:
          type: string
        skipped:
          type: boolean
      required:
      - skipped
      - extractedEntityIds
      - extractedFactIds
      type: object
    ErrorResponse:
      description: Standard NestJS error envelope.
      properties:
        error:
          type: string
        message:
          anyOf:
          - type: string
          - items:
              type: string
            type: array
        statusCode:
          type: integer
      required:
      - statusCode
      - message
      type: object
    ConflictExplanation:
      additionalProperties: {}
      propertyNames:
        type: string
      type: object
    IngestMentionRequest:
      additionalProperties: false
      properties:
        contextRef:
          $ref: '#/components/schemas/MentionContextRef'
        emittedAt:
          type: string
        knownEntities:
          items:
            $ref: '#/components/schemas/KnownEntity'
          type: array
        text:
          maxLength: 16000
          type: string
        timezone:
          maxLength: 64
          type: string
        userId:
          maxLength: 200
          type: string
      required:
      - text
      type: object
    MentionContextRef:
      additionalProperties: {}
      properties:
        conversationId:
          type: string
        eventId:
          type: string
        messageId:
          type: string
        recorder:
          type: string
        vertical:
          type: string
      required:
      - vertical
      type: object
    KnownEntity:
      additionalProperties: {}
      properties:
        id:
          type: string
        name:
          type: string
        role:
          type: string
        vertical:
          type: string
      required:
      - vertical
      - id
      type: object
    FactSource:
      additionalProperties: {}
      properties:
        conversationId:
          type: string
        episodeIds:
          items:
            type: string
          type: array
        eventId:
          type: string
        evidence:
          items:
            $ref: '#/components/schemas/SourceEvidence'
          type: array
        messageId:
          type: string
        recorder:
          type: string
        vertical:
          type: string
      required:
      - vertical
      type: object
    IngestFactResponse:
      additionalProperties: false
      properties:
        competingFactIds:
          items:
            type: string
          type: array
        conflictExplanation:
          $ref: '#/components/schemas/ConflictExplanation'
        corroboratedFactId:
          type: string
        factId:
          type:
          - string
          - 'null'
        outcome:
          enum:
          - INSERTED
          - INSERTED_HISTORICAL
          - CORROBORATED
          - SUPERSEDED
          - COMPETING
          - REJECTED
          type: string
        reason:
          type: string
        supersededByFactId:
          type: string
        supersededFactIds:
          items:
            type: string
          type: array
      required:
      - factId
      - outcome
      type: object
    IngestFactRequest:
      additionalProperties: false
      properties:
        confidence:
          maximum: 1
          minimum: 0
          type: number
        entityRef:
          $ref: '#/components/schemas/EntityRef'
        expectedUntil:
          type: string
        explain:
          type: boolean
        metadata:
          additionalProperties: {}
          propertyNames:
            type: string
          type: object
        object:
          maxLength: 2000
          type: string
        predicate:
          maxLength: 256
          type: string
        source:
          $ref: '#/components/schemas/FactSource'
        userId:
          maxLength: 200
          type: string
        validFrom:
          type: string
        validUntil:
          type: string
      required:
      - entityRef
      - predicate
      - object
      - validFrom
      - source
      type: object
    EntityRef:
      additionalProperties: {}
      properties:
        entityId:
          type: string
        id:
          type: string
        vertical:
          type: string
      type: object
  responses:
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
      description: The key lacks the required scope.
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
      description: Missing or unknown bearer key.
    BadRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
      description: Validation failed.
  securitySchemes:
    bearerAuth:
      description: 'API key (`Authorization: Bearer <key>`); its SHA-256 must be registered in BRAIN_API_KEYS. Keys carry scopes (`brain:read`, `brain:write`, `brain:admin`, `brain:read_pii`, `registry:publish`, `registry:curate`, `indexer:write`) — each operation states the scope it requires. Not an OAuth flow.'
      scheme: bearer
      type: http