[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-twilio-twilio-conversation-memory":3,"mdc-phjlju-key":30,"related-repo-twilio-twilio-conversation-memory":2303,"related-org-twilio-twilio-conversation-memory":2409},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":28,"mdContent":29},"twilio-conversation-memory","manage conversation memory with Twilio","Store and retrieve conversation context using Twilio Conversation Memory. Covers Memory Store provisioning, profile management, traits, observations, conversation summaries, and semantic Recall. Use this skill to give AI agents or human agents persistent memory of conversations across sessions and channels.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"twilio","Twilio","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftwilio.png",[12,16,19],{"name":13,"slug":14,"type":15},"Memory","memory","tag",{"name":17,"slug":18,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},25,"https:\u002F\u002Fgithub.com\u002Ftwilio\u002Fai","2026-07-17T06:04:19.526724",null,7,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":23},[],"https:\u002F\u002Fgithub.com\u002Ftwilio\u002Fai\u002Ftree\u002FHEAD\u002Fskills\u002Ftwilio\u002Ftwilio-conversation-memory","---\nname: twilio-conversation-memory\ndescription: >\n  Store and retrieve conversation context using Twilio Conversation Memory.\n  Covers Memory Store provisioning, profile management, traits, observations,\n  conversation summaries, and semantic Recall. Use this skill to give AI agents\n  or human agents persistent memory of conversations across sessions\n  and channels.\n---\n\n## Overview\n\nConversation Memory gives agents persistent, cross-session context about customers. A **Memory Store** holds profiles, observations, summaries, and traits. Data enters two ways:\n\n1. **Automatic:** Link a Conversation Orchestrator config to a store. Profiles are auto-created per caller. At conversation close, observations and summaries are extracted from the transcript and saved. Conflicting data is automatically reconciled.\n\n2. **Direct API:** POST observations, summaries, or traits yourself for any use case.\n\nData comes out via **Recall** — hybrid semantic + lexical search that surfaces the most relevant profile data. For voice agents where latency is critical, use `GET \u002FObservations` directly instead.\n\n**Base URL:** `https:\u002F\u002Fmemory.twilio.com`\n\n**Authentication:** HTTP Basic — `Authorization: Basic {base64(accountSid:authToken)}`\n\n**Rules for agents:**\n- Always poll `statusUrl` after any 202 response — all writes are async\n- Always create a trait group before writing traits of that group\n- Always use E.164 format for phone numbers (`+15558675310`)\n- Always verify store status is `ACTIVE` before operating on it\n- Never use `\u002Fv1\u002FServices\u002F` paths — correct paths are `\u002Fv1\u002FControlPlane\u002FStores` (config) and `\u002Fv1\u002FStores\u002F{storeId}\u002F...` (data)\n- Never exceed 10 observations per batch or 4096 characters per observation\n- Never assume writes are immediately readable — indexing is async\n- Never send PCI or HIPAA data — not yet compliant\n\n---\n\n## Prerequisites\n\n- Twilio account with Account SID and Auth Token\n  — A credit card must be added to the account\n  — See `twilio-account-setup` for initial setup\n  — See `twilio-iam-auth-setup` for credential best practices\n- Environment variables:\n  - `TWILIO_ACCOUNT_SID`\n  - `TWILIO_AUTH_TOKEN`\n- SDK: `pip install twilio` \u002F `npm install twilio`\n- For automatic extraction: a Conversation Orchestrator configuration — see `twilio-conversation-orchestrator`\n\n---\n\n## Quickstart\n\n**Step 1 — Create a Memory Store**\n\n**Python**\n```python\nimport os, requests\nfrom requests.auth import HTTPBasicAuth\n\naccount_sid = os.environ[\"TWILIO_ACCOUNT_SID\"]\nauth_token = os.environ[\"TWILIO_AUTH_TOKEN\"]\nbase_url = \"https:\u002F\u002Fmemory.twilio.com\"\nauth = HTTPBasicAuth(account_sid, auth_token)\n\nstore = requests.post(\n    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\",\n    auth=auth,\n    json={\"displayName\": \"my-store\", \"description\": \"Customer memory\"}\n).json()\n\nprint(store[\"id\"])  # mem_store_xxx — save this\n# Poll store[\"statusUrl\"] until status is ACTIVE\n```\n\n**Node.js**\n```node\nconst axios = require(\"axios\");\n\nconst accountSid = process.env.TWILIO_ACCOUNT_SID;\nconst authToken = process.env.TWILIO_AUTH_TOKEN;\nconst baseUrl = \"https:\u002F\u002Fmemory.twilio.com\";\nconst auth = { username: accountSid, password: authToken };\n\nconst { data: store } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores`,\n    { displayName: \"my-store\", description: \"Customer memory\" },\n    { auth }\n);\n\nconsole.log(store.id);  \u002F\u002F mem_store_xxx\n\u002F\u002F Poll store.statusUrl until status is ACTIVE\n```\n\n**Step 2 — Create a profile with identity resolution**\n\n**Python**\n```python\nprofile = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\",\n    auth=auth,\n    json={\"traits\": {\"contact\": {\"phone\": \"+15558675310\", \"name\": \"Alex\"}}}\n).json()\n\nprofile_id = profile[\"id\"]  # mem_profile_xxx\n```\n\n**Node.js**\n```node\nconst { data: profile } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles`,\n    { traits: { contact: { phone: \"+15558675310\", name: \"Alex\" } } },\n    { auth }\n);\n\nconst profileId = profile.id;  \u002F\u002F mem_profile_xxx\n```\n\n**Step 3 — Post observations (quick test)**\n\nPost an observation directly to quickly test Recall in step 4. In production, the preferred path is connecting your Memory Store to a Conversation Orchestrator configuration — observations are then automatically extracted from conversations without manual POSTs. See `twilio-conversation-orchestrator`.\n\n**Python**\n```python\nrequests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FObservations\",\n    auth=auth,\n    json={\"observations\": [{\n        \"content\": \"Customer prefers email communication over phone calls\",\n        \"source\": \"support-agent\",\n        \"occurredAt\": \"2025-01-15T10:30:00Z\"\n    }]}\n)\n# 202 — poll statusUrl for completion\n```\n\n**Node.js**\n```node\nawait axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FObservations`,\n    { observations: [{\n        content: \"Customer prefers email communication over phone calls\",\n        source: \"support-agent\",\n        occurredAt: \"2025-01-15T10:30:00Z\",\n    }] },\n    { auth }\n);\n\u002F\u002F 202 — poll statusUrl for completion\n```\n\n**Step 4 — Recall relevant context**\n\n**Python**\n```python\nrecall = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FRecall\",\n    auth=auth,\n    json={\"query\": \"communication preferences\"}\n).json()\n\nfor obs in recall[\"observations\"]:\n    print(f\"[{obs['score']:.2f}] {obs['content']}\")\n```\n\n**Node.js**\n```node\nconst { data: recall } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FRecall`,\n    { query: \"communication preferences\" },\n    { auth }\n);\n\nfor (const obs of recall.observations) {\n    console.log(`[${obs.score.toFixed(2)}] ${obs.content}`);\n}\n```\n\n---\n\n## Key Patterns\n\n### Recall Modes\n\n| Mode | Request | When to use |\n|------|---------|-------------|\n| Explicit query | `{\"query\": \"shipping preferences\"}` | You control relevance |\n| Conversation context | `{\"conversationId\": \"conv_conversation_xxx\"}` | Active Orchestrator conversation — auto-generates query from last 10 messages |\n| Most recent | `{}` (omit both) | Chronological order, no relevance ranking |\n\nAdditional Recall parameters: `observationsLimit` (default 20, 0–100), `summariesLimit` (default 5), `communicationsLimit` (default 0, requires conversationId), `relevanceThreshold` (0–1), `beginDate`\u002F`endDate`.\n\n### Profile Resolution\n\n| I have... | Use | Behavior |\n|-----------|-----|----------|\n| Profile ID | `PATCH \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002F{profileId}` | Direct update |\n| An identifier (phone, email) | `POST \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles` | Identity resolution finds or creates |\n| Bulk contact data | `PUT \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002FBulk` | Up to 1000, identity-resolved |\n| CSV file | `POST \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002FImports` | Presigned URL upload |\n\nCheck for 308 redirects on profile endpoints — indicates a merged profile.\n\n### Trait Groups\n\nEvery trait must belong to a trait group. You must create the group (or add the trait to an existing group) before writing trait values to a profile.\n\nEach trait has a `dataType` (STRING, NUMBER, BOOLEAN, ARRAY). Set `idTypePromotion` on a trait (e.g., `\"phone\"`) to make it an identifier for Lookup and identity resolution.\n\n**Add a new trait to an existing group:**\n\nUse `PATCH \u002Fv1\u002FControlPlane\u002FStores\u002F{storeId}\u002FTraitGroups\u002F{traitGroupName}` — pass the new trait definition in the request body. Only the new traits need to be included; existing traits are unchanged.\n\n**Python**\n```python\nrequests.patch(\n    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\u002F{store['id']}\u002FTraitGroups\u002Fcontact\",\n    auth=auth,\n    json={\"traits\": {\n        \"preferred_channel\": {\"dataType\": \"STRING\", \"description\": \"Preferred contact method\"}\n    }}\n)\n# 202 — adds \"preferred_channel\" to the existing \"contact\" group\n```\n\n**Node.js**\n```node\nawait axios.patch(\n    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores\u002F${store.id}\u002FTraitGroups\u002Fcontact`,\n    { traits: {\n        preferred_channel: { dataType: \"STRING\", description: \"Preferred contact method\" },\n    } },\n    { auth }\n);\n\u002F\u002F 202 — adds \"preferred_channel\" to the existing \"contact\" group\n```\n\nTo remove a trait from a group, PATCH with `\"dataType\": \"\"` for that trait name.\n\n### Automatic Extraction (Orchestrator Integration)\n\n1. Create a Memory Store\n2. Create a Conversation Orchestrator Configuration with capture rules\n3. Link the store to the config\n\nOnce linked: profiles are auto-created per caller, and extraction is tied to the conversation lifecycle configured in Orchestrator. By default, observations are extracted when a conversation goes inactive or ends. Conversation summaries are generated when a conversation ends. These lifecycle transitions are configurable in your Orchestrator configuration — how you define conversation status timeouts determines when memory extraction runs. Conflicting information is automatically reconciled. See `twilio-conversation-orchestrator`.\n\n### Lookup by Identifier\n\n**Python**\n```python\nresult = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002FLookup\",\n    auth=auth,\n    json={\"idType\": \"phone\", \"value\": \"+15558675310\"}\n).json()\n\nprofile_id = result[\"profiles\"][0][\"id\"]\n```\n\n**Node.js**\n```node\nconst { data: result } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002FLookup`,\n    { idType: \"phone\", value: \"+15558675310\" },\n    { auth }\n);\n\nconst profileId = result.profiles[0].id;\n```\n\n### Voice Agent Latency Optimization\n\nFor voice agents where latency matters, skip semantic search and fetch observations directly:\n\n**Python**\n```python\nobservations = requests.get(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FObservations\",\n    auth=auth,\n    params={\"source\": \"support-agent\", \"createdAfter\": \"2025-01-01T00:00:00Z\"}\n).json()\n```\n\n**Node.js**\n```node\nconst { data: observations } = await axios.get(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FObservations`,\n    { auth, params: { source: \"support-agent\", createdAfter: \"2025-01-01T00:00:00Z\" } }\n);\n```\n\n### Async Polling Pattern\n\nAll 202 responses include a `statusUrl`. Poll until `status` is `COMPLETED` or `FAILED`:\n\n**Python**\n```python\nimport time\n\nstatus_url = store[\"statusUrl\"]\nwhile True:\n    op = requests.get(status_url, auth=auth).json()\n    if op[\"status\"] in (\"COMPLETED\", \"FAILED\", \"CANCELLED\"):\n        break\n    time.sleep(2)\n```\n\n**Node.js**\n```node\nlet op;\ndo {\n    await new Promise(r => setTimeout(r, 2000));\n    op = (await axios.get(store.statusUrl, { auth })).data;\n} while (![\"COMPLETED\", \"FAILED\", \"CANCELLED\"].includes(op.status));\n```\n\n---\n\n## CANNOT\n\n- Cannot exceed 15 Memory Stores per account — use sub-accounts beyond this\n- Cannot batch more than 10 observations per request\n- Cannot exceed 4096 characters per observation\n- Cannot write traits to a group that doesn't exist — create the trait group first\n- Cannot recover deleted profiles or observations — deletion is irreversible\n- Cannot read data immediately after write — indexing is async\n- Cannot auto-extract observations without a linked Orchestrator config\n- Cannot exceed 1000 profiles per bulk upsert\n- Cannot include auth headers when uploading to presigned import URLs — they're pre-signed\n- Cannot use spaces or underscores in store displayName — pattern is `^[a-zA-Z0-9-]+$`\n\n---\n\n## Next Steps\n\n- **Automatic conversation capture:** `twilio-conversation-orchestrator`\n- **Background transcript intelligence (script adherence, NBR, scoring):** `twilio-conversation-intelligence`\n- **Enterprise knowledge retrieval (RAG):** `twilio-enterprise-knowledge`\n- **Voice agent with ConversationRelay:** `twilio-voice-conversation-relay`\n- **TAC SDK middleware:** `twilio-agent-connect`\n- **Debug issues:** `twilio-debugging-observability`\n",{"data":31,"body":32},{"name":4,"description":6},{"type":33,"children":34},"root",[35,44,58,83,104,120,136,144,236,240,246,326,329,335,343,351,506,514,640,648,655,715,722,782,790,802,809,895,902,987,995,1002,1070,1077,1153,1156,1162,1169,1270,1322,1328,1443,1448,1454,1459,1488,1496,1509,1516,1585,1592,1661,1674,1680,1698,1709,1715,1722,1782,1789,1849,1855,1860,1867,1911,1918,1955,1961,1997,2004,2074,2081,2128,2131,2137,2196,2199,2205,2297],{"type":36,"tag":37,"props":38,"children":40},"element","h2",{"id":39},"overview",[41],{"type":42,"value":43},"text","Overview",{"type":36,"tag":45,"props":46,"children":47},"p",{},[48,50,56],{"type":42,"value":49},"Conversation Memory gives agents persistent, cross-session context about customers. A ",{"type":36,"tag":51,"props":52,"children":53},"strong",{},[54],{"type":42,"value":55},"Memory Store",{"type":42,"value":57}," holds profiles, observations, summaries, and traits. Data enters two ways:",{"type":36,"tag":59,"props":60,"children":61},"ol",{},[62,73],{"type":36,"tag":63,"props":64,"children":65},"li",{},[66,71],{"type":36,"tag":51,"props":67,"children":68},{},[69],{"type":42,"value":70},"Automatic:",{"type":42,"value":72}," Link a Conversation Orchestrator config to a store. Profiles are auto-created per caller. At conversation close, observations and summaries are extracted from the transcript and saved. Conflicting data is automatically reconciled.",{"type":36,"tag":63,"props":74,"children":75},{},[76,81],{"type":36,"tag":51,"props":77,"children":78},{},[79],{"type":42,"value":80},"Direct API:",{"type":42,"value":82}," POST observations, summaries, or traits yourself for any use case.",{"type":36,"tag":45,"props":84,"children":85},{},[86,88,93,95,102],{"type":42,"value":87},"Data comes out via ",{"type":36,"tag":51,"props":89,"children":90},{},[91],{"type":42,"value":92},"Recall",{"type":42,"value":94}," — hybrid semantic + lexical search that surfaces the most relevant profile data. For voice agents where latency is critical, use ",{"type":36,"tag":96,"props":97,"children":99},"code",{"className":98},[],[100],{"type":42,"value":101},"GET \u002FObservations",{"type":42,"value":103}," directly instead.",{"type":36,"tag":45,"props":105,"children":106},{},[107,112,114],{"type":36,"tag":51,"props":108,"children":109},{},[110],{"type":42,"value":111},"Base URL:",{"type":42,"value":113}," ",{"type":36,"tag":96,"props":115,"children":117},{"className":116},[],[118],{"type":42,"value":119},"https:\u002F\u002Fmemory.twilio.com",{"type":36,"tag":45,"props":121,"children":122},{},[123,128,130],{"type":36,"tag":51,"props":124,"children":125},{},[126],{"type":42,"value":127},"Authentication:",{"type":42,"value":129}," HTTP Basic — ",{"type":36,"tag":96,"props":131,"children":133},{"className":132},[],[134],{"type":42,"value":135},"Authorization: Basic {base64(accountSid:authToken)}",{"type":36,"tag":45,"props":137,"children":138},{},[139],{"type":36,"tag":51,"props":140,"children":141},{},[142],{"type":42,"value":143},"Rules for agents:",{"type":36,"tag":145,"props":146,"children":147},"ul",{},[148,161,166,179,192,221,226,231],{"type":36,"tag":63,"props":149,"children":150},{},[151,153,159],{"type":42,"value":152},"Always poll ",{"type":36,"tag":96,"props":154,"children":156},{"className":155},[],[157],{"type":42,"value":158},"statusUrl",{"type":42,"value":160}," after any 202 response — all writes are async",{"type":36,"tag":63,"props":162,"children":163},{},[164],{"type":42,"value":165},"Always create a trait group before writing traits of that group",{"type":36,"tag":63,"props":167,"children":168},{},[169,171,177],{"type":42,"value":170},"Always use E.164 format for phone numbers (",{"type":36,"tag":96,"props":172,"children":174},{"className":173},[],[175],{"type":42,"value":176},"+15558675310",{"type":42,"value":178},")",{"type":36,"tag":63,"props":180,"children":181},{},[182,184,190],{"type":42,"value":183},"Always verify store status is ",{"type":36,"tag":96,"props":185,"children":187},{"className":186},[],[188],{"type":42,"value":189},"ACTIVE",{"type":42,"value":191}," before operating on it",{"type":36,"tag":63,"props":193,"children":194},{},[195,197,203,205,211,213,219],{"type":42,"value":196},"Never use ",{"type":36,"tag":96,"props":198,"children":200},{"className":199},[],[201],{"type":42,"value":202},"\u002Fv1\u002FServices\u002F",{"type":42,"value":204}," paths — correct paths are ",{"type":36,"tag":96,"props":206,"children":208},{"className":207},[],[209],{"type":42,"value":210},"\u002Fv1\u002FControlPlane\u002FStores",{"type":42,"value":212}," (config) and ",{"type":36,"tag":96,"props":214,"children":216},{"className":215},[],[217],{"type":42,"value":218},"\u002Fv1\u002FStores\u002F{storeId}\u002F...",{"type":42,"value":220}," (data)",{"type":36,"tag":63,"props":222,"children":223},{},[224],{"type":42,"value":225},"Never exceed 10 observations per batch or 4096 characters per observation",{"type":36,"tag":63,"props":227,"children":228},{},[229],{"type":42,"value":230},"Never assume writes are immediately readable — indexing is async",{"type":36,"tag":63,"props":232,"children":233},{},[234],{"type":42,"value":235},"Never send PCI or HIPAA data — not yet compliant",{"type":36,"tag":237,"props":238,"children":239},"hr",{},[],{"type":36,"tag":37,"props":241,"children":243},{"id":242},"prerequisites",[244],{"type":42,"value":245},"Prerequisites",{"type":36,"tag":145,"props":247,"children":248},{},[249,270,296,315],{"type":36,"tag":63,"props":250,"children":251},{},[252,254,260,262,268],{"type":42,"value":253},"Twilio account with Account SID and Auth Token\n— A credit card must be added to the account\n— See ",{"type":36,"tag":96,"props":255,"children":257},{"className":256},[],[258],{"type":42,"value":259},"twilio-account-setup",{"type":42,"value":261}," for initial setup\n— See ",{"type":36,"tag":96,"props":263,"children":265},{"className":264},[],[266],{"type":42,"value":267},"twilio-iam-auth-setup",{"type":42,"value":269}," for credential best practices",{"type":36,"tag":63,"props":271,"children":272},{},[273,275],{"type":42,"value":274},"Environment variables:\n",{"type":36,"tag":145,"props":276,"children":277},{},[278,287],{"type":36,"tag":63,"props":279,"children":280},{},[281],{"type":36,"tag":96,"props":282,"children":284},{"className":283},[],[285],{"type":42,"value":286},"TWILIO_ACCOUNT_SID",{"type":36,"tag":63,"props":288,"children":289},{},[290],{"type":36,"tag":96,"props":291,"children":293},{"className":292},[],[294],{"type":42,"value":295},"TWILIO_AUTH_TOKEN",{"type":36,"tag":63,"props":297,"children":298},{},[299,301,307,309],{"type":42,"value":300},"SDK: ",{"type":36,"tag":96,"props":302,"children":304},{"className":303},[],[305],{"type":42,"value":306},"pip install twilio",{"type":42,"value":308}," \u002F ",{"type":36,"tag":96,"props":310,"children":312},{"className":311},[],[313],{"type":42,"value":314},"npm install twilio",{"type":36,"tag":63,"props":316,"children":317},{},[318,320],{"type":42,"value":319},"For automatic extraction: a Conversation Orchestrator configuration — see ",{"type":36,"tag":96,"props":321,"children":323},{"className":322},[],[324],{"type":42,"value":325},"twilio-conversation-orchestrator",{"type":36,"tag":237,"props":327,"children":328},{},[],{"type":36,"tag":37,"props":330,"children":332},{"id":331},"quickstart",[333],{"type":42,"value":334},"Quickstart",{"type":36,"tag":45,"props":336,"children":337},{},[338],{"type":36,"tag":51,"props":339,"children":340},{},[341],{"type":42,"value":342},"Step 1 — Create a Memory Store",{"type":36,"tag":45,"props":344,"children":345},{},[346],{"type":36,"tag":51,"props":347,"children":348},{},[349],{"type":42,"value":350},"Python",{"type":36,"tag":352,"props":353,"children":358},"pre",{"className":354,"code":355,"language":356,"meta":357,"style":357},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import os, requests\nfrom requests.auth import HTTPBasicAuth\n\naccount_sid = os.environ[\"TWILIO_ACCOUNT_SID\"]\nauth_token = os.environ[\"TWILIO_AUTH_TOKEN\"]\nbase_url = \"https:\u002F\u002Fmemory.twilio.com\"\nauth = HTTPBasicAuth(account_sid, auth_token)\n\nstore = requests.post(\n    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\",\n    auth=auth,\n    json={\"displayName\": \"my-store\", \"description\": \"Customer memory\"}\n).json()\n\nprint(store[\"id\"])  # mem_store_xxx — save this\n# Poll store[\"statusUrl\"] until status is ACTIVE\n","python","",[359],{"type":36,"tag":96,"props":360,"children":361},{"__ignoreMap":357},[362,373,382,392,401,410,419,427,435,444,453,462,471,480,488,497],{"type":36,"tag":363,"props":364,"children":367},"span",{"class":365,"line":366},"line",1,[368],{"type":36,"tag":363,"props":369,"children":370},{},[371],{"type":42,"value":372},"import os, requests\n",{"type":36,"tag":363,"props":374,"children":376},{"class":365,"line":375},2,[377],{"type":36,"tag":363,"props":378,"children":379},{},[380],{"type":42,"value":381},"from requests.auth import HTTPBasicAuth\n",{"type":36,"tag":363,"props":383,"children":385},{"class":365,"line":384},3,[386],{"type":36,"tag":363,"props":387,"children":389},{"emptyLinePlaceholder":388},true,[390],{"type":42,"value":391},"\n",{"type":36,"tag":363,"props":393,"children":395},{"class":365,"line":394},4,[396],{"type":36,"tag":363,"props":397,"children":398},{},[399],{"type":42,"value":400},"account_sid = os.environ[\"TWILIO_ACCOUNT_SID\"]\n",{"type":36,"tag":363,"props":402,"children":404},{"class":365,"line":403},5,[405],{"type":36,"tag":363,"props":406,"children":407},{},[408],{"type":42,"value":409},"auth_token = os.environ[\"TWILIO_AUTH_TOKEN\"]\n",{"type":36,"tag":363,"props":411,"children":413},{"class":365,"line":412},6,[414],{"type":36,"tag":363,"props":415,"children":416},{},[417],{"type":42,"value":418},"base_url = \"https:\u002F\u002Fmemory.twilio.com\"\n",{"type":36,"tag":363,"props":420,"children":421},{"class":365,"line":24},[422],{"type":36,"tag":363,"props":423,"children":424},{},[425],{"type":42,"value":426},"auth = HTTPBasicAuth(account_sid, auth_token)\n",{"type":36,"tag":363,"props":428,"children":430},{"class":365,"line":429},8,[431],{"type":36,"tag":363,"props":432,"children":433},{"emptyLinePlaceholder":388},[434],{"type":42,"value":391},{"type":36,"tag":363,"props":436,"children":438},{"class":365,"line":437},9,[439],{"type":36,"tag":363,"props":440,"children":441},{},[442],{"type":42,"value":443},"store = requests.post(\n",{"type":36,"tag":363,"props":445,"children":447},{"class":365,"line":446},10,[448],{"type":36,"tag":363,"props":449,"children":450},{},[451],{"type":42,"value":452},"    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\",\n",{"type":36,"tag":363,"props":454,"children":456},{"class":365,"line":455},11,[457],{"type":36,"tag":363,"props":458,"children":459},{},[460],{"type":42,"value":461},"    auth=auth,\n",{"type":36,"tag":363,"props":463,"children":465},{"class":365,"line":464},12,[466],{"type":36,"tag":363,"props":467,"children":468},{},[469],{"type":42,"value":470},"    json={\"displayName\": \"my-store\", \"description\": \"Customer memory\"}\n",{"type":36,"tag":363,"props":472,"children":474},{"class":365,"line":473},13,[475],{"type":36,"tag":363,"props":476,"children":477},{},[478],{"type":42,"value":479},").json()\n",{"type":36,"tag":363,"props":481,"children":483},{"class":365,"line":482},14,[484],{"type":36,"tag":363,"props":485,"children":486},{"emptyLinePlaceholder":388},[487],{"type":42,"value":391},{"type":36,"tag":363,"props":489,"children":491},{"class":365,"line":490},15,[492],{"type":36,"tag":363,"props":493,"children":494},{},[495],{"type":42,"value":496},"print(store[\"id\"])  # mem_store_xxx — save this\n",{"type":36,"tag":363,"props":498,"children":500},{"class":365,"line":499},16,[501],{"type":36,"tag":363,"props":502,"children":503},{},[504],{"type":42,"value":505},"# Poll store[\"statusUrl\"] until status is ACTIVE\n",{"type":36,"tag":45,"props":507,"children":508},{},[509],{"type":36,"tag":51,"props":510,"children":511},{},[512],{"type":42,"value":513},"Node.js",{"type":36,"tag":352,"props":515,"children":519},{"className":516,"code":517,"language":518,"meta":357,"style":357},"language-node shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const axios = require(\"axios\");\n\nconst accountSid = process.env.TWILIO_ACCOUNT_SID;\nconst authToken = process.env.TWILIO_AUTH_TOKEN;\nconst baseUrl = \"https:\u002F\u002Fmemory.twilio.com\";\nconst auth = { username: accountSid, password: authToken };\n\nconst { data: store } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores`,\n    { displayName: \"my-store\", description: \"Customer memory\" },\n    { auth }\n);\n\nconsole.log(store.id);  \u002F\u002F mem_store_xxx\n\u002F\u002F Poll store.statusUrl until status is ACTIVE\n","node",[520],{"type":36,"tag":96,"props":521,"children":522},{"__ignoreMap":357},[523,531,538,546,554,562,570,577,585,593,601,609,617,624,632],{"type":36,"tag":363,"props":524,"children":525},{"class":365,"line":366},[526],{"type":36,"tag":363,"props":527,"children":528},{},[529],{"type":42,"value":530},"const axios = require(\"axios\");\n",{"type":36,"tag":363,"props":532,"children":533},{"class":365,"line":375},[534],{"type":36,"tag":363,"props":535,"children":536},{"emptyLinePlaceholder":388},[537],{"type":42,"value":391},{"type":36,"tag":363,"props":539,"children":540},{"class":365,"line":384},[541],{"type":36,"tag":363,"props":542,"children":543},{},[544],{"type":42,"value":545},"const accountSid = process.env.TWILIO_ACCOUNT_SID;\n",{"type":36,"tag":363,"props":547,"children":548},{"class":365,"line":394},[549],{"type":36,"tag":363,"props":550,"children":551},{},[552],{"type":42,"value":553},"const authToken = process.env.TWILIO_AUTH_TOKEN;\n",{"type":36,"tag":363,"props":555,"children":556},{"class":365,"line":403},[557],{"type":36,"tag":363,"props":558,"children":559},{},[560],{"type":42,"value":561},"const baseUrl = \"https:\u002F\u002Fmemory.twilio.com\";\n",{"type":36,"tag":363,"props":563,"children":564},{"class":365,"line":412},[565],{"type":36,"tag":363,"props":566,"children":567},{},[568],{"type":42,"value":569},"const auth = { username: accountSid, password: authToken };\n",{"type":36,"tag":363,"props":571,"children":572},{"class":365,"line":24},[573],{"type":36,"tag":363,"props":574,"children":575},{"emptyLinePlaceholder":388},[576],{"type":42,"value":391},{"type":36,"tag":363,"props":578,"children":579},{"class":365,"line":429},[580],{"type":36,"tag":363,"props":581,"children":582},{},[583],{"type":42,"value":584},"const { data: store } = await axios.post(\n",{"type":36,"tag":363,"props":586,"children":587},{"class":365,"line":437},[588],{"type":36,"tag":363,"props":589,"children":590},{},[591],{"type":42,"value":592},"    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores`,\n",{"type":36,"tag":363,"props":594,"children":595},{"class":365,"line":446},[596],{"type":36,"tag":363,"props":597,"children":598},{},[599],{"type":42,"value":600},"    { displayName: \"my-store\", description: \"Customer memory\" },\n",{"type":36,"tag":363,"props":602,"children":603},{"class":365,"line":455},[604],{"type":36,"tag":363,"props":605,"children":606},{},[607],{"type":42,"value":608},"    { auth }\n",{"type":36,"tag":363,"props":610,"children":611},{"class":365,"line":464},[612],{"type":36,"tag":363,"props":613,"children":614},{},[615],{"type":42,"value":616},");\n",{"type":36,"tag":363,"props":618,"children":619},{"class":365,"line":473},[620],{"type":36,"tag":363,"props":621,"children":622},{"emptyLinePlaceholder":388},[623],{"type":42,"value":391},{"type":36,"tag":363,"props":625,"children":626},{"class":365,"line":482},[627],{"type":36,"tag":363,"props":628,"children":629},{},[630],{"type":42,"value":631},"console.log(store.id);  \u002F\u002F mem_store_xxx\n",{"type":36,"tag":363,"props":633,"children":634},{"class":365,"line":490},[635],{"type":36,"tag":363,"props":636,"children":637},{},[638],{"type":42,"value":639},"\u002F\u002F Poll store.statusUrl until status is ACTIVE\n",{"type":36,"tag":45,"props":641,"children":642},{},[643],{"type":36,"tag":51,"props":644,"children":645},{},[646],{"type":42,"value":647},"Step 2 — Create a profile with identity resolution",{"type":36,"tag":45,"props":649,"children":650},{},[651],{"type":36,"tag":51,"props":652,"children":653},{},[654],{"type":42,"value":350},{"type":36,"tag":352,"props":656,"children":658},{"className":354,"code":657,"language":356,"meta":357,"style":357},"profile = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\",\n    auth=auth,\n    json={\"traits\": {\"contact\": {\"phone\": \"+15558675310\", \"name\": \"Alex\"}}}\n).json()\n\nprofile_id = profile[\"id\"]  # mem_profile_xxx\n",[659],{"type":36,"tag":96,"props":660,"children":661},{"__ignoreMap":357},[662,670,678,685,693,700,707],{"type":36,"tag":363,"props":663,"children":664},{"class":365,"line":366},[665],{"type":36,"tag":363,"props":666,"children":667},{},[668],{"type":42,"value":669},"profile = requests.post(\n",{"type":36,"tag":363,"props":671,"children":672},{"class":365,"line":375},[673],{"type":36,"tag":363,"props":674,"children":675},{},[676],{"type":42,"value":677},"    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\",\n",{"type":36,"tag":363,"props":679,"children":680},{"class":365,"line":384},[681],{"type":36,"tag":363,"props":682,"children":683},{},[684],{"type":42,"value":461},{"type":36,"tag":363,"props":686,"children":687},{"class":365,"line":394},[688],{"type":36,"tag":363,"props":689,"children":690},{},[691],{"type":42,"value":692},"    json={\"traits\": {\"contact\": {\"phone\": \"+15558675310\", \"name\": \"Alex\"}}}\n",{"type":36,"tag":363,"props":694,"children":695},{"class":365,"line":403},[696],{"type":36,"tag":363,"props":697,"children":698},{},[699],{"type":42,"value":479},{"type":36,"tag":363,"props":701,"children":702},{"class":365,"line":412},[703],{"type":36,"tag":363,"props":704,"children":705},{"emptyLinePlaceholder":388},[706],{"type":42,"value":391},{"type":36,"tag":363,"props":708,"children":709},{"class":365,"line":24},[710],{"type":36,"tag":363,"props":711,"children":712},{},[713],{"type":42,"value":714},"profile_id = profile[\"id\"]  # mem_profile_xxx\n",{"type":36,"tag":45,"props":716,"children":717},{},[718],{"type":36,"tag":51,"props":719,"children":720},{},[721],{"type":42,"value":513},{"type":36,"tag":352,"props":723,"children":725},{"className":516,"code":724,"language":518,"meta":357,"style":357},"const { data: profile } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles`,\n    { traits: { contact: { phone: \"+15558675310\", name: \"Alex\" } } },\n    { auth }\n);\n\nconst profileId = profile.id;  \u002F\u002F mem_profile_xxx\n",[726],{"type":36,"tag":96,"props":727,"children":728},{"__ignoreMap":357},[729,737,745,753,760,767,774],{"type":36,"tag":363,"props":730,"children":731},{"class":365,"line":366},[732],{"type":36,"tag":363,"props":733,"children":734},{},[735],{"type":42,"value":736},"const { data: profile } = await axios.post(\n",{"type":36,"tag":363,"props":738,"children":739},{"class":365,"line":375},[740],{"type":36,"tag":363,"props":741,"children":742},{},[743],{"type":42,"value":744},"    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles`,\n",{"type":36,"tag":363,"props":746,"children":747},{"class":365,"line":384},[748],{"type":36,"tag":363,"props":749,"children":750},{},[751],{"type":42,"value":752},"    { traits: { contact: { phone: \"+15558675310\", name: \"Alex\" } } },\n",{"type":36,"tag":363,"props":754,"children":755},{"class":365,"line":394},[756],{"type":36,"tag":363,"props":757,"children":758},{},[759],{"type":42,"value":608},{"type":36,"tag":363,"props":761,"children":762},{"class":365,"line":403},[763],{"type":36,"tag":363,"props":764,"children":765},{},[766],{"type":42,"value":616},{"type":36,"tag":363,"props":768,"children":769},{"class":365,"line":412},[770],{"type":36,"tag":363,"props":771,"children":772},{"emptyLinePlaceholder":388},[773],{"type":42,"value":391},{"type":36,"tag":363,"props":775,"children":776},{"class":365,"line":24},[777],{"type":36,"tag":363,"props":778,"children":779},{},[780],{"type":42,"value":781},"const profileId = profile.id;  \u002F\u002F mem_profile_xxx\n",{"type":36,"tag":45,"props":783,"children":784},{},[785],{"type":36,"tag":51,"props":786,"children":787},{},[788],{"type":42,"value":789},"Step 3 — Post observations (quick test)",{"type":36,"tag":45,"props":791,"children":792},{},[793,795,800],{"type":42,"value":794},"Post an observation directly to quickly test Recall in step 4. In production, the preferred path is connecting your Memory Store to a Conversation Orchestrator configuration — observations are then automatically extracted from conversations without manual POSTs. See ",{"type":36,"tag":96,"props":796,"children":798},{"className":797},[],[799],{"type":42,"value":325},{"type":42,"value":801},".",{"type":36,"tag":45,"props":803,"children":804},{},[805],{"type":36,"tag":51,"props":806,"children":807},{},[808],{"type":42,"value":350},{"type":36,"tag":352,"props":810,"children":812},{"className":354,"code":811,"language":356,"meta":357,"style":357},"requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FObservations\",\n    auth=auth,\n    json={\"observations\": [{\n        \"content\": \"Customer prefers email communication over phone calls\",\n        \"source\": \"support-agent\",\n        \"occurredAt\": \"2025-01-15T10:30:00Z\"\n    }]}\n)\n# 202 — poll statusUrl for completion\n",[813],{"type":36,"tag":96,"props":814,"children":815},{"__ignoreMap":357},[816,824,832,839,847,855,863,871,879,887],{"type":36,"tag":363,"props":817,"children":818},{"class":365,"line":366},[819],{"type":36,"tag":363,"props":820,"children":821},{},[822],{"type":42,"value":823},"requests.post(\n",{"type":36,"tag":363,"props":825,"children":826},{"class":365,"line":375},[827],{"type":36,"tag":363,"props":828,"children":829},{},[830],{"type":42,"value":831},"    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FObservations\",\n",{"type":36,"tag":363,"props":833,"children":834},{"class":365,"line":384},[835],{"type":36,"tag":363,"props":836,"children":837},{},[838],{"type":42,"value":461},{"type":36,"tag":363,"props":840,"children":841},{"class":365,"line":394},[842],{"type":36,"tag":363,"props":843,"children":844},{},[845],{"type":42,"value":846},"    json={\"observations\": [{\n",{"type":36,"tag":363,"props":848,"children":849},{"class":365,"line":403},[850],{"type":36,"tag":363,"props":851,"children":852},{},[853],{"type":42,"value":854},"        \"content\": \"Customer prefers email communication over phone calls\",\n",{"type":36,"tag":363,"props":856,"children":857},{"class":365,"line":412},[858],{"type":36,"tag":363,"props":859,"children":860},{},[861],{"type":42,"value":862},"        \"source\": \"support-agent\",\n",{"type":36,"tag":363,"props":864,"children":865},{"class":365,"line":24},[866],{"type":36,"tag":363,"props":867,"children":868},{},[869],{"type":42,"value":870},"        \"occurredAt\": \"2025-01-15T10:30:00Z\"\n",{"type":36,"tag":363,"props":872,"children":873},{"class":365,"line":429},[874],{"type":36,"tag":363,"props":875,"children":876},{},[877],{"type":42,"value":878},"    }]}\n",{"type":36,"tag":363,"props":880,"children":881},{"class":365,"line":437},[882],{"type":36,"tag":363,"props":883,"children":884},{},[885],{"type":42,"value":886},")\n",{"type":36,"tag":363,"props":888,"children":889},{"class":365,"line":446},[890],{"type":36,"tag":363,"props":891,"children":892},{},[893],{"type":42,"value":894},"# 202 — poll statusUrl for completion\n",{"type":36,"tag":45,"props":896,"children":897},{},[898],{"type":36,"tag":51,"props":899,"children":900},{},[901],{"type":42,"value":513},{"type":36,"tag":352,"props":903,"children":905},{"className":516,"code":904,"language":518,"meta":357,"style":357},"await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FObservations`,\n    { observations: [{\n        content: \"Customer prefers email communication over phone calls\",\n        source: \"support-agent\",\n        occurredAt: \"2025-01-15T10:30:00Z\",\n    }] },\n    { auth }\n);\n\u002F\u002F 202 — poll statusUrl for completion\n",[906],{"type":36,"tag":96,"props":907,"children":908},{"__ignoreMap":357},[909,917,925,933,941,949,957,965,972,979],{"type":36,"tag":363,"props":910,"children":911},{"class":365,"line":366},[912],{"type":36,"tag":363,"props":913,"children":914},{},[915],{"type":42,"value":916},"await axios.post(\n",{"type":36,"tag":363,"props":918,"children":919},{"class":365,"line":375},[920],{"type":36,"tag":363,"props":921,"children":922},{},[923],{"type":42,"value":924},"    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FObservations`,\n",{"type":36,"tag":363,"props":926,"children":927},{"class":365,"line":384},[928],{"type":36,"tag":363,"props":929,"children":930},{},[931],{"type":42,"value":932},"    { observations: [{\n",{"type":36,"tag":363,"props":934,"children":935},{"class":365,"line":394},[936],{"type":36,"tag":363,"props":937,"children":938},{},[939],{"type":42,"value":940},"        content: \"Customer prefers email communication over phone calls\",\n",{"type":36,"tag":363,"props":942,"children":943},{"class":365,"line":403},[944],{"type":36,"tag":363,"props":945,"children":946},{},[947],{"type":42,"value":948},"        source: \"support-agent\",\n",{"type":36,"tag":363,"props":950,"children":951},{"class":365,"line":412},[952],{"type":36,"tag":363,"props":953,"children":954},{},[955],{"type":42,"value":956},"        occurredAt: \"2025-01-15T10:30:00Z\",\n",{"type":36,"tag":363,"props":958,"children":959},{"class":365,"line":24},[960],{"type":36,"tag":363,"props":961,"children":962},{},[963],{"type":42,"value":964},"    }] },\n",{"type":36,"tag":363,"props":966,"children":967},{"class":365,"line":429},[968],{"type":36,"tag":363,"props":969,"children":970},{},[971],{"type":42,"value":608},{"type":36,"tag":363,"props":973,"children":974},{"class":365,"line":437},[975],{"type":36,"tag":363,"props":976,"children":977},{},[978],{"type":42,"value":616},{"type":36,"tag":363,"props":980,"children":981},{"class":365,"line":446},[982],{"type":36,"tag":363,"props":983,"children":984},{},[985],{"type":42,"value":986},"\u002F\u002F 202 — poll statusUrl for completion\n",{"type":36,"tag":45,"props":988,"children":989},{},[990],{"type":36,"tag":51,"props":991,"children":992},{},[993],{"type":42,"value":994},"Step 4 — Recall relevant context",{"type":36,"tag":45,"props":996,"children":997},{},[998],{"type":36,"tag":51,"props":999,"children":1000},{},[1001],{"type":42,"value":350},{"type":36,"tag":352,"props":1003,"children":1005},{"className":354,"code":1004,"language":356,"meta":357,"style":357},"recall = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FRecall\",\n    auth=auth,\n    json={\"query\": \"communication preferences\"}\n).json()\n\nfor obs in recall[\"observations\"]:\n    print(f\"[{obs['score']:.2f}] {obs['content']}\")\n",[1006],{"type":36,"tag":96,"props":1007,"children":1008},{"__ignoreMap":357},[1009,1017,1025,1032,1040,1047,1054,1062],{"type":36,"tag":363,"props":1010,"children":1011},{"class":365,"line":366},[1012],{"type":36,"tag":363,"props":1013,"children":1014},{},[1015],{"type":42,"value":1016},"recall = requests.post(\n",{"type":36,"tag":363,"props":1018,"children":1019},{"class":365,"line":375},[1020],{"type":36,"tag":363,"props":1021,"children":1022},{},[1023],{"type":42,"value":1024},"    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FRecall\",\n",{"type":36,"tag":363,"props":1026,"children":1027},{"class":365,"line":384},[1028],{"type":36,"tag":363,"props":1029,"children":1030},{},[1031],{"type":42,"value":461},{"type":36,"tag":363,"props":1033,"children":1034},{"class":365,"line":394},[1035],{"type":36,"tag":363,"props":1036,"children":1037},{},[1038],{"type":42,"value":1039},"    json={\"query\": \"communication preferences\"}\n",{"type":36,"tag":363,"props":1041,"children":1042},{"class":365,"line":403},[1043],{"type":36,"tag":363,"props":1044,"children":1045},{},[1046],{"type":42,"value":479},{"type":36,"tag":363,"props":1048,"children":1049},{"class":365,"line":412},[1050],{"type":36,"tag":363,"props":1051,"children":1052},{"emptyLinePlaceholder":388},[1053],{"type":42,"value":391},{"type":36,"tag":363,"props":1055,"children":1056},{"class":365,"line":24},[1057],{"type":36,"tag":363,"props":1058,"children":1059},{},[1060],{"type":42,"value":1061},"for obs in recall[\"observations\"]:\n",{"type":36,"tag":363,"props":1063,"children":1064},{"class":365,"line":429},[1065],{"type":36,"tag":363,"props":1066,"children":1067},{},[1068],{"type":42,"value":1069},"    print(f\"[{obs['score']:.2f}] {obs['content']}\")\n",{"type":36,"tag":45,"props":1071,"children":1072},{},[1073],{"type":36,"tag":51,"props":1074,"children":1075},{},[1076],{"type":42,"value":513},{"type":36,"tag":352,"props":1078,"children":1080},{"className":516,"code":1079,"language":518,"meta":357,"style":357},"const { data: recall } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FRecall`,\n    { query: \"communication preferences\" },\n    { auth }\n);\n\nfor (const obs of recall.observations) {\n    console.log(`[${obs.score.toFixed(2)}] ${obs.content}`);\n}\n",[1081],{"type":36,"tag":96,"props":1082,"children":1083},{"__ignoreMap":357},[1084,1092,1100,1108,1115,1122,1129,1137,1145],{"type":36,"tag":363,"props":1085,"children":1086},{"class":365,"line":366},[1087],{"type":36,"tag":363,"props":1088,"children":1089},{},[1090],{"type":42,"value":1091},"const { data: recall } = await axios.post(\n",{"type":36,"tag":363,"props":1093,"children":1094},{"class":365,"line":375},[1095],{"type":36,"tag":363,"props":1096,"children":1097},{},[1098],{"type":42,"value":1099},"    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FRecall`,\n",{"type":36,"tag":363,"props":1101,"children":1102},{"class":365,"line":384},[1103],{"type":36,"tag":363,"props":1104,"children":1105},{},[1106],{"type":42,"value":1107},"    { query: \"communication preferences\" },\n",{"type":36,"tag":363,"props":1109,"children":1110},{"class":365,"line":394},[1111],{"type":36,"tag":363,"props":1112,"children":1113},{},[1114],{"type":42,"value":608},{"type":36,"tag":363,"props":1116,"children":1117},{"class":365,"line":403},[1118],{"type":36,"tag":363,"props":1119,"children":1120},{},[1121],{"type":42,"value":616},{"type":36,"tag":363,"props":1123,"children":1124},{"class":365,"line":412},[1125],{"type":36,"tag":363,"props":1126,"children":1127},{"emptyLinePlaceholder":388},[1128],{"type":42,"value":391},{"type":36,"tag":363,"props":1130,"children":1131},{"class":365,"line":24},[1132],{"type":36,"tag":363,"props":1133,"children":1134},{},[1135],{"type":42,"value":1136},"for (const obs of recall.observations) {\n",{"type":36,"tag":363,"props":1138,"children":1139},{"class":365,"line":429},[1140],{"type":36,"tag":363,"props":1141,"children":1142},{},[1143],{"type":42,"value":1144},"    console.log(`[${obs.score.toFixed(2)}] ${obs.content}`);\n",{"type":36,"tag":363,"props":1146,"children":1147},{"class":365,"line":437},[1148],{"type":36,"tag":363,"props":1149,"children":1150},{},[1151],{"type":42,"value":1152},"}\n",{"type":36,"tag":237,"props":1154,"children":1155},{},[],{"type":36,"tag":37,"props":1157,"children":1159},{"id":1158},"key-patterns",[1160],{"type":42,"value":1161},"Key Patterns",{"type":36,"tag":1163,"props":1164,"children":1166},"h3",{"id":1165},"recall-modes",[1167],{"type":42,"value":1168},"Recall Modes",{"type":36,"tag":1170,"props":1171,"children":1172},"table",{},[1173,1197],{"type":36,"tag":1174,"props":1175,"children":1176},"thead",{},[1177],{"type":36,"tag":1178,"props":1179,"children":1180},"tr",{},[1181,1187,1192],{"type":36,"tag":1182,"props":1183,"children":1184},"th",{},[1185],{"type":42,"value":1186},"Mode",{"type":36,"tag":1182,"props":1188,"children":1189},{},[1190],{"type":42,"value":1191},"Request",{"type":36,"tag":1182,"props":1193,"children":1194},{},[1195],{"type":42,"value":1196},"When to use",{"type":36,"tag":1198,"props":1199,"children":1200},"tbody",{},[1201,1224,1246],{"type":36,"tag":1178,"props":1202,"children":1203},{},[1204,1210,1219],{"type":36,"tag":1205,"props":1206,"children":1207},"td",{},[1208],{"type":42,"value":1209},"Explicit query",{"type":36,"tag":1205,"props":1211,"children":1212},{},[1213],{"type":36,"tag":96,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":42,"value":1218},"{\"query\": \"shipping preferences\"}",{"type":36,"tag":1205,"props":1220,"children":1221},{},[1222],{"type":42,"value":1223},"You control relevance",{"type":36,"tag":1178,"props":1225,"children":1226},{},[1227,1232,1241],{"type":36,"tag":1205,"props":1228,"children":1229},{},[1230],{"type":42,"value":1231},"Conversation context",{"type":36,"tag":1205,"props":1233,"children":1234},{},[1235],{"type":36,"tag":96,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":42,"value":1240},"{\"conversationId\": \"conv_conversation_xxx\"}",{"type":36,"tag":1205,"props":1242,"children":1243},{},[1244],{"type":42,"value":1245},"Active Orchestrator conversation — auto-generates query from last 10 messages",{"type":36,"tag":1178,"props":1247,"children":1248},{},[1249,1254,1265],{"type":36,"tag":1205,"props":1250,"children":1251},{},[1252],{"type":42,"value":1253},"Most recent",{"type":36,"tag":1205,"props":1255,"children":1256},{},[1257,1263],{"type":36,"tag":96,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":42,"value":1262},"{}",{"type":42,"value":1264}," (omit both)",{"type":36,"tag":1205,"props":1266,"children":1267},{},[1268],{"type":42,"value":1269},"Chronological order, no relevance ranking",{"type":36,"tag":45,"props":1271,"children":1272},{},[1273,1275,1281,1283,1289,1291,1297,1299,1305,1307,1313,1315,1321],{"type":42,"value":1274},"Additional Recall parameters: ",{"type":36,"tag":96,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":42,"value":1280},"observationsLimit",{"type":42,"value":1282}," (default 20, 0–100), ",{"type":36,"tag":96,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":42,"value":1288},"summariesLimit",{"type":42,"value":1290}," (default 5), ",{"type":36,"tag":96,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":42,"value":1296},"communicationsLimit",{"type":42,"value":1298}," (default 0, requires conversationId), ",{"type":36,"tag":96,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":42,"value":1304},"relevanceThreshold",{"type":42,"value":1306}," (0–1), ",{"type":36,"tag":96,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":42,"value":1312},"beginDate",{"type":42,"value":1314},"\u002F",{"type":36,"tag":96,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":42,"value":1320},"endDate",{"type":42,"value":801},{"type":36,"tag":1163,"props":1323,"children":1325},{"id":1324},"profile-resolution",[1326],{"type":42,"value":1327},"Profile Resolution",{"type":36,"tag":1170,"props":1329,"children":1330},{},[1331,1352],{"type":36,"tag":1174,"props":1332,"children":1333},{},[1334],{"type":36,"tag":1178,"props":1335,"children":1336},{},[1337,1342,1347],{"type":36,"tag":1182,"props":1338,"children":1339},{},[1340],{"type":42,"value":1341},"I have...",{"type":36,"tag":1182,"props":1343,"children":1344},{},[1345],{"type":42,"value":1346},"Use",{"type":36,"tag":1182,"props":1348,"children":1349},{},[1350],{"type":42,"value":1351},"Behavior",{"type":36,"tag":1198,"props":1353,"children":1354},{},[1355,1377,1399,1421],{"type":36,"tag":1178,"props":1356,"children":1357},{},[1358,1363,1372],{"type":36,"tag":1205,"props":1359,"children":1360},{},[1361],{"type":42,"value":1362},"Profile ID",{"type":36,"tag":1205,"props":1364,"children":1365},{},[1366],{"type":36,"tag":96,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":42,"value":1371},"PATCH \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002F{profileId}",{"type":36,"tag":1205,"props":1373,"children":1374},{},[1375],{"type":42,"value":1376},"Direct update",{"type":36,"tag":1178,"props":1378,"children":1379},{},[1380,1385,1394],{"type":36,"tag":1205,"props":1381,"children":1382},{},[1383],{"type":42,"value":1384},"An identifier (phone, email)",{"type":36,"tag":1205,"props":1386,"children":1387},{},[1388],{"type":36,"tag":96,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":42,"value":1393},"POST \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles",{"type":36,"tag":1205,"props":1395,"children":1396},{},[1397],{"type":42,"value":1398},"Identity resolution finds or creates",{"type":36,"tag":1178,"props":1400,"children":1401},{},[1402,1407,1416],{"type":36,"tag":1205,"props":1403,"children":1404},{},[1405],{"type":42,"value":1406},"Bulk contact data",{"type":36,"tag":1205,"props":1408,"children":1409},{},[1410],{"type":36,"tag":96,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":42,"value":1415},"PUT \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002FBulk",{"type":36,"tag":1205,"props":1417,"children":1418},{},[1419],{"type":42,"value":1420},"Up to 1000, identity-resolved",{"type":36,"tag":1178,"props":1422,"children":1423},{},[1424,1429,1438],{"type":36,"tag":1205,"props":1425,"children":1426},{},[1427],{"type":42,"value":1428},"CSV file",{"type":36,"tag":1205,"props":1430,"children":1431},{},[1432],{"type":36,"tag":96,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":42,"value":1437},"POST \u002Fv1\u002FStores\u002F{storeId}\u002FProfiles\u002FImports",{"type":36,"tag":1205,"props":1439,"children":1440},{},[1441],{"type":42,"value":1442},"Presigned URL upload",{"type":36,"tag":45,"props":1444,"children":1445},{},[1446],{"type":42,"value":1447},"Check for 308 redirects on profile endpoints — indicates a merged profile.",{"type":36,"tag":1163,"props":1449,"children":1451},{"id":1450},"trait-groups",[1452],{"type":42,"value":1453},"Trait Groups",{"type":36,"tag":45,"props":1455,"children":1456},{},[1457],{"type":42,"value":1458},"Every trait must belong to a trait group. You must create the group (or add the trait to an existing group) before writing trait values to a profile.",{"type":36,"tag":45,"props":1460,"children":1461},{},[1462,1464,1470,1472,1478,1480,1486],{"type":42,"value":1463},"Each trait has a ",{"type":36,"tag":96,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":42,"value":1469},"dataType",{"type":42,"value":1471}," (STRING, NUMBER, BOOLEAN, ARRAY). Set ",{"type":36,"tag":96,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":42,"value":1477},"idTypePromotion",{"type":42,"value":1479}," on a trait (e.g., ",{"type":36,"tag":96,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":42,"value":1485},"\"phone\"",{"type":42,"value":1487},") to make it an identifier for Lookup and identity resolution.",{"type":36,"tag":45,"props":1489,"children":1490},{},[1491],{"type":36,"tag":51,"props":1492,"children":1493},{},[1494],{"type":42,"value":1495},"Add a new trait to an existing group:",{"type":36,"tag":45,"props":1497,"children":1498},{},[1499,1501,1507],{"type":42,"value":1500},"Use ",{"type":36,"tag":96,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":42,"value":1506},"PATCH \u002Fv1\u002FControlPlane\u002FStores\u002F{storeId}\u002FTraitGroups\u002F{traitGroupName}",{"type":42,"value":1508}," — pass the new trait definition in the request body. Only the new traits need to be included; existing traits are unchanged.",{"type":36,"tag":45,"props":1510,"children":1511},{},[1512],{"type":36,"tag":51,"props":1513,"children":1514},{},[1515],{"type":42,"value":350},{"type":36,"tag":352,"props":1517,"children":1519},{"className":354,"code":1518,"language":356,"meta":357,"style":357},"requests.patch(\n    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\u002F{store['id']}\u002FTraitGroups\u002Fcontact\",\n    auth=auth,\n    json={\"traits\": {\n        \"preferred_channel\": {\"dataType\": \"STRING\", \"description\": \"Preferred contact method\"}\n    }}\n)\n# 202 — adds \"preferred_channel\" to the existing \"contact\" group\n",[1520],{"type":36,"tag":96,"props":1521,"children":1522},{"__ignoreMap":357},[1523,1531,1539,1546,1554,1562,1570,1577],{"type":36,"tag":363,"props":1524,"children":1525},{"class":365,"line":366},[1526],{"type":36,"tag":363,"props":1527,"children":1528},{},[1529],{"type":42,"value":1530},"requests.patch(\n",{"type":36,"tag":363,"props":1532,"children":1533},{"class":365,"line":375},[1534],{"type":36,"tag":363,"props":1535,"children":1536},{},[1537],{"type":42,"value":1538},"    f\"{base_url}\u002Fv1\u002FControlPlane\u002FStores\u002F{store['id']}\u002FTraitGroups\u002Fcontact\",\n",{"type":36,"tag":363,"props":1540,"children":1541},{"class":365,"line":384},[1542],{"type":36,"tag":363,"props":1543,"children":1544},{},[1545],{"type":42,"value":461},{"type":36,"tag":363,"props":1547,"children":1548},{"class":365,"line":394},[1549],{"type":36,"tag":363,"props":1550,"children":1551},{},[1552],{"type":42,"value":1553},"    json={\"traits\": {\n",{"type":36,"tag":363,"props":1555,"children":1556},{"class":365,"line":403},[1557],{"type":36,"tag":363,"props":1558,"children":1559},{},[1560],{"type":42,"value":1561},"        \"preferred_channel\": {\"dataType\": \"STRING\", \"description\": \"Preferred contact method\"}\n",{"type":36,"tag":363,"props":1563,"children":1564},{"class":365,"line":412},[1565],{"type":36,"tag":363,"props":1566,"children":1567},{},[1568],{"type":42,"value":1569},"    }}\n",{"type":36,"tag":363,"props":1571,"children":1572},{"class":365,"line":24},[1573],{"type":36,"tag":363,"props":1574,"children":1575},{},[1576],{"type":42,"value":886},{"type":36,"tag":363,"props":1578,"children":1579},{"class":365,"line":429},[1580],{"type":36,"tag":363,"props":1581,"children":1582},{},[1583],{"type":42,"value":1584},"# 202 — adds \"preferred_channel\" to the existing \"contact\" group\n",{"type":36,"tag":45,"props":1586,"children":1587},{},[1588],{"type":36,"tag":51,"props":1589,"children":1590},{},[1591],{"type":42,"value":513},{"type":36,"tag":352,"props":1593,"children":1595},{"className":516,"code":1594,"language":518,"meta":357,"style":357},"await axios.patch(\n    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores\u002F${store.id}\u002FTraitGroups\u002Fcontact`,\n    { traits: {\n        preferred_channel: { dataType: \"STRING\", description: \"Preferred contact method\" },\n    } },\n    { auth }\n);\n\u002F\u002F 202 — adds \"preferred_channel\" to the existing \"contact\" group\n",[1596],{"type":36,"tag":96,"props":1597,"children":1598},{"__ignoreMap":357},[1599,1607,1615,1623,1631,1639,1646,1653],{"type":36,"tag":363,"props":1600,"children":1601},{"class":365,"line":366},[1602],{"type":36,"tag":363,"props":1603,"children":1604},{},[1605],{"type":42,"value":1606},"await axios.patch(\n",{"type":36,"tag":363,"props":1608,"children":1609},{"class":365,"line":375},[1610],{"type":36,"tag":363,"props":1611,"children":1612},{},[1613],{"type":42,"value":1614},"    `${baseUrl}\u002Fv1\u002FControlPlane\u002FStores\u002F${store.id}\u002FTraitGroups\u002Fcontact`,\n",{"type":36,"tag":363,"props":1616,"children":1617},{"class":365,"line":384},[1618],{"type":36,"tag":363,"props":1619,"children":1620},{},[1621],{"type":42,"value":1622},"    { traits: {\n",{"type":36,"tag":363,"props":1624,"children":1625},{"class":365,"line":394},[1626],{"type":36,"tag":363,"props":1627,"children":1628},{},[1629],{"type":42,"value":1630},"        preferred_channel: { dataType: \"STRING\", description: \"Preferred contact method\" },\n",{"type":36,"tag":363,"props":1632,"children":1633},{"class":365,"line":403},[1634],{"type":36,"tag":363,"props":1635,"children":1636},{},[1637],{"type":42,"value":1638},"    } },\n",{"type":36,"tag":363,"props":1640,"children":1641},{"class":365,"line":412},[1642],{"type":36,"tag":363,"props":1643,"children":1644},{},[1645],{"type":42,"value":608},{"type":36,"tag":363,"props":1647,"children":1648},{"class":365,"line":24},[1649],{"type":36,"tag":363,"props":1650,"children":1651},{},[1652],{"type":42,"value":616},{"type":36,"tag":363,"props":1654,"children":1655},{"class":365,"line":429},[1656],{"type":36,"tag":363,"props":1657,"children":1658},{},[1659],{"type":42,"value":1660},"\u002F\u002F 202 — adds \"preferred_channel\" to the existing \"contact\" group\n",{"type":36,"tag":45,"props":1662,"children":1663},{},[1664,1666,1672],{"type":42,"value":1665},"To remove a trait from a group, PATCH with ",{"type":36,"tag":96,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":42,"value":1671},"\"dataType\": \"\"",{"type":42,"value":1673}," for that trait name.",{"type":36,"tag":1163,"props":1675,"children":1677},{"id":1676},"automatic-extraction-orchestrator-integration",[1678],{"type":42,"value":1679},"Automatic Extraction (Orchestrator Integration)",{"type":36,"tag":59,"props":1681,"children":1682},{},[1683,1688,1693],{"type":36,"tag":63,"props":1684,"children":1685},{},[1686],{"type":42,"value":1687},"Create a Memory Store",{"type":36,"tag":63,"props":1689,"children":1690},{},[1691],{"type":42,"value":1692},"Create a Conversation Orchestrator Configuration with capture rules",{"type":36,"tag":63,"props":1694,"children":1695},{},[1696],{"type":42,"value":1697},"Link the store to the config",{"type":36,"tag":45,"props":1699,"children":1700},{},[1701,1703,1708],{"type":42,"value":1702},"Once linked: profiles are auto-created per caller, and extraction is tied to the conversation lifecycle configured in Orchestrator. By default, observations are extracted when a conversation goes inactive or ends. Conversation summaries are generated when a conversation ends. These lifecycle transitions are configurable in your Orchestrator configuration — how you define conversation status timeouts determines when memory extraction runs. Conflicting information is automatically reconciled. See ",{"type":36,"tag":96,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":42,"value":325},{"type":42,"value":801},{"type":36,"tag":1163,"props":1710,"children":1712},{"id":1711},"lookup-by-identifier",[1713],{"type":42,"value":1714},"Lookup by Identifier",{"type":36,"tag":45,"props":1716,"children":1717},{},[1718],{"type":36,"tag":51,"props":1719,"children":1720},{},[1721],{"type":42,"value":350},{"type":36,"tag":352,"props":1723,"children":1725},{"className":354,"code":1724,"language":356,"meta":357,"style":357},"result = requests.post(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002FLookup\",\n    auth=auth,\n    json={\"idType\": \"phone\", \"value\": \"+15558675310\"}\n).json()\n\nprofile_id = result[\"profiles\"][0][\"id\"]\n",[1726],{"type":36,"tag":96,"props":1727,"children":1728},{"__ignoreMap":357},[1729,1737,1745,1752,1760,1767,1774],{"type":36,"tag":363,"props":1730,"children":1731},{"class":365,"line":366},[1732],{"type":36,"tag":363,"props":1733,"children":1734},{},[1735],{"type":42,"value":1736},"result = requests.post(\n",{"type":36,"tag":363,"props":1738,"children":1739},{"class":365,"line":375},[1740],{"type":36,"tag":363,"props":1741,"children":1742},{},[1743],{"type":42,"value":1744},"    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002FLookup\",\n",{"type":36,"tag":363,"props":1746,"children":1747},{"class":365,"line":384},[1748],{"type":36,"tag":363,"props":1749,"children":1750},{},[1751],{"type":42,"value":461},{"type":36,"tag":363,"props":1753,"children":1754},{"class":365,"line":394},[1755],{"type":36,"tag":363,"props":1756,"children":1757},{},[1758],{"type":42,"value":1759},"    json={\"idType\": \"phone\", \"value\": \"+15558675310\"}\n",{"type":36,"tag":363,"props":1761,"children":1762},{"class":365,"line":403},[1763],{"type":36,"tag":363,"props":1764,"children":1765},{},[1766],{"type":42,"value":479},{"type":36,"tag":363,"props":1768,"children":1769},{"class":365,"line":412},[1770],{"type":36,"tag":363,"props":1771,"children":1772},{"emptyLinePlaceholder":388},[1773],{"type":42,"value":391},{"type":36,"tag":363,"props":1775,"children":1776},{"class":365,"line":24},[1777],{"type":36,"tag":363,"props":1778,"children":1779},{},[1780],{"type":42,"value":1781},"profile_id = result[\"profiles\"][0][\"id\"]\n",{"type":36,"tag":45,"props":1783,"children":1784},{},[1785],{"type":36,"tag":51,"props":1786,"children":1787},{},[1788],{"type":42,"value":513},{"type":36,"tag":352,"props":1790,"children":1792},{"className":516,"code":1791,"language":518,"meta":357,"style":357},"const { data: result } = await axios.post(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002FLookup`,\n    { idType: \"phone\", value: \"+15558675310\" },\n    { auth }\n);\n\nconst profileId = result.profiles[0].id;\n",[1793],{"type":36,"tag":96,"props":1794,"children":1795},{"__ignoreMap":357},[1796,1804,1812,1820,1827,1834,1841],{"type":36,"tag":363,"props":1797,"children":1798},{"class":365,"line":366},[1799],{"type":36,"tag":363,"props":1800,"children":1801},{},[1802],{"type":42,"value":1803},"const { data: result } = await axios.post(\n",{"type":36,"tag":363,"props":1805,"children":1806},{"class":365,"line":375},[1807],{"type":36,"tag":363,"props":1808,"children":1809},{},[1810],{"type":42,"value":1811},"    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002FLookup`,\n",{"type":36,"tag":363,"props":1813,"children":1814},{"class":365,"line":384},[1815],{"type":36,"tag":363,"props":1816,"children":1817},{},[1818],{"type":42,"value":1819},"    { idType: \"phone\", value: \"+15558675310\" },\n",{"type":36,"tag":363,"props":1821,"children":1822},{"class":365,"line":394},[1823],{"type":36,"tag":363,"props":1824,"children":1825},{},[1826],{"type":42,"value":608},{"type":36,"tag":363,"props":1828,"children":1829},{"class":365,"line":403},[1830],{"type":36,"tag":363,"props":1831,"children":1832},{},[1833],{"type":42,"value":616},{"type":36,"tag":363,"props":1835,"children":1836},{"class":365,"line":412},[1837],{"type":36,"tag":363,"props":1838,"children":1839},{"emptyLinePlaceholder":388},[1840],{"type":42,"value":391},{"type":36,"tag":363,"props":1842,"children":1843},{"class":365,"line":24},[1844],{"type":36,"tag":363,"props":1845,"children":1846},{},[1847],{"type":42,"value":1848},"const profileId = result.profiles[0].id;\n",{"type":36,"tag":1163,"props":1850,"children":1852},{"id":1851},"voice-agent-latency-optimization",[1853],{"type":42,"value":1854},"Voice Agent Latency Optimization",{"type":36,"tag":45,"props":1856,"children":1857},{},[1858],{"type":42,"value":1859},"For voice agents where latency matters, skip semantic search and fetch observations directly:",{"type":36,"tag":45,"props":1861,"children":1862},{},[1863],{"type":36,"tag":51,"props":1864,"children":1865},{},[1866],{"type":42,"value":350},{"type":36,"tag":352,"props":1868,"children":1870},{"className":354,"code":1869,"language":356,"meta":357,"style":357},"observations = requests.get(\n    f\"{base_url}\u002Fv1\u002FStores\u002F{store['id']}\u002FProfiles\u002F{profile_id}\u002FObservations\",\n    auth=auth,\n    params={\"source\": \"support-agent\", \"createdAfter\": \"2025-01-01T00:00:00Z\"}\n).json()\n",[1871],{"type":36,"tag":96,"props":1872,"children":1873},{"__ignoreMap":357},[1874,1882,1889,1896,1904],{"type":36,"tag":363,"props":1875,"children":1876},{"class":365,"line":366},[1877],{"type":36,"tag":363,"props":1878,"children":1879},{},[1880],{"type":42,"value":1881},"observations = requests.get(\n",{"type":36,"tag":363,"props":1883,"children":1884},{"class":365,"line":375},[1885],{"type":36,"tag":363,"props":1886,"children":1887},{},[1888],{"type":42,"value":831},{"type":36,"tag":363,"props":1890,"children":1891},{"class":365,"line":384},[1892],{"type":36,"tag":363,"props":1893,"children":1894},{},[1895],{"type":42,"value":461},{"type":36,"tag":363,"props":1897,"children":1898},{"class":365,"line":394},[1899],{"type":36,"tag":363,"props":1900,"children":1901},{},[1902],{"type":42,"value":1903},"    params={\"source\": \"support-agent\", \"createdAfter\": \"2025-01-01T00:00:00Z\"}\n",{"type":36,"tag":363,"props":1905,"children":1906},{"class":365,"line":403},[1907],{"type":36,"tag":363,"props":1908,"children":1909},{},[1910],{"type":42,"value":479},{"type":36,"tag":45,"props":1912,"children":1913},{},[1914],{"type":36,"tag":51,"props":1915,"children":1916},{},[1917],{"type":42,"value":513},{"type":36,"tag":352,"props":1919,"children":1921},{"className":516,"code":1920,"language":518,"meta":357,"style":357},"const { data: observations } = await axios.get(\n    `${baseUrl}\u002Fv1\u002FStores\u002F${store.id}\u002FProfiles\u002F${profileId}\u002FObservations`,\n    { auth, params: { source: \"support-agent\", createdAfter: \"2025-01-01T00:00:00Z\" } }\n);\n",[1922],{"type":36,"tag":96,"props":1923,"children":1924},{"__ignoreMap":357},[1925,1933,1940,1948],{"type":36,"tag":363,"props":1926,"children":1927},{"class":365,"line":366},[1928],{"type":36,"tag":363,"props":1929,"children":1930},{},[1931],{"type":42,"value":1932},"const { data: observations } = await axios.get(\n",{"type":36,"tag":363,"props":1934,"children":1935},{"class":365,"line":375},[1936],{"type":36,"tag":363,"props":1937,"children":1938},{},[1939],{"type":42,"value":924},{"type":36,"tag":363,"props":1941,"children":1942},{"class":365,"line":384},[1943],{"type":36,"tag":363,"props":1944,"children":1945},{},[1946],{"type":42,"value":1947},"    { auth, params: { source: \"support-agent\", createdAfter: \"2025-01-01T00:00:00Z\" } }\n",{"type":36,"tag":363,"props":1949,"children":1950},{"class":365,"line":394},[1951],{"type":36,"tag":363,"props":1952,"children":1953},{},[1954],{"type":42,"value":616},{"type":36,"tag":1163,"props":1956,"children":1958},{"id":1957},"async-polling-pattern",[1959],{"type":42,"value":1960},"Async Polling Pattern",{"type":36,"tag":45,"props":1962,"children":1963},{},[1964,1966,1971,1973,1979,1981,1987,1989,1995],{"type":42,"value":1965},"All 202 responses include a ",{"type":36,"tag":96,"props":1967,"children":1969},{"className":1968},[],[1970],{"type":42,"value":158},{"type":42,"value":1972},". Poll until ",{"type":36,"tag":96,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":42,"value":1978},"status",{"type":42,"value":1980}," is ",{"type":36,"tag":96,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":42,"value":1986},"COMPLETED",{"type":42,"value":1988}," or ",{"type":36,"tag":96,"props":1990,"children":1992},{"className":1991},[],[1993],{"type":42,"value":1994},"FAILED",{"type":42,"value":1996},":",{"type":36,"tag":45,"props":1998,"children":1999},{},[2000],{"type":36,"tag":51,"props":2001,"children":2002},{},[2003],{"type":42,"value":350},{"type":36,"tag":352,"props":2005,"children":2007},{"className":354,"code":2006,"language":356,"meta":357,"style":357},"import time\n\nstatus_url = store[\"statusUrl\"]\nwhile True:\n    op = requests.get(status_url, auth=auth).json()\n    if op[\"status\"] in (\"COMPLETED\", \"FAILED\", \"CANCELLED\"):\n        break\n    time.sleep(2)\n",[2008],{"type":36,"tag":96,"props":2009,"children":2010},{"__ignoreMap":357},[2011,2019,2026,2034,2042,2050,2058,2066],{"type":36,"tag":363,"props":2012,"children":2013},{"class":365,"line":366},[2014],{"type":36,"tag":363,"props":2015,"children":2016},{},[2017],{"type":42,"value":2018},"import time\n",{"type":36,"tag":363,"props":2020,"children":2021},{"class":365,"line":375},[2022],{"type":36,"tag":363,"props":2023,"children":2024},{"emptyLinePlaceholder":388},[2025],{"type":42,"value":391},{"type":36,"tag":363,"props":2027,"children":2028},{"class":365,"line":384},[2029],{"type":36,"tag":363,"props":2030,"children":2031},{},[2032],{"type":42,"value":2033},"status_url = store[\"statusUrl\"]\n",{"type":36,"tag":363,"props":2035,"children":2036},{"class":365,"line":394},[2037],{"type":36,"tag":363,"props":2038,"children":2039},{},[2040],{"type":42,"value":2041},"while True:\n",{"type":36,"tag":363,"props":2043,"children":2044},{"class":365,"line":403},[2045],{"type":36,"tag":363,"props":2046,"children":2047},{},[2048],{"type":42,"value":2049},"    op = requests.get(status_url, auth=auth).json()\n",{"type":36,"tag":363,"props":2051,"children":2052},{"class":365,"line":412},[2053],{"type":36,"tag":363,"props":2054,"children":2055},{},[2056],{"type":42,"value":2057},"    if op[\"status\"] in (\"COMPLETED\", \"FAILED\", \"CANCELLED\"):\n",{"type":36,"tag":363,"props":2059,"children":2060},{"class":365,"line":24},[2061],{"type":36,"tag":363,"props":2062,"children":2063},{},[2064],{"type":42,"value":2065},"        break\n",{"type":36,"tag":363,"props":2067,"children":2068},{"class":365,"line":429},[2069],{"type":36,"tag":363,"props":2070,"children":2071},{},[2072],{"type":42,"value":2073},"    time.sleep(2)\n",{"type":36,"tag":45,"props":2075,"children":2076},{},[2077],{"type":36,"tag":51,"props":2078,"children":2079},{},[2080],{"type":42,"value":513},{"type":36,"tag":352,"props":2082,"children":2084},{"className":516,"code":2083,"language":518,"meta":357,"style":357},"let op;\ndo {\n    await new Promise(r => setTimeout(r, 2000));\n    op = (await axios.get(store.statusUrl, { auth })).data;\n} while (![\"COMPLETED\", \"FAILED\", \"CANCELLED\"].includes(op.status));\n",[2085],{"type":36,"tag":96,"props":2086,"children":2087},{"__ignoreMap":357},[2088,2096,2104,2112,2120],{"type":36,"tag":363,"props":2089,"children":2090},{"class":365,"line":366},[2091],{"type":36,"tag":363,"props":2092,"children":2093},{},[2094],{"type":42,"value":2095},"let op;\n",{"type":36,"tag":363,"props":2097,"children":2098},{"class":365,"line":375},[2099],{"type":36,"tag":363,"props":2100,"children":2101},{},[2102],{"type":42,"value":2103},"do {\n",{"type":36,"tag":363,"props":2105,"children":2106},{"class":365,"line":384},[2107],{"type":36,"tag":363,"props":2108,"children":2109},{},[2110],{"type":42,"value":2111},"    await new Promise(r => setTimeout(r, 2000));\n",{"type":36,"tag":363,"props":2113,"children":2114},{"class":365,"line":394},[2115],{"type":36,"tag":363,"props":2116,"children":2117},{},[2118],{"type":42,"value":2119},"    op = (await axios.get(store.statusUrl, { auth })).data;\n",{"type":36,"tag":363,"props":2121,"children":2122},{"class":365,"line":403},[2123],{"type":36,"tag":363,"props":2124,"children":2125},{},[2126],{"type":42,"value":2127},"} while (![\"COMPLETED\", \"FAILED\", \"CANCELLED\"].includes(op.status));\n",{"type":36,"tag":237,"props":2129,"children":2130},{},[],{"type":36,"tag":37,"props":2132,"children":2134},{"id":2133},"cannot",[2135],{"type":42,"value":2136},"CANNOT",{"type":36,"tag":145,"props":2138,"children":2139},{},[2140,2145,2150,2155,2160,2165,2170,2175,2180,2185],{"type":36,"tag":63,"props":2141,"children":2142},{},[2143],{"type":42,"value":2144},"Cannot exceed 15 Memory Stores per account — use sub-accounts beyond this",{"type":36,"tag":63,"props":2146,"children":2147},{},[2148],{"type":42,"value":2149},"Cannot batch more than 10 observations per request",{"type":36,"tag":63,"props":2151,"children":2152},{},[2153],{"type":42,"value":2154},"Cannot exceed 4096 characters per observation",{"type":36,"tag":63,"props":2156,"children":2157},{},[2158],{"type":42,"value":2159},"Cannot write traits to a group that doesn't exist — create the trait group first",{"type":36,"tag":63,"props":2161,"children":2162},{},[2163],{"type":42,"value":2164},"Cannot recover deleted profiles or observations — deletion is irreversible",{"type":36,"tag":63,"props":2166,"children":2167},{},[2168],{"type":42,"value":2169},"Cannot read data immediately after write — indexing is async",{"type":36,"tag":63,"props":2171,"children":2172},{},[2173],{"type":42,"value":2174},"Cannot auto-extract observations without a linked Orchestrator config",{"type":36,"tag":63,"props":2176,"children":2177},{},[2178],{"type":42,"value":2179},"Cannot exceed 1000 profiles per bulk upsert",{"type":36,"tag":63,"props":2181,"children":2182},{},[2183],{"type":42,"value":2184},"Cannot include auth headers when uploading to presigned import URLs — they're pre-signed",{"type":36,"tag":63,"props":2186,"children":2187},{},[2188,2190],{"type":42,"value":2189},"Cannot use spaces or underscores in store displayName — pattern is ",{"type":36,"tag":96,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":42,"value":2195},"^[a-zA-Z0-9-]+$",{"type":36,"tag":237,"props":2197,"children":2198},{},[],{"type":36,"tag":37,"props":2200,"children":2202},{"id":2201},"next-steps",[2203],{"type":42,"value":2204},"Next Steps",{"type":36,"tag":145,"props":2206,"children":2207},{},[2208,2222,2237,2252,2267,2282],{"type":36,"tag":63,"props":2209,"children":2210},{},[2211,2216,2217],{"type":36,"tag":51,"props":2212,"children":2213},{},[2214],{"type":42,"value":2215},"Automatic conversation capture:",{"type":42,"value":113},{"type":36,"tag":96,"props":2218,"children":2220},{"className":2219},[],[2221],{"type":42,"value":325},{"type":36,"tag":63,"props":2223,"children":2224},{},[2225,2230,2231],{"type":36,"tag":51,"props":2226,"children":2227},{},[2228],{"type":42,"value":2229},"Background transcript intelligence (script adherence, NBR, scoring):",{"type":42,"value":113},{"type":36,"tag":96,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":42,"value":2236},"twilio-conversation-intelligence",{"type":36,"tag":63,"props":2238,"children":2239},{},[2240,2245,2246],{"type":36,"tag":51,"props":2241,"children":2242},{},[2243],{"type":42,"value":2244},"Enterprise knowledge retrieval (RAG):",{"type":42,"value":113},{"type":36,"tag":96,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":42,"value":2251},"twilio-enterprise-knowledge",{"type":36,"tag":63,"props":2253,"children":2254},{},[2255,2260,2261],{"type":36,"tag":51,"props":2256,"children":2257},{},[2258],{"type":42,"value":2259},"Voice agent with ConversationRelay:",{"type":42,"value":113},{"type":36,"tag":96,"props":2262,"children":2264},{"className":2263},[],[2265],{"type":42,"value":2266},"twilio-voice-conversation-relay",{"type":36,"tag":63,"props":2268,"children":2269},{},[2270,2275,2276],{"type":36,"tag":51,"props":2271,"children":2272},{},[2273],{"type":42,"value":2274},"TAC SDK middleware:",{"type":42,"value":113},{"type":36,"tag":96,"props":2277,"children":2279},{"className":2278},[],[2280],{"type":42,"value":2281},"twilio-agent-connect",{"type":36,"tag":63,"props":2283,"children":2284},{},[2285,2290,2291],{"type":36,"tag":51,"props":2286,"children":2287},{},[2288],{"type":42,"value":2289},"Debug issues:",{"type":42,"value":113},{"type":36,"tag":96,"props":2292,"children":2294},{"className":2293},[],[2295],{"type":42,"value":2296},"twilio-debugging-observability",{"type":36,"tag":2298,"props":2299,"children":2300},"style",{},[2301],{"type":42,"value":2302},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2304,"total":2408},[2305,2320,2338,2348,2360,2375,2392],{"slug":259,"name":259,"fn":2306,"description":2307,"org":2308,"tags":2309,"stars":20,"repoUrl":21,"updatedAt":2319},"configure Twilio accounts and credentials","Create and configure a Twilio account from scratch. Covers free trial signup, trial limitations, getting credentials (Account SID and Auth Token), buying a phone number, verifying recipient numbers for trial use, SDK installation, first API call, subaccount management (creation, inheritance, credential isolation, limits), and enabling specific products (AI Assistants, Conversations, Verify, ConversationRelay, WhatsApp). Use this skill before any other Twilio skill if you do not yet have a Twilio account or need to enable a product. For Organization-level governance (SSO, SCIM, multi-team), see `twilio-organizations-setup`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2310,2313,2316],{"name":2311,"slug":2312,"type":15},"API Development","api-development",{"name":2314,"slug":2315,"type":15},"Communications","communications",{"name":2317,"slug":2318,"type":15},"SMS","sms","2026-08-01T05:43:28.968968",{"slug":2321,"name":2321,"fn":2322,"description":2323,"org":2324,"tags":2325,"stars":20,"repoUrl":21,"updatedAt":2337},"twilio-agent-augmentation-architect","augment human agents with AI intelligence","Planning skill for augmenting human agents with real-time AI intelligence. Qualifies the developer's use case across coaching, compliance, QA, and routing to recommend the right Conversation Intelligence + Conversation Memory + TaskRouter architecture. Handles both \"I want to add AI coaching to my call center\" and \"configure Conversation Intelligence operators for script adherence.\"\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2326,2327,2330,2333,2336],{"name":17,"slug":18,"type":15},{"name":2328,"slug":2329,"type":15},"AI","ai",{"name":2331,"slug":2332,"type":15},"Coaching","coaching",{"name":2334,"slug":2335,"type":15},"QA","qa",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:58.250609",{"slug":2281,"name":2281,"fn":2339,"description":2340,"org":2341,"tags":2342,"stars":20,"repoUrl":21,"updatedAt":2347},"connect AI agents to Twilio channels","Connect third-party AI agents (OpenAI, Bedrock, LangChain, Microsoft Foundry) to Twilio's communication channels using the Twilio Agent Connect SDK. Covers identity resolution, memory and context management via Conversation Memory, conversation orchestration via Conversation Orchestrator, multi-channel handling (Voice, SMS, RCS, WhatsApp, Chat), and AI-to-human escalation. Use this skill when integrating an existing LLM agent with Twilio services.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2343,2344,2345,2346],{"name":17,"slug":18,"type":15},{"name":2311,"slug":2312,"type":15},{"name":2314,"slug":2315,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T06:06:05.217098",{"slug":2349,"name":2349,"fn":2350,"description":2351,"org":2352,"tags":2353,"stars":20,"repoUrl":21,"updatedAt":2359},"twilio-ai-agent-architect","plan Twilio conversational AI agents","Planning skill for AI-powered conversational agents. Qualifies the developer's use case across outcome sophistication, entry point, and customer profile to recommend the right Twilio Conversations architecture and implementation skills. Handles both high-level requests (\"build me a voice AI assistant\") and specific ones (\"integrate ConversationRelay with my OpenAI backend\").\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2354,2355,2358],{"name":17,"slug":18,"type":15},{"name":2356,"slug":2357,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:48.883723",{"slug":2361,"name":2361,"fn":2362,"description":2363,"org":2364,"tags":2365,"stars":20,"repoUrl":21,"updatedAt":2374},"twilio-call-recordings","record and manage Twilio voice calls","Record Twilio voice calls correctly. Covers the critical distinction between Record verb (voicemail) and Dial record (call recording), dual-channel for QA, mid-call pause for PCI, Conference recording, and the ConversationRelay workaround. Use this skill whenever you need to capture call audio for compliance, QA, or analytics.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2366,2369,2372,2373],{"name":2367,"slug":2368,"type":15},"Audio","audio",{"name":2370,"slug":2371,"type":15},"Compliance","compliance",{"name":2334,"slug":2335,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T06:07:55.268412",{"slug":2376,"name":2376,"fn":2377,"description":2378,"org":2379,"tags":2380,"stars":20,"repoUrl":21,"updatedAt":2391},"twilio-cli-reference","manage Twilio resources via CLI","Twilio CLI reference for managing Twilio resources from the terminal. Covers installation, credential profiles, phone number provisioning, sending SMS and email, webhook configuration, local development with a tunneling service, debugging with watch and logs, serverless deployment, and plugin ecosystem. Use when the developer asks to \"just do it\", \"set this up\", \"run a command\", mentions \"CLI\", \"command line\", or \"terminal\", or when an AI agent can execute a task directly instead of writing application code.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2381,2384,2387,2390],{"name":2382,"slug":2383,"type":15},"CLI","cli",{"name":2385,"slug":2386,"type":15},"Local Development","local-development",{"name":2388,"slug":2389,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:54.925664",{"slug":2393,"name":2393,"fn":2394,"description":2395,"org":2396,"tags":2397,"stars":20,"repoUrl":21,"updatedAt":2407},"twilio-compliance-onboarding","manage Twilio messaging and voice compliance","Registrations required BEFORE Twilio traffic works. Covers messaging programs (A2P 10DLC, toll-free verification, WhatsApp WABA, RCS, short code, alphanumeric sender) and voice trust programs (STIR\u002FSHAKEN, Voice Integrity, Branded Calling, CNAM). Each number\u002Fsender type has its own program — registration blocks traffic until complete.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2398,2399,2402,2403,2404],{"name":2370,"slug":2371,"type":15},{"name":2400,"slug":2401,"type":15},"Messaging","messaging",{"name":2317,"slug":2318,"type":15},{"name":9,"slug":8,"type":15},{"name":2405,"slug":2406,"type":15},"WhatsApp","whatsapp","2026-07-17T06:05:47.897229",57,{"items":2410,"total":2408},[2411,2417,2425,2432,2438,2445,2452,2460,2476,2489,2505,2522],{"slug":259,"name":259,"fn":2306,"description":2307,"org":2412,"tags":2413,"stars":20,"repoUrl":21,"updatedAt":2319},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2414,2415,2416],{"name":2311,"slug":2312,"type":15},{"name":2314,"slug":2315,"type":15},{"name":2317,"slug":2318,"type":15},{"slug":2321,"name":2321,"fn":2322,"description":2323,"org":2418,"tags":2419,"stars":20,"repoUrl":21,"updatedAt":2337},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2420,2421,2422,2423,2424],{"name":17,"slug":18,"type":15},{"name":2328,"slug":2329,"type":15},{"name":2331,"slug":2332,"type":15},{"name":2334,"slug":2335,"type":15},{"name":9,"slug":8,"type":15},{"slug":2281,"name":2281,"fn":2339,"description":2340,"org":2426,"tags":2427,"stars":20,"repoUrl":21,"updatedAt":2347},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2428,2429,2430,2431],{"name":17,"slug":18,"type":15},{"name":2311,"slug":2312,"type":15},{"name":2314,"slug":2315,"type":15},{"name":9,"slug":8,"type":15},{"slug":2349,"name":2349,"fn":2350,"description":2351,"org":2433,"tags":2434,"stars":20,"repoUrl":21,"updatedAt":2359},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2435,2436,2437],{"name":17,"slug":18,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},{"slug":2361,"name":2361,"fn":2362,"description":2363,"org":2439,"tags":2440,"stars":20,"repoUrl":21,"updatedAt":2374},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2441,2442,2443,2444],{"name":2367,"slug":2368,"type":15},{"name":2370,"slug":2371,"type":15},{"name":2334,"slug":2335,"type":15},{"name":9,"slug":8,"type":15},{"slug":2376,"name":2376,"fn":2377,"description":2378,"org":2446,"tags":2447,"stars":20,"repoUrl":21,"updatedAt":2391},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2448,2449,2450,2451],{"name":2382,"slug":2383,"type":15},{"name":2385,"slug":2386,"type":15},{"name":2388,"slug":2389,"type":15},{"name":9,"slug":8,"type":15},{"slug":2393,"name":2393,"fn":2394,"description":2395,"org":2453,"tags":2454,"stars":20,"repoUrl":21,"updatedAt":2407},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2455,2456,2457,2458,2459],{"name":2370,"slug":2371,"type":15},{"name":2400,"slug":2401,"type":15},{"name":2317,"slug":2318,"type":15},{"name":9,"slug":8,"type":15},{"name":2405,"slug":2406,"type":15},{"slug":2461,"name":2461,"fn":2462,"description":2463,"org":2464,"tags":2465,"stars":20,"repoUrl":21,"updatedAt":2475},"twilio-compliance-traffic","ensure compliance for Twilio messaging traffic","Rules you must follow for Twilio messaging and voice traffic. Covers TCPA (consent tiers, quiet hours, DNC), GDPR (EU consent, right to deletion), PCI DSS (payment recording, Pay verb), HIPAA (BAA, PHI), FDCPA (debt collection limits), CAN-SPAM, WhatsApp policies, SHAKEN\u002FSTIR, and consent management patterns. Use this skill proactively when developers have working traffic to ensure they follow the rules.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2466,2467,2468,2471,2474],{"name":2370,"slug":2371,"type":15},{"name":2400,"slug":2401,"type":15},{"name":2469,"slug":2470,"type":15},"Regulatory Compliance","regulatory-compliance",{"name":2472,"slug":2473,"type":15},"Security","security",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:55.952779",{"slug":2477,"name":2477,"fn":2478,"description":2479,"org":2480,"tags":2481,"stars":20,"repoUrl":21,"updatedAt":2488},"twilio-conference-calls","build multi-party calls with Twilio Conference","Build multi-party calls using Twilio Conference. Covers warm transfer, cold transfer, coaching (whisper), hold vs mute, participant modes, and supervisor barge. Use this skill for any contact center, support line, or scenario requiring transfers, holds, or multi-party calls.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2482,2483,2484,2487],{"name":2367,"slug":2368,"type":15},{"name":2314,"slug":2315,"type":15},{"name":2485,"slug":2486,"type":15},"Meetings","meetings",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:55.603708",{"slug":2490,"name":2490,"fn":2491,"description":2492,"org":2493,"tags":2494,"stars":20,"repoUrl":21,"updatedAt":2504},"twilio-content-template-builder","create and send message templates with Twilio","Create, manage, and send message templates using Twilio's Content API. Covers template creation for WhatsApp, SMS, RCS, and MMS; variable usage; WhatsApp Meta approval; and sending templates via ContentSid. Use this skill when building structured messages that require pre-approval or consistent formatting across channels.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2495,2498,2499,2500,2503],{"name":2496,"slug":2497,"type":15},"Email","email",{"name":2400,"slug":2401,"type":15},{"name":2317,"slug":2318,"type":15},{"name":2501,"slug":2502,"type":15},"Templates","templates",{"name":9,"slug":8,"type":15},"2026-07-17T06:04:26.637309",{"slug":2236,"name":2236,"fn":2506,"description":2507,"org":2508,"tags":2509,"stars":20,"repoUrl":21,"updatedAt":2521},"build conversation intelligence pipelines","Twilio Conversation Intelligence development guide. Use when building real-time or post-call conversation analysis, language operator pipelines, sentiment analysis, agent assist, cross-channel analytics, or querying aggregated conversation insights (sentiment trends, escalation rates, dashboards).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2510,2511,2514,2517,2520],{"name":17,"slug":18,"type":15},{"name":2512,"slug":2513,"type":15},"Analytics","analytics",{"name":2515,"slug":2516,"type":15},"Monitoring","monitoring",{"name":2518,"slug":2519,"type":15},"NLP","nlp",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:52.545387",{"slug":4,"name":4,"fn":5,"description":6,"org":2523,"tags":2524,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2525,2526,2527],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15}]