{"_id":"@anima-labs/sdk","_rev":"12-923fd42ffa41c3d9a88a918ac61e958a","name":"@anima-labs/sdk","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"@anima-labs/sdk","version":"0.1.0","keywords":["anima","sdk","ai-agents","email","identity","typescript"],"author":{"name":"Anima Labs","email":"support@anima.email"},"license":"MIT","_id":"@anima-labs/sdk@0.1.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"575ecbfbcc44a3a42480b6589b5e7d5e0ab8900f","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.1.0.tgz","fileCount":7,"integrity":"sha512-6Un67nFrn3ajssKzTDQhbChB0N06rla4ZNfLQOutctPj4g0ZrhgAuUWaNDii7EpsURd9Ko35rruPbBznRRALAQ==","signatures":[{"sig":"MEQCIDOUA+nUYqRSgFO4kxVlDzhOaPDDKTriwk5lHSJQhfrtAiBF68VapSzwgOVAHr8lwUVEx0cig+HfKwkp9n0xoR0K7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112934},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"500821c89973b5a8ae76a5710e0562a199159a57","scripts":{"test":"bun test src/__tests__/client.test.ts && bun test src/__tests__/webhooks.test.ts && bun test src/__tests__/resources.test.ts","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"11.11.0","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.0.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1774456247541_0.9285308767574054","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@anima-labs/sdk","version":"0.2.0","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","virtual-cards","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.2.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"5cffd4b1aeee2493a0c76bc098699b36593fa795","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.2.0.tgz","fileCount":7,"integrity":"sha512-0W/RY1XpUfHw1jPZQp2I9J6FjTH+xYw27ISZEU8pSSwx6/FYtzziHsyogdxD24Rv+WPcFosp8Lht5t3kS9EwZg==","signatures":[{"sig":"MEYCIQD9D7M3Y/XS3oqLS+GXP5EQtAEbKoWkjEtXOpX8GQO1PQIhAJg0LlFvE0R+ftJSFMY2+pdr8RxfaUWwny+aCFH0q3wr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":248919},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"319a9cdd50b002edf52a7e2b70472e525e9495db","scripts":{"test":"bun test src/__tests__/client.test.ts && bun test src/__tests__/webhooks.test.ts && bun test src/__tests__/resources.test.ts","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1775307105442_0.3238839432831764","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@anima-labs/sdk","version":"0.4.1","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.4.1","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"4db5fa40fe7267af71fd81ddb1c18a31ba56b1d5","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.4.1.tgz","fileCount":7,"integrity":"sha512-wPnx5UL/urppCGxjqhltgCSxGjbO3QIaMqhUH0oYWQjBa7wBdx/CXQXIyTmFarzcSI8xUBera3HpVnalxJwkwQ==","signatures":[{"sig":"MEUCIGk23pVZAp/VK44bqt4SlxX/ukTBCvL97Cvic8bPFI2sAiEAmtCjWq8ypmLHvFXvN3omd3R3l3Cu+LoVEVkOgmu587k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260056},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"77ae6d84445f0fdb79efdc1ad3533202eeda7cb3","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"11.16.0","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.1_1783255140563_0.33425394280194687","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@anima-labs/sdk","version":"0.5.0","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.5.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"2cf8dcfad2955798f294a75f404b57e1076d8fbb","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.5.0.tgz","fileCount":7,"integrity":"sha512-HAkI7NcZUGrDVp14cQG2/zd+qMyhxx4FFfr0/a3WsYFuVLYCpQzjvS0nO82KhAuJxq04sFMK6qhGlUGi1p3zoQ==","signatures":[{"sig":"MEYCIQDFnSOvOzgWK5QF0lCcdEqjsP5ZyNC1AjcBxTVEHq+QGwIhAKIpWrbfUSSCHiosKmvORC9WgAm1VWqmjoOcyq8sSW0Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264856},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"bd2f4c813d9381ef40aa27f5b135b721768a07b5","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"11.18.0","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.0_1783433256786_0.5888888584353846","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@anima-labs/sdk","version":"0.5.1","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.5.1","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"cb3321c2f83a0340ce571bb549866b89fccc43cc","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.5.1.tgz","fileCount":7,"integrity":"sha512-l7gBWDQ2PbmDWEUPeYwI+UyYM726JUc0wV03JcpWu7MCXs1N7krFWExp+3QqrEUH47r8oZvbDH/vZMjSKmPA1g==","signatures":[{"sig":"MEUCIEDAu9ZqptygxWSfJkLkVVsUGsQ6MxXkTya5uUefCsIeAiEA5g9dz+Vf0TpIP9QcTf9aGoQVH3C6Eyq5j/6ct2Ne0/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":300690},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"af6df1eea745b9d13d8cc4f8257196e0642e7273","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.1","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.1_1784211911708_0.2534138003155817","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@anima-labs/sdk","version":"0.5.2","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.5.2","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"0f109b58fe5036e0ad54ee4a130909b52e5fdd02","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.5.2.tgz","fileCount":7,"integrity":"sha512-SZCfCnCT7kUJfy6E4Ihl0W9GOriw3yaEpOUgtTwl4flT0VWBAGn2hcx3ATfIqPVQZElUdvJTaZYgFQ8JEH7YKA==","signatures":[{"sig":"MEUCIQDjQCP4Zl1PTvhtE+DoJXRBSrnon8IZQoSxZpIizpyVtgIgQ7eXXv4JJ9WOeD0sTiqq9lgKiX/74kgbs4AaTEQYoBQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":315333},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"5160e17842b866d478f89720cc69decc9a99fefe","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.1","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.2_1784227447770_0.48109619038165485","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@anima-labs/sdk","version":"0.5.3","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.5.3","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"e269b472f433b745a73366b9aa8d6519d85382eb","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.5.3.tgz","fileCount":7,"integrity":"sha512-SBfOnFEm34UdgKC01ueFBivu8eTu+2LYHDvpkHaYFVD433eqq8S+BxxgVRacQ8eRQscM3KRGFMHAIQFT/UZIyg==","signatures":[{"sig":"MEQCIBKbPgUyR8unzltSCrEHZStKjP1VFlu5mYpBliHs5ZhqAiBs9diIPlCryQ6Z9gsFmDJQe5OwbGX79Hp13nDQy7QvIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":322907},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"f156a781fda843c85981ad7b3138f04eb23bcb01","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.1","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.3_1784241798239_0.06071297050262214","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@anima-labs/sdk","version":"0.5.4","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.5.4","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"41751c34ef15733ea15f57ad18e36120a33daf9c","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.5.4.tgz","fileCount":7,"integrity":"sha512-w6Sq9K6LwxmsahfQVWbazQbkYd/PGCL3BSJdf+aqRCfoKmWJTQnAruwiPindbwmYMl+/jtDeusvyemO1Y6jFUA==","signatures":[{"sig":"MEUCIFxsd+/MLr3q3zDeFgVNhw5j9XwG/ewus7Ba7MKnTtqCAiEAlwAdhJSnif2+Mp7YORs25aA2xwlY3RSnitSZamP0o9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":329527},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"91713fadcec5ac806b7856a8f62aa7b791eff9fa","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.1","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.4_1784297360871_0.4682250738091325","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@anima-labs/sdk","version":"0.6.0","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.6.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"e6de27231a7d4bb38e227ea18e39c8c86ae8c127","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.6.0.tgz","fileCount":7,"integrity":"sha512-omeiJhv5xg/cGrhTXpUShrxTZucTKGCsMxHzN8jHTmqsw3JYpkNQYwS1azMqx92av59v2OHjrD+fsH3GX3ZNdw==","signatures":[{"sig":"MEUCIDZ7QrLX1hEWTlbtz0JG1XzKr55YjSLti65hcIFidGl4AiEAh9g1/TvEBXWP9QLoWSGJLsGLCXXVDnnA3iRpq5CxvUA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":330851},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"d984f0cb18c0f5f908998eeb0121e80f28f1d927","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.1","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.6.0_1784905729730_0.813032802173109","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@anima-labs/sdk","version":"0.7.0","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.7.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"10fd18142a688a6627b2086589e00223734dac12","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.7.0.tgz","fileCount":7,"integrity":"sha512-hZSPjPNPWBADeYgzigaPSEWNmu1jEWg5LrmCw+wP5WX9hwN3qKTszgkoTAlHxEyRBBQpn7AnUZzS2U6eRiyM9A==","signatures":[{"sig":"MEUCIQD/BvG/DhHjHza2ByotLbOY471ARTSIjx9Tchq/7dWwCgIgGHUivMm1GQwaqMBXx4J8/45HJonzVpagx3+OGSAPNt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":357410},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"2de3ec0635b2cc5463954b519ee536716669000f","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.2","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.7.0_1785854892230_0.5595612178600082","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@anima-labs/sdk","version":"0.8.0","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","_id":"@anima-labs/sdk@0.8.0","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"dist":{"shasum":"d1e518519e30e8fa7db040b086b6e037f3d48b33","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.8.0.tgz","fileCount":7,"integrity":"sha512-BdForEb0Xuo6C5NwVNuGqJBtIdksyg62TRp2d7gZAGKAdgsjlG/2Y3yjSlJp7tl8i791vgsIuONq/H0WD3sg1w==","signatures":[{"sig":"MEYCIQD5+LtA3VLQvO++UgFo1mxf+B2ouyTpYkyftrob8r9LogIhAL6Gv69jETrrfCKnGzlTfTsjv89iLW+AoYEaNlYn66my","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":357134},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"5c8660ce51b117e89f0b90b7f8002ece6076a947","scripts":{"test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"repository":{"url":"git+https://github.com/anima-labs-ai/node.git","type":"git"},"_npmVersion":"12.0.2","description":"Official TypeScript/Node.js SDK for the Anima API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","@types/ws":"^8.5.0","@types/bun":"^1.2.0","typescript":"^5.7.0","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.8.0_1786016224037_0.21004420803146462","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@anima-labs/sdk","version":"0.9.0","description":"Official TypeScript/Node.js SDK for the Anima API","license":"MIT","author":{"name":"Anima Labs","email":"support@useanima.sh"},"repository":{"type":"git","url":"git+https://github.com/anima-labs-ai/node.git"},"homepage":"https://github.com/anima-labs-ai/node","bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit && tsc -p tsconfig.tests.json","test":"bun test"},"engines":{"node":">=22"},"dependencies":{"ws":"^8.18.0"},"devDependencies":{"@types/bun":"^1.2.0","@types/node":"^25.5.0","@types/ws":"^8.5.0","tsup":"^8.0.0","typescript":"^5.7.0"},"gitHead":"6359ae83f7175bf7321523497143ff6a4c718cac","_id":"@anima-labs/sdk@0.9.0","_nodeVersion":"24.18.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-ewvE0siqg+QggR2+q3m3yKQ/EyDi/4UDzJca8NuLBU14eP2BEWbcS9pM6C8/V1p2xscGLpgYMyFWRyvfpUAOiw==","shasum":"2713a789e8633d29dd75a5c7c421f226338c0d05","tarball":"https://registry.npmjs.org/@anima-labs/sdk/-/sdk-0.9.0.tgz","fileCount":7,"unpackedSize":361962,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anima-labs%2fsdk@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCYWGtWqc/8n6pgLIiDwNAUwFGmy0A/xBFr89/sNkwxGgIgOUw0lv4SWMbaxeNaBUOKfjOd8PIeNcmoMoPGgib/tPo="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bb4bbf4e-7e00-4392-8011-9dc4671b7acb"}},"directories":{},"maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.9.0_1786078691977_0.7304640823297821"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-25T16:30:47.377Z","modified":"2026-08-07T04:58:12.458Z","0.1.0":"2026-03-25T16:30:47.698Z","0.2.0":"2026-04-04T12:51:45.626Z","0.4.1":"2026-07-05T12:39:00.697Z","0.5.0":"2026-07-07T14:07:36.936Z","0.5.1":"2026-07-16T14:25:11.863Z","0.5.2":"2026-07-16T18:44:07.922Z","0.5.3":"2026-07-16T22:43:18.440Z","0.5.4":"2026-07-17T14:09:21.043Z","0.6.0":"2026-07-24T15:08:49.882Z","0.7.0":"2026-08-04T14:48:12.389Z","0.8.0":"2026-08-06T11:37:04.185Z","0.9.0":"2026-08-07T04:58:12.124Z"},"bugs":{"url":"https://github.com/anima-labs-ai/node/issues"},"author":{"name":"Anima Labs","email":"support@useanima.sh"},"license":"MIT","homepage":"https://github.com/anima-labs-ai/node","keywords":["anima","sdk","ai-agents","email","sms","identity","webhooks","vault","typescript","agent-infrastructure"],"repository":{"type":"git","url":"git+https://github.com/anima-labs-ai/node.git"},"description":"Official TypeScript/Node.js SDK for the Anima API","maintainers":[{"name":"diyanbogdanov","email":"diyan.bogdanov@gmail.com"}],"readme":"# Anima Node.js SDK\n\nThe official TypeScript/Node.js SDK for the [Anima API](https://docs.useanima.sh) — unified identity infrastructure for AI agents.\n\n[![npm version](https://img.shields.io/npm/v/@anima-labs/sdk.svg)](https://www.npmjs.com/package/@anima-labs/sdk)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n## Installation\n\n```bash\nnpm install @anima-labs/sdk\n```\n\n```bash\nyarn add @anima-labs/sdk\n```\n\n```bash\npnpm add @anima-labs/sdk\n```\n\n## Quick Start\n\n```ts\nimport { Anima } from \"@anima-labs/sdk\";\n\nconst anima = new Anima({\n  apiKey: \"mk_your_api_key\",\n});\n\n// Send an email from an agent\nconst message = await anima.messages.sendEmail({\n  agentId: \"agent_abc123\",\n  to: [\"user@example.com\"],\n  subject: \"Welcome!\",\n  body: \"Thanks for signing up.\",\n});\n\nconsole.log(message.id, message.status);\n```\n\n## Configuration\n\n```ts\nconst anima = new Anima({\n  apiKey: \"mk_your_api_key\",   // Required — your organization master key or agent API key\n  baseUrl: \"https://api.useanima.sh\", // Optional — defaults to https://api.useanima.sh\n  timeout: 30_000,              // Optional — request timeout in ms (default: 30s)\n  maxRetries: 3,                // Optional — retry count for 429/5xx errors (default: 3)\n});\n```\n\n## Resources\n\n### Organizations\n\n```ts\n// Create an organization\nconst org = await anima.organizations.create({\n  name: \"Acme Corp\",\n  slug: \"acme-corp\",\n});\n\n// List organizations\nconst orgs = await anima.organizations.list({ limit: 20 });\n\n// Get, update, delete\nconst org = await anima.organizations.get(\"org_id\");\nawait anima.organizations.update(\"org_id\", { name: \"New Name\" });\nawait anima.organizations.delete(\"org_id\");\n\n// Rotate master key\nconst { masterKey } = await anima.organizations.rotateKey(\"org_id\");\n```\n\n### Agents\n\n```ts\n// Create an agent\nconst agent = await anima.agents.create({\n  orgId: \"org_id\",\n  name: \"Support Bot\",\n  slug: \"support-bot\",\n  email: \"support@yourdomain.com\", // optional — provision email identity\n  provisionPhone: true,             // optional — provision phone number\n});\n\n// List agents with filtering\nconst agents = await anima.agents.list({\n  orgId: \"org_id\",\n  status: \"ACTIVE\",\n  query: \"support\",\n  limit: 10,\n});\n\n// Get, update, delete\nconst agent = await anima.agents.get(\"agent_id\");\nawait anima.agents.update(\"agent_id\", { name: \"Updated Name\" });\nawait anima.agents.delete(\"agent_id\");\n\n// Rotate agent API key\nconst { apiKey, apiKeyPrefix } = await anima.agents.rotateKey(\"agent_id\");\n```\n\n### Messages\n\n```ts\n// Send an email\nconst email = await anima.messages.sendEmail({\n  agentId: \"agent_id\",\n  to: [\"recipient@example.com\"],\n  cc: [\"cc@example.com\"],\n  subject: \"Hello\",\n  body: \"Plain text body\",\n  bodyHtml: \"<h1>Hello</h1>\",\n});\n\n// Send with attachments — each entry provides EITHER base64 `content`\n// or a public `url` the server fetches (max 20 files, 25MB total)\nconst withAttachment = await anima.messages.sendEmail({\n  agentId: \"agent_id\",\n  to: [\"recipient@example.com\"],\n  subject: \"Report attached\",\n  body: \"See the attached report.\",\n  attachments: [\n    { filename: \"report.pdf\", contentType: \"application/pdf\", content: \"JVBERi0xLjQK...\" },\n    { url: \"https://files.example.com/big.pdf\", filename: \"big.pdf\" },\n  ],\n});\n\n// Reply in-thread by referencing Message-IDs\nconst reply = await anima.messages.sendEmail({\n  agentId: \"agent_id\",\n  to: [\"recipient@example.com\"],\n  subject: \"Re: Hello\",\n  body: \"Replying in the same thread.\",\n  inReplyTo: \"<message-id@agents.useanima.sh>\",\n  references: [\"<message-id@agents.useanima.sh>\"],\n});\n\n// Send an SMS\nconst sms = await anima.messages.sendSms({\n  agentId: \"agent_id\",\n  to: \"+15551234567\",\n  body: \"Your code is 123456\",\n});\n\n// List messages\nconst messages = await anima.messages.list({\n  agentId: \"agent_id\",\n  channel: \"EMAIL\",\n  direction: \"OUTBOUND\",\n  limit: 20,\n});\n\n// Search messages\nconst results = await anima.messages.search(\"verification\", {\n  filters: { status: \"SENT\", channel: \"EMAIL\" },\n  pagination: { limit: 10 },\n});\n\n// Semantic search — ranks messages by meaning, not text match:\n// finds \"the invoice from last week\" even when no message contains\n// those words. Results are ordered by similarity (best first).\nconst semantic = await anima.messages.semanticSearch(\"the invoice from last week\", {\n  agentId: \"agent_id\",   // optional — restrict to one agent\n  limit: 10,             // optional — max results (default 10)\n  threshold: 0.7,        // optional — min similarity 0-1 (default 0.7)\n});\nfor (const hit of semantic.results) {\n  console.log(hit.similarity.toFixed(2), hit.content);\n}\n\n// Get a single message\nconst msg = await anima.messages.get(\"msg_id\");\n\n// Attachments\nconst attachment = await anima.messages.uploadAttachment(\"msg_id\", {\n  filename: \"report.pdf\",\n  mimeType: \"application/pdf\",\n  sizeBytes: 1024,\n});\nconst { url } = await anima.messages.getAttachmentUrl(\"attachment_id\");\n```\n\n### Emails\n\n```ts\n// List email messages\nconst emails = await anima.emails.list({ agentId: \"agent_id\", limit: 20 });\n\n// Attachment helpers\nconst uploaded = await anima.emails.uploadAttachment(\"msg_id\", {\n  filename: \"doc.pdf\",\n  mimeType: \"application/pdf\",\n  sizeBytes: 2048,\n});\nconst download = await anima.emails.getAttachmentUrl(\"attachment_id\");\n```\n\n### Email Drafts\n\n```ts\n// Compose a draft — may be incomplete (no recipients / subject yet)\nconst draft = await anima.drafts.create({\n  agentId: \"agent_id\",\n  to: [\"recipient@example.com\"],\n  subject: \"Quarterly report\",\n  body: \"Numbers attached.\",\n});\n\n// Get and list\nconst fetched = await anima.drafts.get(draft.id);\nconst drafts = await anima.drafts.list({ agentId: \"agent_id\", limit: 20 });\n\n// Send — converts the draft into a real Message (threading, scanning and\n// limits all apply) and deletes the draft row. Resolves to the sent\n// Message; the draft id 404s afterwards. Incomplete drafts (missing\n// to/subject/body) are rejected with a ValidationError.\nconst message = await anima.drafts.send(draft.id);\nconsole.log(message.status); // \"SENT\"\n\n// Delete without sending — resolves to the deleted draft\nconst discarded = await anima.drafts.delete(\"draft_id\");\n```\n\n### Inboxes\n\n```ts\n// Create an inbox — all fields optional; create() alone provisions a\n// generated address on the default domain\nconst inbox = await anima.inboxes.create({\n  username: \"support\",           // local part → support@<domain>\n  displayName: \"Support\",\n  agentId: \"agent_id\",           // optional — associate with an agent\n});\nconsole.log(inbox.email);\n\n// Get, list, update, delete\nconst fetched = await anima.inboxes.get(\"inbox_id\");\nconst inboxes = await anima.inboxes.list({ query: \"support\", limit: 20 });\nawait anima.inboxes.update(\"inbox_id\", { displayName: \"Sales\" });\nawait anima.inboxes.delete(\"inbox_id\");\n```\n\n### Domains\n\n```ts\n// Add a custom domain\nconst domain = await anima.domains.add({ domain: \"mail.example.com\" });\n\n// Verify domain DNS\nconst verified = await anima.domains.verify(\"domain_id\");\n\n// Get DNS records to configure\nconst records = await anima.domains.dnsRecords(\"domain_id\");\n\n// Get zone file\nconst { zoneFile } = await anima.domains.zoneFile(\"domain_id\");\n\n// Check deliverability stats\nconst stats = await anima.domains.deliverability(\"domain_id\");\n\n// List, get, update, delete\nconst domains = await anima.domains.list();\nconst domain = await anima.domains.get(\"domain_id\");\nawait anima.domains.update(\"domain_id\", { feedbackEnabled: true });\nawait anima.domains.delete(\"domain_id\");\n```\n\n### Phones\n\n```ts\n// Provision a phone number for an agent\nconst phone = await anima.phones.provision({\n  agentId: \"agent_id\",\n  countryCode: \"US\",\n  capabilities: [\"sms\", \"voice\"],\n});\n\n// List phone numbers\nconst phones = await anima.phones.list({ agentId: \"agent_id\" });\n\n// Get, update config, release\nconst phone = await anima.phones.get(\"phone_id\");\nawait anima.phones.updateConfig(\"phone_id\", { isPrimary: true });\nawait anima.phones.release(\"phone_id\");\n```\n\n### Voices\n\nBrowse the multilingual voice catalog and pick a voice for an agent's phone calls. Voices span several languages (English, Spanish, French, German, Italian, Japanese, Dutch, and more) — filter by `language` or `gender`.\n\n```ts\n// List every voice in the catalog\nconst { voices } = await anima.voices.list();\n\n// Only Spanish voices\nconst spanish = await anima.voices.list({ language: \"es\" });\n\n// Female English voices\nconst enFemale = await anima.voices.list({ gender: \"female\", language: \"en\" });\n\nfor (const voice of voices) {\n  console.log(voice.id, voice.name, voice.language, voice.descriptors);\n  // Play a preview: `sampleUrl` is a vendor-neutral clip served from the API\n  // host (undefined until a sample has been generated for that voice).\n  if (voice.sampleUrl) console.log(\"preview:\", voice.sampleUrl);\n}\n```\n\n### Webhooks\n\n```ts\n// Create a webhook\nconst webhook = await anima.webhooks.create({\n  url: \"https://your-app.com/webhooks/anima\",\n  events: [\"message.received\", \"message.sent\", \"agent.created\"],\n  description: \"Production webhook\",\n  // Optional: auth Anima presents to your endpoint, in addition to the\n  // always-on X-Anima-Signature HMAC. Also: bearer / basic / custom_header.\n  authConfig: { type: \"bearer\", token: \"your-endpoint-secret\" },\n  rateLimitPerMinute: 60, // omit for unlimited\n  maxAttempts: 5, // 1..10, default 3\n});\n\n// List, get, update, delete\nconst webhooks = await anima.webhooks.list({ limit: 10 });\nconst wh = await anima.webhooks.get(\"webhook_id\");\nawait anima.webhooks.update(\"webhook_id\", { active: false });\nawait anima.webhooks.delete(\"webhook_id\");\n\n// Test a webhook\nconst { deliveryId } = await anima.webhooks.test(\"webhook_id\", \"message.sent\");\n\n// List deliveries\nconst deliveries = await anima.webhooks.listDeliveries(\"webhook_id\", { limit: 20 });\n```\n\n### Security\n\n```ts\n// Content scanning is not a call you make. It runs inside the send paths,\n// so a blocked message surfaces as an error from emails.send / messages.send.\n// What you can query is whether the scanner is actually running:\nconst { aiScanner } = await anima.security.getScannerStatus(\"org_id\");\n\nif (!aiScanner.active) {\n  console.warn(\"AI scanning is off:\", aiScanner.fallbackReason);\n}\n\n// List security events\nconst events = await anima.security.listEvents({\n  orgId: \"org_id\",\n  type: \"PII_DETECTED\",\n  severity: \"HIGH\",\n  limit: 20,\n});\n```\n\n### Vault\n\n```ts\n// Provision a vault for an agent\nconst vault = await anima.vault.provision({ agentId: \"agent_id\" });\n\n// Store credentials\nconst credential = await anima.vault.createCredential({\n  agentId: \"agent_id\",\n  type: \"login\",\n  name: \"GitHub\",\n  login: {\n    username: \"bot@example.com\",\n    password: \"secure-password\",\n    uris: [{ uri: \"https://github.com/login\" }],\n  },\n});\n\n// Or have the vault generate the password server-side — it is stored\n// with the credential and never returned; the response carries only the\n// masked credential ref. (Defaults: 24 chars, all character classes.)\nconst generated = await anima.vault.createCredential({\n  agentId: \"agent_id\",\n  type: \"login\",\n  name: \"Acme Portal\",\n  login: { username: \"bot@example.com\" },\n  generatePassword: { length: 32 },\n});\n\n// List and search credentials\nconst creds = await anima.vault.listCredentials({ agentId: \"agent_id\", type: \"login\" });\nconst results = await anima.vault.search({ agentId: \"agent_id\", search: \"github\" });\n\n// Get, update, delete\nconst cred = await anima.vault.getCredential(\"cred_id\");\nawait anima.vault.updateCredential(\"cred_id\", { name: \"GitHub (prod)\" });\nawait anima.vault.deleteCredential(\"cred_id\");\n\n// Generate a secure password\nconst { password } = await anima.vault.generatePassword({\n  length: 32,\n  uppercase: true,\n  lowercase: true,\n  number: true,\n  special: true,\n});\n\n// TOTP codes\nconst { code, period } = await anima.vault.getTotp(\"cred_id\");\n\n// Vault status and sync\nconst status = await anima.vault.status(\"agent_id\");\nawait anima.vault.sync(\"agent_id\");\n\n// Deprovision\nawait anima.vault.deprovision({ agentId: \"agent_id\" });\n```\n\n### Provisioning Requests\n\n`vault.provision` and `phones.provision` both require a master key, which an\nagent is never given. This is how an agent asks its owner instead — it files a\nrequest, the owner approves it in the console, and the resource is created. The\nagent gets the result, never the privilege.\n\n```ts\n// As the agent: ask for a vault. `reason` is shown verbatim to the owner.\nconst req = await anima.provisioningRequests.create({\n  resource: \"VAULT\",\n  reason: \"To store the Stripe key so I can issue refunds\",\n});\n\n// emailSent: false does NOT mean the request failed — it is live in the\n// console either way — but nobody was told, so nothing will happen until\n// someone looks.\nif (!req.emailSent) console.warn(\"owner was not notified\");\n\n// Poll for the decision. `decidedNote` carries the owner's reason for a\n// decline, so a second attempt can address it instead of repeating the first.\nconst current = await anima.provisioningRequests.get(req.requestId);\nif (current.status === \"APPROVED\") {\n  console.log(\"provisioned:\", current.provisionedId);\n}\n\n// Withdraw an ask you no longer need.\nawait anima.provisioningRequests.cancel(req.requestId);\n\n// As the owner (master key only): decide.\nawait anima.provisioningRequests.approve(req.requestId);\nawait anima.provisioningRequests.decline(req.requestId, {\n  note: \"Tell me which API first\",\n});\n\n// A phone number takes options; Starter+ plans only.\nawait anima.provisioningRequests.create({\n  resource: \"PHONE_NUMBER\",\n  reason: \"To receive delivery notifications\",\n  options: { countryCode: \"US\", areaCode: \"415\" },\n});\n```\n\n### Extension\n\nMint a connect URL that opens the Anima browser extension already bound to an\nagent's session — for headless / Puppeteer workers.\n\n```ts\n// With a master key, pass the agent to connect. As the agent's own key, omit\n// agentId. `ttl` is optional and shorten-only (\"15m\" | \"1h\" | \"session\").\nconst { connectUrl, expiresAt, policy } = await anima.extension.connect({\n  agentId: \"agent_id\",\n  ttl: \"15m\",\n});\n\n// As the agent itself (agent key) — no arguments needed.\nconst session = await anima.extension.connect();\n```\n\n## Webhook Verification\n\nVerify incoming webhook signatures using HMAC-SHA256:\n\n```ts\nimport { Anima } from \"@anima-labs/sdk\";\n\n// In your webhook handler\napp.post(\"/webhooks/anima\", (req, res) => {\n  const payload = req.body; // raw string body\n  const signature = req.headers[\"x-anima-signature\"];\n  const secret = \"whsec_your_webhook_secret\";\n\n  // Option 1: Verify and parse in one step\n  try {\n    const event = Anima.webhooks.constructEvent(payload, signature, secret);\n    console.log(event.type, event.data);\n  } catch (err) {\n    return res.status(400).send(\"Invalid signature\");\n  }\n\n  // Option 2: Verify only\n  const isValid = Anima.webhooks.verify(payload, signature, secret);\n  if (!isValid) {\n    return res.status(400).send(\"Invalid signature\");\n  }\n\n  res.status(200).send(\"OK\");\n});\n```\n\nSignature format: `t=<unix_timestamp>,v1=<hmac_sha256_hex>`\n\n## Error Handling\n\nThe SDK throws typed errors for different failure scenarios:\n\n```ts\nimport {\n  Anima,\n  APIError,\n  AuthError,\n  ConflictError,\n  InternalServerError,\n  NotFoundError,\n  RateLimitError,\n  ValidationError,\n} from \"@anima-labs/sdk\";\n\ntry {\n  await anima.agents.get(\"nonexistent\");\n} catch (error) {\n  if (error instanceof AuthError) {\n    // 401/403 — invalid or expired API key\n    console.error(\"Auth failed:\", error.message);\n  } else if (error instanceof NotFoundError) {\n    // 404 — resource doesn't exist\n    console.error(\"Not found:\", error.message);\n  } else if (error instanceof ValidationError) {\n    // 400/422 — invalid request parameters\n    console.error(\"Validation:\", error.message, error.details);\n  } else if (error instanceof ConflictError) {\n    // 409 — resource conflict (e.g. duplicate slug)\n    console.error(\"Conflict:\", error.message);\n  } else if (error instanceof RateLimitError) {\n    // 429 — rate limited, check retryAfter\n    console.error(\"Rate limited, retry after:\", error.retryAfter, \"seconds\");\n  } else if (error instanceof InternalServerError) {\n    // 5xx — server error\n    console.error(\"Server error:\", error.status, error.message);\n  } else if (error instanceof APIError) {\n    // Other API errors\n    console.error(error.status, error.code, error.message);\n  }\n}\n```\n\nAll errors extend `AnimaError` -> `APIError` with:\n- `status` -- HTTP status code\n- `code` -- Machine-readable error code\n- `message` -- Human-readable message\n- `details` -- Additional error context (when available)\n\n| Error Class           | HTTP Status | Code              |\n| --------------------- | ----------- | ----------------- |\n| `AuthError`           | 401/403     | `AUTH_ERROR`      |\n| `ValidationError`     | 400/422     | `VALIDATION_ERROR`|\n| `NotFoundError`       | 404         | `NOT_FOUND`       |\n| `ConflictError`       | 409         | `CONFLICT`        |\n| `RateLimitError`      | 429         | `RATE_LIMIT`      |\n| `InternalServerError` | 5xx         | `INTERNAL_ERROR`  |\n\n## Pagination\n\nAll list endpoints support cursor-based pagination:\n\n```ts\n// First page\nconst page1 = await anima.agents.list({ orgId: \"org_id\", limit: 10 });\nconsole.log(page1.items);\nconsole.log(page1.pagination.hasMore);\n\n// Next page\nif (page1.pagination.hasMore && page1.pagination.nextCursor) {\n  const page2 = await anima.agents.list({\n    orgId: \"org_id\",\n    limit: 10,\n    cursor: page1.pagination.nextCursor,\n  });\n}\n\n// Iterate all pages\nlet cursor: string | undefined;\ndo {\n  const page = await anima.agents.list({ orgId: \"org_id\", limit: 100, cursor });\n  for (const agent of page.items) {\n    console.log(agent.name);\n  }\n  cursor = page.pagination.nextCursor ?? undefined;\n} while (cursor);\n```\n\n## TypeScript\n\nThis SDK is written in TypeScript and ships with complete type definitions. All API methods return `Promise<T>` with resource-specific response types.\n\nAll types are exported from the main package:\n\n```ts\nimport type {\n  AgentOutput,\n  MessageOutput,\n  OrganizationOutput,\n  SendEmailInput,\n  WebhookEvent,\n  AnimaClientOptions,\n} from \"@anima-labs/sdk\";\n```\n\n## Requirements\n\n- Node.js >= 18 (uses native `fetch`)\n- TypeScript >= 5.0 (optional, for type checking)\n\n## Documentation\n\nFull API documentation is available at [docs.useanima.sh](https://docs.useanima.sh).\n\n## Community\n\nJoin the [Anima Discord](https://discord.gg/pY3GK59Z9E) to ask questions in `#node-sdk`, share what you're building in `#showcase`, and stay up to date with releases in `#announcements`.\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}