Changelog

What changed

Changes to the Agents API, newest first.

API versioning

Korely is versioned by release number. The current release is 0.2.1. From 1.0, nothing published is removed without a 2.0: an endpoint, a field or an error code published in a 1.x release stays in every 1.x release.

The current contract is the OpenAPI reference, and every SDK and CLI release is published on PyPI and npm; the SDKs' source and changelog are on GitHub.

  1. API

    Korely 0.2.1: MCP reads narrow like REST, and bounded waits

    The MCP tools korely_get_context, korely_search and korely_get_facts take agent_id, and korely_get_facts takes predicate, as their REST twins do. A NUL byte anywhere in a request, or a moment outside 0001-01-02 to 9999-12-30 UTC (a memory's timestamp, valid_from, as_of, known_as_of), answers 422 naming the field. A request that waits more than 5 s on a database lock answers 503 unavailable with Retry-After: 5. Creating or enabling a webhook endpoint answers 429 rate_limit_exceeded when the account's two webhook tests or address checks are already under way, and 400 when its host does not resolve within 5 s.

  2. API

    Korely 0.2.0: the compatibility names and secrets retire

    DELETE /v1/users/{end_user}/memories and the deletion of a project answer with memories_deleted and facts_deleted only: memories_forgotten and facts_invalidated, the same numbers under older names, are gone. Webhook endpoints created before 2026-09-28 (legacy_signature: true) are no longer sent; recreate one on the Webhooks page and it gets a secret the Standard Webhooks libraries verify. On Self-hosted a kor_live_ key, the Cloud's prefix, is refused on REST, MCP and the admin API; keys minted there begin with kor_self_. A batch body that holds more JSON values than 500 valid items can hold answers 413 before it is decoded. An account runs up to four MCP tool calls at once, and the next ones wait their turn instead of failing. The SDKs korely-memory 0.1.27 (Python) and 0.1.17 (Node) return kind on every memory and take it on batch items, and the CLI adds korely add --kind session and --exclude-sessions on search, context, facts, profile and list. GET /v1/ping answers region as a label the operator of the install sets: eu-hel1 on the Cloud, the Helsinki server that stores the data; on Self-hosted the REGION value in .env, eu when it is not set, which the service does not check. A memory the model refuses, or runs out of time on, five times while it goes on writing other memories ends in status error, and one account's refused memories no longer pause the writing of other accounts' memories. Deleting a project with erasure counts as erasing each of its end users: the answer is the same, one audit_id, and each end user gets an erasure record under their pseudonym, so what the audit trail writes about them afterwards names them by that pseudonym. An account runs up to four memory searches at once; a fifth sent meanwhile answers 503 search_unavailable on POST /v1/memories/search, to retry, and GET /v1/context answers 200 with degraded: true and the facts only. A batch body larger than 2 MiB that does not arrive whole within 120 seconds answers 408 request_timeout, and an account's large batches are taken one at a time. From 1.0, nothing published is removed without a 2.0.

  3. API

    Declare a name for an end user

    POST /v1/users/{end_user}/names declares that an end user is also called by a name: the id maria is Maria Rossi. The store never merges two names of a person by itself, because two people can share one; after the declaration the facts about the name in that end user's memory read as the end user's, the ones already written included. A name already declared for somebody else answers 409. The SDKs call it declare_name (Python 0.1.26) and declareName (Node 0.1.16), and the CLI korely init --name "Maria Rossi" --user-id maria.

  4. API

    Work sessions: kind and exclude_sessions

    A memory written with kind "session" is the log of a work session, such as what a coding assistant's hooks save; "note", the default, is what somebody said or decided. Search, list, facts, profile and context take exclude_sessions, which leaves the sessions out together with the facts only they state. POST /v1/memories and POST /v1/batch take kind, and memories carry it on every read. The SDKs take both from Python 0.1.26 and Node 0.1.16. A body over the route's size limit now answers 413 payload_too_large before it is read.

  5. API

    known_as_of: what the store knew on a date

    GET /v1/facts, GET /v1/profile and GET /v1/context take an optional known_as_of, next to as_of. as_of answers what was true on a date, as the store knows it now; known_as_of answers what the store knew on that date. An agent learns on 5 October that a customer moved on 1 September: as_of=2026-09-20 returns the new address, known_as_of=2026-09-20 the old one. On /v1/context it rebuilds the block as the store could have built it then. Every fact read carries closed_known_at, when the store learned the fact had ended; for facts closed before this release it is an estimate. The MCP tools korely_get_facts and korely_get_context take it too, and the SDKs from Python 0.1.22 and Node 0.1.14.

  6. Dashboard

    GitHub sign-in, and one account per email

    Signing in to the dashboard with GitHub works when GitHub has verified your email address; when it has not, the page sends a verification link. One email address has one account: an address already registered with another sign-in method is refused, and the page asks you to sign in the way you signed up.

  7. API

    min_score on memory search

    POST /v1/memories/search and the MCP tool korely_search take an optional min_score, from 0 to 1: memories whose score (the cosine similarity) is below it are dropped, so a question whose answer was never stored can come back empty. Without it nothing changes. 0.2 is the value we measured with the embeddings Korely uses. The SDKs take it from Python 0.1.21 and Node 0.1.13.

  8. API

    The context block says how to read its dates

    Under ## Relevant memories, GET /v1/context adds one line for the model: the day in front of each memory is the day it was said, and a time in square brackets after a relative expression, as in "next month [June 2023]", was already resolved from that day. The line comes only with memory lines, and the stable part of the block, the one a prompt cache keeps, does not change.

  9. API

    current_fact_id when you correct a fact that is history

    PATCH /v1/facts/{fact_id} on a fact that was superseded, forgotten or ended returns 409 fact_not_current, and the body carries current_fact_id: the current fact to correct instead, or null when nothing took its place. Nothing is written or counted.

  10. SDK

    korely-memory 0.1.20 (Python) and 0.1.12 (Node)

    A ConflictError from correct_fact() carries current_fact_id (currentFactId in Node): the fact to correct instead, or none. A QuotaExceededError on a monthly quota_exceeded carries limit, used and resets_at (resetsAt in Node), so your code can read when the count starts again without parsing the message.

  11. API

    Read-only keys, a 401 that says why, and processing_region at signup

    A key carries memories:read, memories:write or both: a read-only key reads everything in its project, and a write from it answers 403. A 401 invalid_key message says which case you hit: no Authorization: Bearer header, a string that is not a key, or a key that matches no live key. POST /v1/agents/init accepts "processing_region": "eu", and signup and GET /v1/ping return processing_region next to region; on the Cloud region is eu-hel1, the Helsinki server that stores the data. A webhook endpoint can be bound to one project, and every payload carries project_id.

  12. Quota

    Plans count writes, with a top-up for the month

    Hobby 250, Developer 2,000, Team 8,000 and Scale 25,000 writes a month. A memory counts one write per 6,000 characters of its text. A paid plan can add 1,000 writes to the current month with one payment, once a month. A quota 429 quota_exceeded carries limit (top-ups included), used and resets_at next to code and message, and so does a batch refused for the quota.

  13. API

    A processing region per project

    Each project has a region. global, the default, extracts facts with Google's Gemini API. eu runs the same steps on gpt-oss-120b on Scaleway in Paris, and no memory text reaches Google. You choose it when you create a project or change it from the Projects page, and it applies to the writes that follow. Searches and context queries run no language model in either region.

  14. API

    GET /v1/audit

    Every call made with a key of your project, newest first: who acted, on which end user, which memory or fact, and for reads which memories and facts the agent was given. Ids, counts and labels only, never the text, so erasing an end user stays complete. On every plan, Hobby included. The SDKs read it with audit() and iter_audit() (iterAudit() in Node).

  15. API

    /v1/context says when it is degraded

    The context response carries degraded and degraded_parts. When the memory search fails you still get the facts and ["memories"]; when the fact ranking fails the facts are the most recently confirmed ones and you get ["facts"]. The call succeeds either way, and a block with content closes with a NOTE: for the model, inside your token_budget.

  16. Quota

    Tier quotas finalized + agent caps enforced

    Monthly write quotas and agent caps were enforced server-side for the first time. Since superseded: the current quotas are Hobby 250, Developer 2,000, Team 8,000 and Scale 25,000 writes a month, with 2 / 10 / 100 / 500 named agents; a write under a new agent_id past the cap answers 429 agent_cap_exceeded, and the plans are served at GET https://api.korely.ai/hosted/plans.

  17. Dashboard

    Self-serve keys, home overview, and a retrieval Playground

    New developers get a working kor_live_ key in one click, with a copy-paste curl. The dashboard home now shows memories, facts, agents, requests, and this month’s write usage at a glance. The Playground lets you type a question and see exactly which memories and facts Korely would hand your agent, the read path, made visible.

  18. API

    REST /v1 contract published

    The full programmatic surface is live at api.korely.ai: Memories (add, search, list, get, update, delete, bulk-delete per end user), Facts (typed, bi-temporal, with as_of point-in-time queries), Context (a prompt-ready block) and Batch; webhooks are configured from the dashboard. GET /v1/memories now accepts limit up to 200.

Building on the API? Read the reference or see security & data residency.