Projects API¶
Projects namespace memories inside an organization. You rarely need these endpoints — writing to a project key creates it — but they are how you list, rename and inspect.
GET /api/projects¶
{
"projects": [
{
"project_id": "billing-service",
"name": "billing-service",
"description": null,
"status": "active",
"created_at": 1787007141.7951503,
"contexts": 2,
"decisions": 1,
"agents": 1
}
]
}
project_id is your key. contexts, decisions and agents are counts.
Useful for catching the typo case: two near-identical keys, one with a single memory in it, is a project name that was mistyped once.
POST /api/projects¶
Create a project explicitly. Returns 201.
| Field | Required | Notes |
|---|---|---|
name |
✅ | 1–200 chars |
project_id |
≤ 100 chars. Derived from name when omitted. |
curl -sX POST https://api.venkai.fr/api/projects \
-H "Authorization: Bearer $VENKAI_API_KEY" -H 'Content-Type: application/json' \
-d '{"name":"Billing Service","project_id":"billing-service"}'
Pass project_id explicitly if agents will hard-code it — do not rely on how a
display name is slugified.
PATCH /api/projects/{project_id}¶
| Field | Notes |
|---|---|
name |
1–200 chars |
description |
≤ 2000 chars |
status |
active or archived |
The project key cannot be renamed
project_key is deliberately absent from this endpoint. Deployed agents
carry it hard-coded; renaming it would break their calls with a 404 and
no migration path. Change the display name instead.
archived is a label. Archived projects still accept writes and still return
results.
GET /api/projects/{project_id}/agents¶
Agents that have written to this project, from the distinct agent_key values
on its contexts. Useful for a "who contributed" view.
GET /api/organization¶
The caller's organization: identity, and aggregate counts across projects.
DELETE /api/organization¶
Irreversible
Deletes the organization and its data — every project, every memory, every version. There is no undo and no soft-delete. Export first.
GET /api/export¶
Full export of the organization's data as JSON. The intended companion to the delete above, and the answer to "can I get my data out": yes, one call.
GET /api/impact¶
Aggregate usage metrics for the organization.
{
"tokens_stored": 31,
"total_recalls": 0,
"avg_memory_chars": 63,
"unique_agents": 1,
"types_distribution": {"decision": 1, "constraint": 1},
"most_accessed": [
{
"id": "ctx_3f156f85fe3f",
"project_id": "billing-service",
"content_preview": "We use Postgres, not MongoDB, because the ranking query needs joins.",
"access_count": 0,
"type": "decision"
}
],
"knowledge_age_days": 0.0,
"versions_total": 0
}
Read these carefully before quoting them:
| Field | What it actually is |
|---|---|
tokens_stored |
An estimate derived from stored characters. Not a measured token count and not a saving. |
total_recalls |
Count of retrieval calls. |
most_accessed |
Ranked by access_count, which retrieval does not increment — so it is near-meaningless until explicit feedback is used. |
knowledge_age_days |
Age of the oldest memory. |
avg_memory_chars, unique_agents, types_distribution, versions_total |
As named. |
tokens_stored is a volume figure. It is not evidence of tokens saved, and
should never be presented as one — see Evaluation.