Memory (looms)
29 calls. Every request needs the Authorization header: see the overview.
looms.create
Section titled “looms.create”PUT /loomsCreates a loom.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Request body: LoomCreateRequest
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | The loom’s name, unique within its namespace. |
namespaceId | uuid | yes | The namespace to create it in. |
description | string | null | What the loom is for, in your own words. | |
settings | LoomSettingsInput| null | Night weaving, quiet period and weaver model. Absent: the defaults. |
Response: Loom (200)
curl -X PUT "https://api.maitento.com/looms" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"name":"...","namespaceId":"..."}'const loom = await mt.looms.create({ name: "support-memory", namespaceId: "b5f3d1a9-7e6c-4b4a-9a2e-8c0d1f3e5a7b" });mt.looms.create(name="support-memory", namespace_id="0f1e2d3c-4b5a-4968-8776-655443322110", description="What the support agents learn")looms.delete
Section titled “looms.delete”DELETE /looms/by-id/{id}Unravels (erases) a loom and everything in it (Tenant.Admin).
Who can call it: Tenant admins only, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Response: no body (204)
curl -X DELETE "https://api.maitento.com/looms/by-id/<id>" \ -H "Authorization: $MAITENTO_AUTH"await mt.looms.delete("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.delete("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.get
Section titled “looms.get”GET /looms/by-id/{id}The loom with this id. Throws NotFoundError when there is none.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Response: Loom (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>" \ -H "Authorization: $MAITENTO_AUTH"const loom = await mt.looms.get("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.get("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.update
Section titled “looms.update”PATCH /looms/by-id/{id}Changes a loom’s name, description or settings (absent fields are unchanged).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Request body: LoomUpdateRequest
| Field | Type | Required | Description |
|---|---|---|---|
name | string | null | Absent keeps the current name, as does the loom’s own name sent back unchanged. | |
description | string | null | Absent keeps the current description; an empty string clears it. | |
settings | LoomSettingsInput| null | Absent keeps the current settings. |
Response: Loom (200)
curl -X PATCH "https://api.maitento.com/looms/by-id/<id>" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"name":"...","description":"...","settings":{}}'await mt.looms.update("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { description: "What support agents learn about customers" });mt.looms.update("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", description="What the support desk has learnt")looms.inspect
Section titled “looms.inspect”GET /looms/by-id/{id}/inspectCounts and health of a loom.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Response: LoomInspection (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/inspect" \ -H "Authorization: $MAITENTO_AUTH"const inspection = await mt.looms.inspect("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.inspect("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.nightWeave
Section titled “looms.nightWeave”PUT /looms/by-id/{id}/night-weaveAsks for a night weave now (it runs in the background). Never retried.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Response: no body (202)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/night-weave" \ -H "Authorization: $MAITENTO_AUTH"await mt.looms.nightWeave("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.night_weave("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.nightWeavings
Section titled “looms.nightWeavings”GET /looms/by-id/{id}/night-weavingsThe loom’s recent night weavings.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer |
Response: NightWeaving[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/night-weavings" \ -H "Authorization: $MAITENTO_AUTH"const weavings = await mt.looms.nightWeavings("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { limit: 5 });mt.looms.night_weavings("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", limit=20)looms.panels
Section titled “looms.panels”GET /looms/by-id/{id}/panelsThe tapestry panels shown to agents.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer |
Response: TapestryPanel[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/panels" \ -H "Authorization: $MAITENTO_AUTH"const panels = await mt.looms.panels("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.panels("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.patterns
Section titled “looms.patterns”GET /looms/by-id/{id}/patternsThe codebase patterns the loom has learnt.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer |
Response: LoomPattern[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/patterns" \ -H "Authorization: $MAITENTO_AUTH"const patterns = await mt.looms.patterns("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.patterns("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f")looms.deletePattern
Section titled “looms.deletePattern”DELETE /looms/by-id/{id}/patterns/by-name/{codebase}Erases a codebase’s pattern (Tenant.Admin).
Who can call it: Tenant admins only, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
codebase | string | yes |
Response: no body (204)
curl -X DELETE "https://api.maitento.com/looms/by-id/<id>/patterns/by-name/<codebase>" \ -H "Authorization: $MAITENTO_AUTH"await mt.looms.deletePattern("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "acme/web-app");mt.looms.delete_pattern("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "acme/app")looms.pattern
Section titled “looms.pattern”GET /looms/by-id/{id}/patterns/by-name/{codebase}One codebase’s pattern. Throws NotFoundError when there is none.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
codebase | string | yes |
Response: LoomPattern (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/patterns/by-name/<codebase>" \ -H "Authorization: $MAITENTO_AUTH"const pattern = await mt.looms.pattern("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "acme/web-app");mt.looms.pattern("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "acme/app")looms.shapePattern
Section titled “looms.shapePattern”PUT /looms/by-id/{id}/patterns/by-name/{codebase}Changes a codebase’s pattern (adds or removes heuristics, key files, conventions).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
codebase | string | yes |
Request body: PatternChange
| Field | Type | Required | Description |
|---|---|---|---|
architecture | string | null | Replaces how the codebase is built, in a few sentences; an empty string clears it. Null leaves it as it is. | |
addHeuristics | string[] | Heuristics to add: how to find your way around the codebase. | |
addKeyFiles | string[] | Key files to add: entry points and the files that explain the rest. | |
addConventions | string[] | Conventions to add: style, patterns, rules. | |
remove | string[] | Items to drop, matched case-insensitively against the start of an item’s text. |
Response: LoomPattern (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/patterns/by-name/<codebase>" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"architecture":"...","addHeuristics":[],"addKeyFiles":[],"addConventions":[],"remove":[]}'await mt.looms.shapePattern("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "acme/web-app", { addConventions: ["Feature folders, one component per file"], addHeuristics: [], addKeyFiles: [], remove: [] });mt.looms.shape_pattern("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "acme/app", add_conventions=["Services own all business logic"])looms.reflect
Section titled “looms.reflect”PUT /looms/by-id/{id}/reflectReflects on a topic across the loom’s threads (runs a model). Never retried.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Request body: LoomReflectRequest
| Field | Type | Required | Description |
|---|---|---|---|
topic | string | yes | The topic: a subject, a person or a question. |
Response: LoomReflection (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/reflect" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"topic":"..."}'const reflection = await mt.looms.reflect("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { topic: "Why do refunds escalate?" });mt.looms.reflect("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "refund policy")looms.seed
Section titled “looms.seed”PUT /looms/by-id/{id}/seedSeeds this loom from another (fromLoomId, or fromLoom by name).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Request body: LoomSeedRequest
| Field | Type | Required | Description |
|---|---|---|---|
fromLoomId | uuid | null | The source loom’s id. | |
fromLoom | string | null | The source loom’s name, looked up in this loom’s namespace, or name@namespace for a loom in another namespace (named by its id or its name). | |
limit | integer | null | At most this many threads, strongest first. Absent: the most a seeding copies (200). |
Response: LoomSeeding (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/seed" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"fromLoomId":"...","fromLoom":"...","limit":0}'await mt.looms.seed("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { fromLoom: "company-handbook@shared" });mt.looms.seed("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", from_loom="support-memory@demo", limit=50)looms.sessions
Section titled “looms.sessions”GET /looms/by-id/{id}/sessionsThe sessions that wove into the loom.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer |
Response: LoomSession[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/sessions" \ -H "Authorization: $MAITENTO_AUTH"const sessions = await mt.looms.sessions("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e");mt.looms.sessions("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", limit=20)looms.tapestry
Section titled “looms.tapestry”GET /looms/by-id/{id}/tapestryWhat an agent would be shown from the loom (a preview of its tapestry).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
subjects | string[] | ||
agentName | string | ||
tokens | integer |
Response: TapestryPreview (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/tapestry" \ -H "Authorization: $MAITENTO_AUTH"const preview = await mt.looms.tapestry("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { subjects: ["customer:C-1042"], agentName: "Support" });mt.looms.tapestry("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", subjects=["refunds"], agent_name="Support", tokens=2000)looms.tensions
Section titled “looms.tensions”GET /looms/by-id/{id}/tensionsContradictions between threads.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
open | boolean | ||
limit | integer |
Response: LoomTensionView[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/tensions" \ -H "Authorization: $MAITENTO_AUTH"const tensions = await mt.looms.tensions("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { open: true });mt.looms.tensions("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", open=True)looms.resolveTension
Section titled “looms.resolveTension”PUT /looms/by-id/{id}/tensions/by-id/{tensionId}/resolveResolves a tension.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
tensionId | uuid | yes |
Request body: TensionResolveRequest
| Field | Type | Required | Description |
|---|---|---|---|
resolution | string | yes | How the tension was settled, in your own words. |
Response: LoomTensionView (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/tensions/by-id/<tensionId>/resolve" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"resolution":"..."}'await mt.looms.resolveTension("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "4b6d8f0a-2c4e-4a6b-9c8d-0e1f2a3b4c5d", { resolution: "The newer policy wins." });mt.looms.resolve_tension("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a", "The $200 limit is current.")looms.threads
Section titled “looms.threads”GET /looms/by-id/{id}/threadsThreads, filtered and sorted.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
kind | ThreadKind[] | ||
strand | ThreadStrand | ||
knots | ThreadKnotFilter | ||
pinned | boolean | ||
subject | string | ||
tag | string | ||
visibility | ThreadVisibility | ||
sort | ThreadListOrder | ||
skip | integer | ||
limit | integer |
Response: LoomThread[] (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/threads" \ -H "Authorization: $MAITENTO_AUTH"const threads = await mt.looms.threads("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { pinned: true, limit: 50 });mt.looms.threads("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", pinned=True, limit=50)looms.weave
Section titled “looms.weave”PUT /looms/by-id/{id}/threadsWeaves a thread in (or reinforces one it matches).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Request body: ThreadWeaveRequest
| Field | Type | Required | Description |
|---|---|---|---|
content | string | yes | The thread’s words: what to remember. |
kind | ThreadKind| null | What kind of memory it is. Absent: Semantic (a fact). | |
weight | number | null | How much it matters, 0 to 1. Absent: 0.6. | |
foundational | boolean | null | True makes it warp (never frays); false forces weft. Absent: warp only for relational threads. | |
decayRate | DecayRate| null | How quickly it frays when unused. Absent: the default for its kind and strand. | |
subjects | string[] | Who or what it is about, as named in conversation. | |
tags | string[] | Free-form tags. | |
private | boolean | True makes it a private note, offered only to the agent that wove it; one woven through the API is offered to no agent. | |
pinned | boolean | True holds it close: always part of what an agent wakes up knowing. | |
cues | string[] | null | Words (up to three each, at most 8) that bring the thread back when someone says them. | |
replaces | uuid | null | A thread this one corrects or replaces: it is let go once this is woven, keeping what it said. | |
until | datetime | null | When it stops holding (a deadline, a plan’s day, a reminder that stops mattering); must be in the future. A bare day ("2026-10-30") holds until that day is over, as it does for an agent’s LoomWeave tool; a time with no zone is UTC. | |
basis | ThreadBasis| null | What it rests on: Said (default), Impression (a reading nobody said) or Read (from a document or tool). |
Response: WeaveResult (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"content":"..."}'await mt.looms.weave("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { content: "Ada prefers e-mail to phone calls.", subjects: ["customer:C-1042"], tags: [], private: false, pinned: false });mt.looms.weave("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", content="Refunds over $100 need a manager.", subjects=["refunds"])looms.deleteThread
Section titled “looms.deleteThread”DELETE /looms/by-id/{id}/threads/by-id/{threadId}Erases one thread (Tenant.Admin).
Who can call it: Tenant admins only, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Response: no body (204)
curl -X DELETE "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>" \ -H "Authorization: $MAITENTO_AUTH"await mt.looms.deleteThread("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f");mt.looms.delete_thread("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f")looms.thread
Section titled “looms.thread”GET /looms/by-id/{id}/threads/by-id/{threadId}One thread. Throws NotFoundError when there is none.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Response: LoomThread (200)
curl -X GET "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>" \ -H "Authorization: $MAITENTO_AUTH"const thread = await mt.looms.thread("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f");mt.looms.thread("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f")looms.cut
Section titled “looms.cut”PUT /looms/by-id/{id}/threads/by-id/{threadId}/cutCuts a thread (it is let go, leaving its essence).
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Request body: ThreadCutRequest
| Field | Type | Required | Description |
|---|---|---|---|
acknowledgment | string | yes | Why the thread is let go. The knot keeps it. |
essence | string | null | What remains after release. Optional: some things are let go entirely. |
Response: LoomThread (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>/cut" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"acknowledgment":"..."}'await mt.looms.cut("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f", { acknowledgment: "Superseded by the 2026 pricing." });mt.looms.cut("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f", acknowledgment="Superseded by the new policy")looms.give
Section titled “looms.give”PUT /looms/by-id/{id}/threads/by-id/{threadId}/giveGives a thread to another loom (toLoomId, or toLoom: "name" or "name@namespace").
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Request body: ThreadGiveRequest
| Field | Type | Required | Description |
|---|---|---|---|
toLoomId | uuid | null | The receiving loom’s id. | |
toLoom | string | null | The receiving loom’s name, looked up in the giving loom’s namespace, or name@namespace for a loom in another namespace (named by its id or its name). | |
note | string | null | What the giver says with it (at most 500 characters, never a credential). Kept on the arrival’s provenance. |
Response: WeaveResult (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>/give" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"toLoomId":"...","toLoom":"...","note":"..."}'await mt.looms.give("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f", { toLoom: "sales-memory", note: "Useful for renewals" });mt.looms.give("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f", to_loom="sales-memory@demo")looms.pin
Section titled “looms.pin”PUT /looms/by-id/{id}/threads/by-id/{threadId}/pinPins or unpins a thread.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Request body: ThreadPinRequest
| Field | Type | Required | Description |
|---|---|---|---|
pinned | boolean | null | yes | True holds the thread in every future tapestry; false releases it. |
Response: LoomThread (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>/pin" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"pinned":false}'await mt.looms.pin("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f", { pinned: true });mt.looms.pin("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f")looms.reframe
Section titled “looms.reframe”PUT /looms/by-id/{id}/threads/by-id/{threadId}/reframeRewrites a thread, with the reason.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes | |
threadId | uuid | yes |
Request body: ThreadReframeRequest
| Field | Type | Required | Description |
|---|---|---|---|
content | string | null | The thread’s new words. Absent keeps them. | |
weight | number | null | The thread’s new weight, 0 to 1. Absent keeps it. | |
foundational | boolean | null | True makes it warp (never frays); false makes it weft. Absent keeps its strand. | |
reason | string | yes | Why it changed. Kept on the seam the reframe leaves. |
acknowledgment | string | null | Required to revise a warp thread or to make a thread warp: the explicit acknowledgment that a foundation is changing. | |
cues | string[] | null | Replaces the words the thread waits for; empty clears them; absent leaves them as they are. |
Response: LoomThread (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads/by-id/<threadId>/reframe" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"reason":"..."}'await mt.looms.reframe("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", "7a5c3e1f-9b8d-4c6a-8e2f-1d3b5a7c9e0f", { content: "Ada prefers e-mail, never before 9am.", reason: "She asked again." });mt.looms.reframe("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f", reason="The limit changed", content="Refunds over $200 need a manager.")looms.recall
Section titled “looms.recall”PUT /looms/by-id/{id}/threads/recallThe threads most relevant to a query.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | uuid | yes |
Request body: ThreadRecallRequest
| Field | Type | Required | Description |
|---|---|---|---|
query | string | yes | What to look for. |
kinds | ThreadKind[] | null | Only threads of these kinds. Absent: every kind. | |
limit | integer | The most threads to return, 1 to 50. Defaults to 8. | |
subjects | string[] | null | The people present: threads about them rank higher. | |
recencyBias | number | null | 0 = salience only; 1 = strongly favour recently used threads. Absent: the loom’s default. |
Response: ThreadRecollection[] (200)
curl -X PUT "https://api.maitento.com/looms/by-id/<id>/threads/recall" \ -H "Authorization: $MAITENTO_AUTH" \ -H "Content-Type: application/json" \ -d '{"query":"..."}'const recalled = await mt.looms.recall("2c9a7e5b-3d1f-4a8c-b6e4-9f0d2c1b3a5e", { query: "How does Ada like to be contacted?", limit: 5 });mt.looms.recall("5c6d7e8f-9a0b-4c1d-8e2f-3a4b5c6d7e8f", "What is the refund limit?", limit=5)looms.list
Section titled “looms.list”GET /looms/by-namespace/{namespaceId}The looms of a namespace. Give namespaceId, or a namespace NAME (namespace, else the client default), which is looked up first.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
namespaceId | uuid | yes |
Response: Loom[] (200)
curl -X GET "https://api.maitento.com/looms/by-namespace/<namespaceId>" \ -H "Authorization: $MAITENTO_AUTH"const looms = await mt.looms.list({ namespaceId: "b5f3d1a9-7e6c-4b4a-9a2e-8c0d1f3e5a7b" });mt.looms.list("0f1e2d3c-4b5a-4968-8776-655443322110")looms.nightWeavingsSince
Section titled “looms.nightWeavingsSince”GET /looms/night-weavingsNight weavings of every loom since an instant.
Who can call it: Admins and members, with an API key or a portal session. Try it in the API playground.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
since | datetime | ||
limit | integer |
Response: NightWeaving[] (200)
curl -X GET "https://api.maitento.com/looms/night-weavings" \ -H "Authorization: $MAITENTO_AUTH"const weavings = await mt.looms.nightWeavingsSince({ since: new Date("2026-10-25T00:00:00Z") });mt.looms.night_weavings_since(datetime.datetime(2026, 10, 1, tzinfo=datetime.timezone.utc))