{"_id":"loops","_rev":"49-b7c815e89441d2b04001db5f801b9167","name":"loops","dist-tags":{"latest":"7.0.0"},"versions":{"1.0.9":{"name":"loops","version":"1.0.9","_id":"loops@1.0.9","maintainers":[{"name":"jimbobmcgee","email":"npmjs.org@jimbobmcgee.com"}],"dist":{"shasum":"8bdde6a1188ea66ecd14f3827b1d4094af019890","tarball":"https://registry.npmjs.org/loops/-/loops-1.0.9.tgz","integrity":"sha512-6tlInBHzsidTTH8C80B92ZnxxqbFNAsNsXhuPaOMkQTZG4+Xy/TOWRXIP8R3LVmJDtvaD2/7QnjaS46NIRrNPQ==","signatures":[{"sig":"MEYCIQDsGrqfOueZGXT+sqkPSKeFZpIZ0PH14FHosrlUoXbOeAIhAMRtFk2njS0134rCpiz1o14B3RO830Z+UMxNSiy89l6w","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","notes":"There were no uncommitted modifications in this build","engines":{"node":"*"},"_npmUser":{"name":"jimbobmcgee","email":"npmjs.org@jimbobmcgee.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"http://xp-dev.com/svn/jimbobmcgee-nodejs/loops/trunk","type":"svn","revision":"9","commit_date":"2011-11-04T20:19:45"},"_npmVersion":"1.0.103","description":"Basic, non-blocking loop functions for NodeJS","directories":{},"_nodeVersion":"v0.5.10","dependencies":{},"_defaultsLoaded":true,"devDependencies":{},"_engineSupported":true},"0.1.0":{"name":"loops","version":"0.1.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"84b625761d6f53fa4d121e22abbe184d8e35cb51","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.0.tgz","fileCount":7,"integrity":"sha512-Ps04PL5DLnbHuB+IJ8hu5dplA/LKlVyB5ibIO0vn0oD0kpNzOBhUPvu+QBM7ZPGooAy1PCpyJKtASohs6SZ7yA==","signatures":[{"sig":"MEYCIQC4r6FrwZJHmnLAyJtsJlrYIYeHK+zkeqACLp2lyzKGBAIhAJhY7fFxQVoPZxeWiz9OwsFywh67mhxsB5L2mALrWGHX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28473},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"8a3db17f2ffef5a75150ab0676023e6a5505405c","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.0_1698652991669_0.9890510152377552","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"loops","version":"0.1.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"b864bc5ff4381f9b0cfc9f305fc7e56c8c435ded","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.1.tgz","fileCount":7,"integrity":"sha512-JxJJn2kxdCxR6enyU/8QH3toy5E+aZBzPnQupgvHuHABjd2jGh2HyT8ekv7PsB5zPKWhQnAVkAgvKHlRZWMMNw==","signatures":[{"sig":"MEYCIQD9UADIwlWgnt71g2eldPtRfHJdrRKv1vlgoQNQ0MikHgIhAIWFOBDu+VO+YlB+yMHtmOm25Cy9kgsf46BGk8XR4xuU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":30821},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"18d4161258ec55b2453e3921159e978b7c935c6e","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.1_1698824796487_0.9219454662477902","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"loops","version":"0.1.2","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.2","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"45ff3a7475c4971d07776a31f664f0dc4107ea3c","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.2.tgz","fileCount":7,"integrity":"sha512-/crwxWl8gihXWlYTYOhCUWe5giAmZtjN8raKn9D3QxRVqT6gPE4Kwbw+3/nMgzzogCJ8FD6PbyeGJ3Bg7cyD2Q==","signatures":[{"sig":"MEUCIHFzzV3pR3uQ+b4cT906bwYsjScUgxWszh154pdvfOWQAiEAy6aXVKyQCLpMQsX5kYSYhbl30SViNB94NY1lP3MoaBA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33150},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"566260e86d09242fc88e31e866ac765e9de38787","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.2_1701887780379_0.7348558918229497","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"loops","version":"0.1.3","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.3","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"07083ab5548024241c06adb35a53204cf7447630","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.3.tgz","fileCount":7,"integrity":"sha512-IJh1Se/wExb1bwkZ4oYEffnGP7l/PV7K/dC5htX6/Vs6Q8XO5XsqNTedbiPVvJjjkS374mtw7cjYTcqWeC+31g==","signatures":[{"sig":"MEQCIEW8jzPC3KmgzWRIRB3e4TvAnKQILgyG3P6FhfMRdSYfAiBHrZn1fKDwfZ5GTWRmI7zfBcZUPjkgLHNvQXaV2ag8zA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34991},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"5a3cdc2ff93e4adf1ccabfa4be0c675a4b45079b","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.3_1702024836729_0.32508049516291737","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"loops","version":"0.1.4","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.4","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"b5cd1139de7bb775598044843e89796ab452f556","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.4.tgz","fileCount":7,"integrity":"sha512-LrIInL/oFum6FGtF2eg6Iivo3Y9IZDX5ijLkLRvoWwHYA/zr29UypjNdhJwbFj/kcr+qcpp2iG1biq1lvT0OjQ==","signatures":[{"sig":"MEUCIQDll4yyKiybh15ykHdEzk8FESUvH3qc4rsQ7Dfek+G03wIgC1QsT7/i1cmXjL4cL5BkNsPWsxOb/is9+lAH1Vyfi2M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40705},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"7bb1e155620c486c6ae2fe7a233cc050515d3f7b","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.4_1706190005890_0.3917796991892284","host":"s3://npm-registry-packages"}},"0.1.5":{"name":"loops","version":"0.1.5","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.1.5","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"4d173cc3af37988a0581793bd36475bb963189a3","tarball":"https://registry.npmjs.org/loops/-/loops-0.1.5.tgz","fileCount":7,"integrity":"sha512-hePun4m8g5hmoDpNhWuoNltBKqijjTt/aoHXig+wvBH3o4ccBL1fVt78HDmRGiCP/1sb3kr446BPM+oYRHsmPA==","signatures":[{"sig":"MEYCIQCKmZGX2hChAvESGu18R5bu14xgkQXp40spepE+GBvIrgIhAMfgUrppcKUufjYe0VWP7U++bMedE3K9FIeN1N5dXzSv","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41236},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":"./dist/index.js","gitHead":"cc4e1bcbf03ca39d70f7790a3880a8127f91f838","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.1.5_1706273058425_0.9178561210954927","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"loops","version":"0.2.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.2.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"585012eef398ea0060862dea128bdc9009525a71","tarball":"https://registry.npmjs.org/loops/-/loops-0.2.0.tgz","fileCount":7,"integrity":"sha512-yIvZx4Z44wW5nXEySR7rEjErFsRIl9OG8AR8e+LB6GYWgaZEIiJ2d10SEhp7wYT4Bp8iHC/RGc4dOY7p8kVgdw==","signatures":[{"sig":"MEUCIEzl4O1L6iUJ4Nm/nzXXNdJD4dCCxWedoGTB8VV2OtgfAiEA2JP+/SvQh3TKya/NPMVRa+NOKMtsW/07hlOs8nGiXeI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41397},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"6a9842c8213176923a2e07a038f46cd1d185a88d","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.2.0_1706777456385_0.7067737389871629","host":"s3://npm-registry-packages"}},"0.2.1":{"name":"loops","version":"0.2.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.2.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"e5ecaf1f1e4842e491ae5150d1825ec74a4446bb","tarball":"https://registry.npmjs.org/loops/-/loops-0.2.1.tgz","fileCount":7,"integrity":"sha512-rqBfI9vvmtP4OJrUS+7CiZg2NW+nr7oAhUof1/czuzD/ShHPM8om7fdAYf90JFTAEumNrIVL+0cMl7WlTxcCtQ==","signatures":[{"sig":"MEYCIQCwzVPfVwR7DfjAtLtJj/yxc0B/CepkByQtEZHhG26uJgIhANGDq2qqPZIhaeAqq+4J1JPmlXqdlDrmk73weZBGWOfw","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41526},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=16"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"97adf978881d8aba19ffb7dfa47e4264bef9c998","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.2.1_1707204396786_0.6974967583106537","host":"s3://npm-registry-packages"}},"0.3.0":{"name":"loops","version":"0.3.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.3.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"1fa98ac3d0c3c683fa30bd91009b3ad3c7869896","tarball":"https://registry.npmjs.org/loops/-/loops-0.3.0.tgz","fileCount":7,"integrity":"sha512-XBB5dKQHFn+liHRVNNLHTcwYRIyUGccfy3ZM0l7NclRDHf3J0hbRchIPus8q2tqFE5SQYnil959kPtQOLUgRcg==","signatures":[{"sig":"MEUCIQDn9541Mb/nU7hXtalnf8ZTCm1TwnxBHzZb/K99GbXbAwIgKCUb96Rva7qXkGD/r/MvAzx9N7QyJW9d5SrZdHDckdY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41561},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"6c4c163ad3958e25c30267e0501987af03ddefe6","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.3.0_1708591640738_0.3502608638119902","host":"s3://npm-registry-packages"}},"0.4.0":{"name":"loops","version":"0.4.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.4.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"af00222056ebbc366b31327d520003cb1236cead","tarball":"https://registry.npmjs.org/loops/-/loops-0.4.0.tgz","fileCount":7,"integrity":"sha512-mymmNU2XbZz7cRFrRYEBqvyN3+0+CX4SysGbMHwYEs8yenj70OHFggUUHKsgSU+90r2zagdDlRF/ZxxPCZsi8Q==","signatures":[{"sig":"MEUCIAnOz1uZqvpgtoA8pkcsxorUwk5x0bMWk+dun2G4wjNQAiEAo1aRFUjwe/+jEDOFwzMusNqN65d/w+GZ2ZxkQ+s218E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42168},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"1bf1e05594af5ccbcad40d7fb5983f5e3a6f32ec","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.4.0_1711102013574_0.2786228139757003","host":"s3://npm-registry-packages"}},"0.4.1":{"name":"loops","version":"0.4.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@0.4.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"ea4364176d61439efe51265f035b0f7385c70a0c","tarball":"https://registry.npmjs.org/loops/-/loops-0.4.1.tgz","fileCount":7,"integrity":"sha512-ppv4YT+YpZvoYupRSQ+TVSQf8N1vmkiFtS7JJtqkQZGgu1vhU4Ls9jXQaIZQleph4YcCMBwHfHnoQopCZdzLQw==","signatures":[{"sig":"MEUCIQDgIogm4TGuocokWcvA7SK1KNLpeXWclAN92vDxyInxlQIgLIfGNUTH9sBufjR+KRcwgL2NhQhftmw+qZMDxMygJFM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42313},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"598b20767ed7ba3202698bb532af13e96cf47d07","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"deprecated":"Deprecating in favor of v1.0.0","repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_0.4.1_1711641787112_0.08517568729863156","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"loops","version":"1.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@1.0.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"78889c8dea8986caf694a5f5306122f4b0852a5d","tarball":"https://registry.npmjs.org/loops/-/loops-1.0.0.tgz","fileCount":7,"integrity":"sha512-d29ZkiWucQWCSj+ZogLVZDmsFYxbqxhHBbVg/6u/CDnUABWakp/g4Zplki/KcZQJSMYFNkS/deTRcuI/YO8AUw==","signatures":[{"sig":"MEQCIA454QrnxrZCJfy1z55Y8H1HkuZ+aWaMSM3Oy7Hf9TwWAiAZrM8dukMwajOizDrGReZnnbzGiSWqHob5HgTHSBHS1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42313},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"56728a5bd10442d749b5b5f5a853f0cb0e8192ab","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_1.0.0_1711709476305_0.4005678178322145","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"loops","version":"1.0.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@1.0.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"bb652a85afc60b7fb90ba788c9cb04c13d50b5c2","tarball":"https://registry.npmjs.org/loops/-/loops-1.0.1.tgz","fileCount":7,"integrity":"sha512-Nd8vRvYj+BFVLHSQmODsLQ+GFHsS/rcFlwAWdmwtuANMd1aqBpiCFq1snlryXWlgtPilLsjZyz1THaU4b2vtwg==","signatures":[{"sig":"MEUCIGYIv03w7+dSJ6hfpM8pmhs97pt4G4IOhR/y+GwOvcngAiEAhHVMHQlDFTTHFOvtb0QGz0wKqz6FfhuWUvlZum5VdXA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":44265},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"729818e7fc0e3cb6bedeaedefc138847103a79df","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_1.0.1_1711955405702_0.9729010419285964","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"loops","version":"2.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@2.0.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"1bcaa7b1a4f74d2e52d7ec84fee1a9099725eb21","tarball":"https://registry.npmjs.org/loops/-/loops-2.0.0.tgz","fileCount":7,"integrity":"sha512-9kgk4FgGZ8lDlX65AppVJH/Z63mWTjcBCmq8Dw064Q9EIPi6PaNY8XmBfKKBKO+DpcQB4Hnxz4w8g67XSUPUnA==","signatures":[{"sig":"MEUCIDvEOE7ZHvauji5l/MPKuWhmRWe/GGD2No4rggNLY4QVAiEAjUsuP5FMT+N5n4grIKn7lzVT5NeNiZTR/Jjn4LnxQAQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45781},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"dff0d5e2d2e3386ae2fe6fb734ab3097ede5258f","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_2.0.0_1713526163058_0.5698184020500168","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"loops","version":"2.1.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@2.1.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"06ece4977e60a4d2b196829d908a63f04e36d3c3","tarball":"https://registry.npmjs.org/loops/-/loops-2.1.0.tgz","fileCount":7,"integrity":"sha512-Tet61GhpZGYKu52R2eVWmV7bqKlUcB15XM0OTv7hfKrUMH+v/mKxn35PXdc20uXrigoCeh/A1WBZmNXetJ9i5Q==","signatures":[{"sig":"MEQCIFKd2P0CKZzdsnSXE09PIo3ZzueHeK7AXU6hiwLNr7YwAiAQPwUU6TmzsJaNcGN9m+6DuFxPqUsGxdb+lAxo/qt6gQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48592},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"b5ba99cf005fcb4d60bfc8349eab4195b781f8a8","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_2.1.0_1718789577361_0.34738292906111545","host":"s3://npm-registry-packages"}},"2.1.1":{"name":"loops","version":"2.1.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@2.1.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"3abb8d83b39db1d274d1585871caaa9efcaf115b","tarball":"https://registry.npmjs.org/loops/-/loops-2.1.1.tgz","fileCount":7,"integrity":"sha512-+cFs6He1nPGsK5f5/lJbxujEFWcmK4Bt78F4cYem3TaMMBcD906a/WU0rUBb1zp813T5z++E0USr1wKzuTVm7A==","signatures":[{"sig":"MEUCIQDBJLJanDRdG/9DSi7725ijLhTWMo2esl/QaxBG2nt4vwIgCk0ZZOmxfLmFk28TAGQFi6BRQgJHcxnOsnai88fjpy4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50777},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"d45bdcadb4361c8a5ca74a486b6edaaa277063e1","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_2.1.1_1718879568534_0.6658470474419178","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"loops","version":"2.2.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@2.2.0","homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"c3e3aa9acd5c5ea454f8a7cff5622f364973857d","tarball":"https://registry.npmjs.org/loops/-/loops-2.2.0.tgz","fileCount":7,"integrity":"sha512-5sNBW/levY7IkQUO828bFAUES2Av3RiZgxAAcOVM9o5GxG8sEQ7RpthwPwFo1xp68WPWtUK+8RlWlEnPtVci0Q==","signatures":[{"sig":"MEQCIBiitZY7ZGugOcVSFoTuUxc0267ERgSKUh6cQkOAbT8iAiBs0LknKrrAzu49JJiok+HI7VpK9Yx13dhqWSvrufly1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52323},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"9fd06a0a3c1ba75b2c4e69f1bce073e66ad49366","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"deprecated":"Version contains an issue with transactional email parameters.","repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_2.2.0_1719910979350_0.2761435361151696","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"loops","version":"3.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.0.0","homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"eb04c681ca4a352f1275ecc2372510e067cca947","tarball":"https://registry.npmjs.org/loops/-/loops-3.0.0.tgz","fileCount":7,"integrity":"sha512-LVXHkxHqhHujZlgM0IADitGyEo3lT4e8DG/ltAU58Z4Ik0EMoj0wz+vzrtiH7Jv9tGshMQPnpBIDhzcgw5srbg==","signatures":[{"sig":"MEQCICunoxyZsHsLtSzmRG9m6zIM3+La+3D2wSXqn8dW6U2zAiBwtVwAY3BEVWJzSGKWX17Svr0IEm+3rJoHWJuuCHaCqA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52966},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"88328733e533fda382ca57b2b3ba8e7e857c4504","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.0.0_1719924636740_0.16002946141237584","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"loops","version":"3.1.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.1.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"e17a56ba93281d3ade29ba7d11120df14a86a6ba","tarball":"https://registry.npmjs.org/loops/-/loops-3.1.0.tgz","fileCount":7,"integrity":"sha512-B4OdwRm3nmThAsnIIVpcnfwF1Wc11rVlJIEXq+FoHf7Jm5m7OSYc/llwq+jFg8gkGjwuWrlqpS9mTcyCTmI3OQ==","signatures":[{"sig":"MEYCIQDlLPm9Co9icPHjpaDvipsIXK7zmPveRU6fdfcrHCJNxwIhAKTIHgRT6PbYHNzKMqkYyeYGwLRvtbg22y8NGBtJ1CoC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53727},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"02aab915ab475c5d3ee472d5b6ac40d13a5a25ba","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.1.0_1723458455537_0.43049610583871667","host":"s3://npm-registry-packages"}},"3.1.1":{"name":"loops","version":"3.1.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.1.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"ed0ab5b5e4284108920af870a8ebb84d52201596","tarball":"https://registry.npmjs.org/loops/-/loops-3.1.1.tgz","fileCount":7,"integrity":"sha512-CjDBe6+Qshi43+tptr8+J+f+PJdCcoUZ7VvztQEkEXCs5DgHorgFm0MQCTUfcQ2rkMVkWcqFz7kOn2eniFLCLw==","signatures":[{"sig":"MEUCIGm9qfBmQkIXi+0YmjzBXv/MZ3GDEpQ6FynvzvVCbC6XAiEA0JT8mCKnE9ooYTq9PLRbL2lhIYBwAHgUbesenmhgTxA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54519},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"0e9c0384c3afb8b081f3a12b1c54f4967e409760","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.1.1_1723803391637_0.2781386424922836","host":"s3://npm-registry-packages"}},"3.2.0":{"name":"loops","version":"3.2.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.2.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"d0fda82949d4f75b10a32c967ff61dcfe1adaf5f","tarball":"https://registry.npmjs.org/loops/-/loops-3.2.0.tgz","fileCount":7,"integrity":"sha512-A/azP4soJLCUdZeb6s8kmaQwEjUTNVsk0DnHRUiPzbYiNtYZt0IP0MA+6GmrlG96Hix0jLc5qTZRDSN6B2rjAQ==","signatures":[{"sig":"MEUCIQCDSZRXKc2qpxnqodrfnX/Ew6DfprzXAKNyRuIw1WJUHwIgH9MaT4NIHxsH8+uwirdcc2upBwICTwBPHOyFzgU2jDY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":55017},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"9e3eced0094cace0b5a52e2b7fab31e7f50ae6da","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.2.0_1724416384324_0.3525901839906467","host":"s3://npm-registry-packages"}},"3.3.0":{"name":"loops","version":"3.3.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.3.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"485d8767b3d0d1dd096de7f676f2e1311cae1c84","tarball":"https://registry.npmjs.org/loops/-/loops-3.3.0.tgz","fileCount":7,"integrity":"sha512-jAVPzzz0+OH6X+lml1TTY5EkZjYGN0CiC5O8Ibx3okkepKAokXTwqpwcEZt0Np6a5EAQ/raeM59LROIYmeKpXg==","signatures":[{"sig":"MEYCIQDtQyIajWzC5MLYTrGrDqUvHuLKFUGxtwDjMQ8Y6d1TvQIhAJA+iPsJ4x+YpgQ7bLEjPNBXJgAMEMGuig4la9EN8wE/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":56824},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"73f213b9dfaaf2a5a05a0532967c36dfa633cf64","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"9.8.1","description":"## Introduction","directories":{},"_nodeVersion":"18.18.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.3.0_1725869830154_0.6514968967881625","host":"s3://npm-registry-packages"}},"3.4.0":{"name":"loops","version":"3.4.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.4.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"4fa529cf3c459caf3c6ce194a3b781b83a965805","tarball":"https://registry.npmjs.org/loops/-/loops-3.4.0.tgz","fileCount":10,"integrity":"sha512-5iseiVxG43tdNJPHdD6DdCZBnanIA+WWbu0/+q6e+smnFZaT57Gsw1quFtgFXqyRqW0GZzLRGlVaSiEik8QLJw==","signatures":[{"sig":"MEUCIQDD8JusrYedjInaJKFHm4F1e7SR/FAHJLvPic++UkpeWAIgfl2s9TFTCe33IgBgZpNYpk89x9ywp5sNSIxoQ6ZVBWo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":68684},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"8401152263b545c84a863da0fe277a842c5d8919","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"8.19.2","description":"## Introduction","directories":{},"_nodeVersion":"18.12.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.4.0_1730199720260_0.8606891392715619","host":"s3://npm-registry-packages"}},"3.4.1":{"name":"loops","version":"3.4.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@3.4.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"05027b5242948d45b4ffd2a4c875b30cbbe29c88","tarball":"https://registry.npmjs.org/loops/-/loops-3.4.1.tgz","fileCount":10,"integrity":"sha512-7PEdG+Tf9yYL8lOOg4OvnVP38UzKsBGBu+SQH24QHAyVSyWWrQtzZ2HWUCLgPXB7adRkVbSNdANjsRxkjLOsFQ==","signatures":[{"sig":"MEUCIFeqDkdgEP/LeSAX3Stbri/MrBhTAsHTClC/fm8gDrDaAiEA2bZ2lKD7Y8v2LygoN/jcDGURX74upDCB2QXFl25UuDo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":69031},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"1a90154f9086b5bf18b0a7f6e54b2cdf9c84d53c","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"8.19.2","description":"## Introduction","directories":{},"_nodeVersion":"18.12.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_3.4.1_1734517317877_0.39038169257793487","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"loops","version":"4.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@4.0.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"e87a4110b033b2a08ef9ee1f630ac9b7a723bc4f","tarball":"https://registry.npmjs.org/loops/-/loops-4.0.0.tgz","fileCount":10,"integrity":"sha512-fLcdqtkAohpOGaYYnzdxs2eswG5wvfFMLn62csz/l8WOu3WznbvVC2Cvdx8kVVU38GQ+RxPXAt43uqY0hWvHSA==","signatures":[{"sig":"MEUCIFXTYGEbpS9nqBDrrj3YJXiBPOzEN5GrKIbmCsjoyL7DAiEA4H5rbZflnqsXVM+0rxmRWaEuyAspM6Dra3F4h6vHdbw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":76820},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"9c8e2be92cf87a3ce53dbd08f3ed0fe0b288890e","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"8.19.2","description":"## Introduction","directories":{},"_nodeVersion":"18.12.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_4.0.0_1737112580451_0.7749942721846013","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"loops","version":"4.1.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@4.1.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"959312394f9b4df13e80e94533573fbd5ce0c721","tarball":"https://registry.npmjs.org/loops/-/loops-4.1.0.tgz","fileCount":10,"integrity":"sha512-KUiRuRZjqRgq17dQNKODkGQ26NWr8aP6MPMoBzzd0xXUJci8HWbT31Y2GETiVE6cl+I7oXOHStA+dE8+p6oyLA==","signatures":[{"sig":"MEUCIBMREHm8v9MHSCzx5MGDqw17KJ+iWQjziMWCTGw82GoyAiEAriB66w0oTewZI/l3/k2gERAjxcQlF1uU+3X7SoN6EFM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84176},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"901229407eae937e4ea85c35c99c78856aeae94a","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"8.19.2","description":"## Introduction","directories":{},"_nodeVersion":"18.12.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^7.2.0","typescript":"^5.2.2"},"_npmOperationalInternal":{"tmp":"tmp/loops_4.1.0_1741776537289_0.774324959431594","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"loops","version":"5.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@5.0.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"04a17b75180f97a583f0702003d32add395f5fba","tarball":"https://registry.npmjs.org/loops/-/loops-5.0.0.tgz","fileCount":10,"integrity":"sha512-5SsoKOYwsSbxmfVfKPkuHDwu4yc1Olal36DwlECjq9X5LjJ5+B2iJ7k2YAyvBvCm3rb7uQqo0aeD+5bCXnRicQ==","signatures":[{"sig":"MEUCIQDH65ichA/Qfd7qLuIGSPrjpQYTeaq0Y8RXBrUx0aRJfgIgTHuATa8HWZmuts6Cccxn0cjuRudSxAzrmI8ex3gvQ04=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86902},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"c5fa3f4d0eaf877065a19a33de01719ce1666cb0","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"10.8.2","description":"[![](https://img.shields.io/npm/dt/loops?style=social&label=Downloads)](https://www.npmjs.com/package/loops)","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_5.0.0_1745914569749_0.3697836080907444","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"name":"loops","version":"5.0.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@5.0.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"ebad3354166c3f34c7ee1c500a81a3b149ed2074","tarball":"https://registry.npmjs.org/loops/-/loops-5.0.1.tgz","fileCount":10,"integrity":"sha512-xM1c9mnlr8Hr4cHW944TQoK6ApynjinUWOgYZd9/B0/3lwTThq24BQ7+XLjgbFAP5kJzqDTRDQi3t+Diy51Udw==","signatures":[{"sig":"MEUCIQCCIKqFPPR6/jN+XpJVJMtrCja/vytx8nHPK3dhhu3IrgIgXgFx7bxajEYxsHJcccvJWXgkQwLodG9/ZevdGf3XWp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89675},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"c7a71e85befb3e6535a3444041b2e1f570bd9550","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"10.8.2","description":"[![](https://img.shields.io/npm/dt/loops?style=social&label=Downloads)](https://www.npmjs.com/package/loops)","directories":{},"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_5.0.1_1747131762416_0.9722193587152175","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"loops","version":"6.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.0.0","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"8eeb84c7d550a5b69aa3722afd2bc6c62c8eeba4","tarball":"https://registry.npmjs.org/loops/-/loops-6.0.0.tgz","fileCount":10,"integrity":"sha512-ekhzowXogU+8O/uKWydmx3f7wlKLkYBONcGreTHEienZFyEbKphjL0RqcJ1yNIQqwXoDPhocKWsVlyqfQfB7/A==","signatures":[{"sig":"MEYCIQD4RokuPMIMKG/n3j8f/JtpB7eoBMcBv7q8va40WWtPgAIhAJpVrhpLwN5asX6j6cTLAiqo2LTtQpuoA5HskYAsaMxp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92928},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"c9782df059edac9a4f55f400343f43d192b5b85b","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"11.4.1","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"22.15.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.0.0_1755859968432_0.41884543371730265","host":"s3://npm-registry-packages-npm-production"}},"6.0.1":{"name":"loops","version":"6.0.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.0.1","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"2b28feb71a5da92a9efd0cddfb00d6ae9289381e","tarball":"https://registry.npmjs.org/loops/-/loops-6.0.1.tgz","fileCount":10,"integrity":"sha512-ds2CwBA2WuAv50yyHmIpTAzWa4dbVyuSwR9NWtqnlE+78FINILCaxJjDgqNqVYLU1rYioj7mRJNkb6k2/L1EtQ==","signatures":[{"sig":"MEQCIBgWNLUxm3LxzT9SSJXRk5pByFejQs/iRMFsJU7aA8P9AiBg8VzVDH5Vzq1x06R8CBxVvlx9+jaAlbtMN095JTTMaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93532},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"44019d17dac401a8dc0f6365410c4c7220ed5614","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"10.9.3","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.0.1_1760508062369_0.7967577557142917","host":"s3://npm-registry-packages-npm-production"}},"6.1.2":{"name":"loops","version":"6.1.2","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.1.2","maintainers":[{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"e4fc1264f45bf2201bd6872033751a98b18d90bc","tarball":"https://registry.npmjs.org/loops/-/loops-6.1.2.tgz","fileCount":12,"integrity":"sha512-iCDWWYRF+UMidlGBjxaXfQU2ySA3f26ZVq2+Eq1/ssC7pQFjZ6DbqmgosYWvVMVIaLWoXxFbuQWq8I3JCybVfQ==","signatures":[{"sig":"MEUCIQCwM4hW0YkvhLDuTPH6blNSOKy4r4M7oOXWVpn5O+xpywIgd3XQW4A+gXpJwkxXNc/3pdsWLW9AfhCoxPMyKf/QrcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94653},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"a4dcf98597eba093f820ab1172a8bc79917ed7e9","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"10.9.3","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.1.2_1769695036586_0.16568090364479882","host":"s3://npm-registry-packages-npm-production"}},"6.2.0":{"name":"loops","version":"6.2.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.2.0","maintainers":[{"name":"fantactuka","email":"fantactuka@gmail.com"},{"name":"notnmeyer","email":"nmeyer@gmail.com"},{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"54079e5d483c966a7af700c0543b83a0fdd0e691","tarball":"https://registry.npmjs.org/loops/-/loops-6.2.0.tgz","fileCount":10,"integrity":"sha512-POMOdaktMpF8VSeKnTjdh9A1a02MFDOL3fyl6/VVxROSltVzgkRB9CSKVspgQ6cLVFzm/Wd27opNN3wHs0YKaw==","signatures":[{"sig":"MEUCIQCwtOqoQ2Cc924HgI2aJSY78MqH6BHmP+T/xZDus+IgrAIgPk+1bBAXoQYGmk05Js3IEJw32zAtNbrSC+q1zUkxLlE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94645},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"36eca3828c72b27f5040f455dc75f88ca6b32799","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"fantactuka","email":"fantactuka@gmail.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"11.6.1","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^7.2.0","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.2.0_1770631362340_0.7149197743109703","host":"s3://npm-registry-packages-npm-production"}},"6.2.1":{"name":"loops","version":"6.2.1","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.2.1","maintainers":[{"name":"fantactuka","email":"fantactuka@gmail.com"},{"name":"notnmeyer","email":"nmeyer@gmail.com"},{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"a8542ca36e5aeb0c1a6edf8d70b9c1bfe0a6f452","tarball":"https://registry.npmjs.org/loops/-/loops-6.2.1.tgz","fileCount":10,"integrity":"sha512-UF321fEmlX7KeGlbjxXnL49hk8gVyMqHB2sbeEiEbHyacHYJN20NRh0f2FQSvW2r9X9/xpKBwO5gFYqy5ztauQ==","signatures":[{"sig":"MEUCIQD4bGdMIz6xKRTOmKTaCxQLQISKKCzuK2NgBJG16sRQ2AIgEqMv5O0iwxvO/MCrNvi0gf7QktWO2JjRaGjefufPWQA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94645},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"12cec08c631a1ff825b9b635b126015b049a385a","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"10.9.3","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.5.1","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.2.1_1771224470027_0.47579653680952694","host":"s3://npm-registry-packages-npm-production"}},"6.3.0":{"name":"loops","version":"6.3.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","_id":"loops@6.3.0","maintainers":[{"name":"fantactuka","email":"fantactuka@gmail.com"},{"name":"notnmeyer","email":"nmeyer@gmail.com"},{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"homepage":"https://github.com/Loops-so/loops-js#readme","bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"dist":{"shasum":"83c0e6781a0a2a7d74d98d82b4e974c34189c36a","tarball":"https://registry.npmjs.org/loops/-/loops-6.3.0.tgz","fileCount":10,"integrity":"sha512-T5oc66bM90LS+yHxTv9WoYtsadJC94QIax25Avl/XCq/DTonqtNd3g1nmOfuAqDKhkZzXE8GuXmSRvSFIgq0Xg==","signatures":[{"sig":"MEYCIQCR7TOdtR71/1rAI/vRGKHXdfptV/IWen6cFermlKpI9AIhAM7d17S9PU+35iOj03AeqPfOqyT/W/YhLJP0rc+wmUfW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105132},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","engines":{"node":">=18"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"gitHead":"41bc579ef4e303a143f908e4bbda4709cf86505f","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"repository":{"url":"git+https://github.com/Loops-so/loops-js.git","type":"git"},"_npmVersion":"11.11.1","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.5.1","ts-jest":"^29.1.2","typescript":"^5.2.2","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/loops_6.3.0_1775738902108_0.7935985101993639","host":"s3://npm-registry-packages-npm-production"}},"7.0.0":{"name":"loops","version":"7.0.0","author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","main":"./dist/index.cjs","module":"./dist/index.esm.js","exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.esm.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"repository":{"type":"git","url":"git+https://github.com/Loops-so/loops-js.git"},"bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"type":"module","devDependencies":{"tsup":"^8.5.1","typescript":"^5.2.2","jest":"^29.7.0","@types/jest":"^29.5.12","ts-jest":"^29.1.2"},"engines":{"node":">=18"},"gitHead":"74d30b0329069cbccb1ba9adc9e5efa4dd696657","types":"./dist/index.d.ts","_id":"loops@7.0.0","description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","homepage":"https://github.com/Loops-so/loops-js#readme","_nodeVersion":"24.14.0","_npmVersion":"11.11.1","dist":{"integrity":"sha512-TNbnJndtZwE7Esmc6+xKy3xWZOqzq8xQ5IqvZ+CBS9MOjqcx8qgyfsWoW4F7oNZGkX7uS1+RDxvUAswwD2hR5Q==","shasum":"8f2d4897852c7a682d4cfb66ed3466bb7f671869","tarball":"https://registry.npmjs.org/loops/-/loops-7.0.0.tgz","fileCount":10,"unpackedSize":242151,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDjIv4ao61D/oLtFo08LL8TMM5YwzqDPX/V7oKWSsVG+wIhAPAOtjBv0e6xK7d+FP/VL98sac+GieN98qzBhEQaWUqH"}]},"_npmUser":{"name":"danrowden","email":"hello@danrowden.com"},"directories":{},"maintainers":[{"name":"fantactuka","email":"fantactuka@gmail.com"},{"name":"notnmeyer","email":"nmeyer@gmail.com"},{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loops_7.0.0_1782302352670_0.5455996421440359"},"_hasShrinkwrap":false}},"time":{"created":"2011-11-04T20:19:53.781Z","modified":"2026-06-24T11:59:12.910Z","1.0.9":"2011-11-04T20:19:55.891Z","0.1.0":"2023-10-30T08:03:11.898Z","0.1.1":"2023-11-01T07:46:36.713Z","0.1.2":"2023-12-06T18:36:20.541Z","0.1.3":"2023-12-08T08:40:37.009Z","0.1.4":"2024-01-25T13:40:06.056Z","0.1.5":"2024-01-26T12:44:18.569Z","0.2.0":"2024-02-01T08:50:56.607Z","0.2.1":"2024-02-06T07:26:36.985Z","0.3.0":"2024-02-22T08:47:20.901Z","0.4.0":"2024-03-22T10:06:53.711Z","0.4.1":"2024-03-28T16:03:07.330Z","1.0.0":"2024-03-29T10:51:16.472Z","1.0.1":"2024-04-01T07:10:05.870Z","2.0.0":"2024-04-19T11:29:23.229Z","2.1.0":"2024-06-19T09:32:57.506Z","2.1.1":"2024-06-20T10:32:48.719Z","2.2.0":"2024-07-02T09:02:59.578Z","3.0.0":"2024-07-02T12:50:36.943Z","3.1.0":"2024-08-12T10:27:35.700Z","3.1.1":"2024-08-16T10:16:31.772Z","3.2.0":"2024-08-23T12:33:04.507Z","3.3.0":"2024-09-09T08:17:10.307Z","3.4.0":"2024-10-29T11:02:00.465Z","3.4.1":"2024-12-18T10:21:58.043Z","4.0.0":"2025-01-17T11:16:20.618Z","4.1.0":"2025-03-12T10:48:57.547Z","5.0.0":"2025-04-29T08:16:09.911Z","5.0.1":"2025-05-13T10:22:42.627Z","6.0.0":"2025-08-22T10:52:48.637Z","6.0.1":"2025-10-15T06:01:02.575Z","6.1.2":"2026-01-29T13:57:16.734Z","6.2.0":"2026-02-09T10:02:42.503Z","6.2.1":"2026-02-16T06:47:50.183Z","6.3.0":"2026-04-09T12:48:22.247Z","7.0.0":"2026-06-24T11:59:12.804Z"},"bugs":{"url":"https://github.com/Loops-so/loops-js/issues"},"author":{"name":"Dan Rowden","email":"dan@loops.so"},"license":"MIT","homepage":"https://github.com/Loops-so/loops-js#readme","repository":{"type":"git","url":"git+https://github.com/Loops-so/loops-js.git"},"description":"This is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.","maintainers":[{"name":"fantactuka","email":"fantactuka@gmail.com"},{"name":"notnmeyer","email":"nmeyer@gmail.com"},{"name":"adamloops","email":"adam@loops.so"},{"name":"danrowden","email":"hello@danrowden.com"}],"readme":"# Loops JavaScript/TypeScript SDK\n\n## Introduction\n\nThis is the official JavaScript SDK for [Loops](https://loops.so), with full TypeScript support.\n\nIt lets you easily integrate with the Loops API in any JavaScript project.\n\n## Installation\n\nYou can install the package [from npm](https://www.npmjs.com/package/loops):\n\n```bash\nnpm install loops\n```\n\nMinimum Node version required: 18.0.0.\n\nYou will need a Loops API key to use the package.\n\nIn your Loops account, go to the [API Settings page](https://app.loops.so/settings?page=api) and click \"Generate key\".\n\nCopy this key and save it in your application code (for example as `LOOPS_API_KEY` in an `.env` file).\n\nSee the API documentation to learn more about [rate limiting](https://loops.so/docs/api-reference#rate-limiting) and [error handling](https://loops.so/docs/api-reference#debugging).\n\n## Usage\n\n```javascript\nimport { LoopsClient, APIError } from \"loops\";\n\nconst loops = new LoopsClient(process.env.LOOPS_API_KEY);\n\ntry {\n  const resp = await loops.createContact(\"email@provider.com\");\n  // resp.success and resp.id available when successful\n} catch (error) {\n  if (error instanceof APIError) {\n    // JSON returned by the API is in error.json and the HTTP code is in error.statusCode\n    // error.json may be null if the response was not valid JSON (e.g., from a load balancer)\n    // In that case, the raw response text is available in error.rawBody\n    console.log(error.json);\n    console.log(error.statusCode);\n    console.log(error.rawBody);\n  } else {\n    // Non-API errors\n  }\n}\n```\n\n## Handling rate limits\n\nIf you import `RateLimitExceededError` you can check for rate limit issues with your requests.\n\nYou can access details about the rate limits from the `limit` and `remaining` attributes.\n\n```javascript\nimport { LoopsClient, APIError, RateLimitExceededError } from \"loops\";\n\nconst loops = new LoopsClient(process.env.LOOPS_API_KEY);\n\ntry {\n  const resp = await loops.createContact(\"email@provider.com\");\n} catch (error) {\n  if (error instanceof RateLimitExceededError) {\n    console.log(`Rate limit exceeded (${error.limit} per second)`);\n    // Code here to re-try this request\n  } else {\n    // Handle other errors\n  }\n}\n```\n\n## Default contact properties\n\nEach contact in Loops has a set of default properties. These will always be returned in API results.\n\n- `id`\n- `email`\n- `firstName`\n- `lastName`\n- `source`\n- `subscribed`\n- `userGroup`\n- `userId`\n- `optInStatus`\n\n## Custom contact properties\n\nYou can use custom contact properties in API calls. Please make sure to [add custom properties](https://loops.so/docs/contacts/properties#custom-contact-properties) in your Loops account before using them with the SDK.\n\n## Methods\n\n- [testApiKey()](#testapikey)\n- [createContact()](#createcontact)\n- [updateContact()](#updatecontact)\n- [findContact()](#findcontact)\n- [deleteContact()](#deletecontact)\n- [checkContactSuppression()](#checkcontactsuppression)\n- [removeContactSuppression()](#removecontactsuppression)\n- [createContactProperty()](#createcontactproperty)\n- [listContactProperties()](#listcontactproperties)\n- [listMailingLists()](#listmailinglists)\n- [sendEvent()](#sendevent)\n- [sendTransactionalEmail()](#sendtransactionalemail)\n- [listTransactionalEmails()](#listtransactionalemails)\n- [getTransactionalEmail()](#gettransactionalemail)\n- [createTransactionalEmail()](#createtransactionalemail)\n- [updateTransactionalEmail()](#updatetransactionalemail)\n- [ensureTransactionalEmailDraft()](#ensuretransactionalemaildraft)\n- [publishTransactionalEmail()](#publishtransactionalemail)\n- [listTransactionalGroups()](#listtransactionalgroups)\n- [createTransactionalGroup()](#createtransactionalgroup)\n- [getTransactionalGroup()](#gettransactionalgroup)\n- [updateTransactionalGroup()](#updatetransactionalgroup)\n- [listDedicatedSendingIps()](#listdedicatedsendingips)\n- [listAudienceSegments()](#listaudiencesegments)\n- [getAudienceSegment()](#getaudiencesegment)\n- [listThemes()](#listthemes)\n- [getTheme()](#gettheme)\n- [listComponents()](#listcomponents)\n- [getComponent()](#getcomponent)\n- [listCampaigns()](#listcampaigns)\n- [createCampaign()](#createcampaign)\n- [getCampaign()](#getcampaign)\n- [updateCampaign()](#updatecampaign)\n- [listCampaignGroups()](#listcampaigngroups)\n- [createCampaignGroup()](#createcampaigngroup)\n- [getCampaignGroup()](#getcampaigngroup)\n- [updateCampaignGroup()](#updatecampaigngroup)\n- [getEmailMessage()](#getemailmessage)\n- [updateEmailMessage()](#updateemailmessage)\n- [sendEmailMessagePreview()](#sendemailmessagepreview)\n- [listWorkflows()](#listworkflows)\n- [getWorkflow()](#getworkflow)\n- [getWorkflowNode()](#getworkflownode)\n- [createUpload()](#createupload)\n- [completeUpload()](#completeupload)\n\n---\n\n### testApiKey()\n\nTest that an API key is valid.\n\n[API Reference](https://loops.so/docs/api-reference/api-key)\n\n#### Parameters\n\nNone\n\n#### Example\n\n```javascript\nconst resp = await loops.testApiKey();\n```\n\n#### Response\n\n```json\n{\n  \"success\": true,\n  \"teamName\": \"My team\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 401 Unauthorized\n{\n  \"error\": \"Invalid API key\"\n}\n```\n\n---\n\n### createContact()\n\nCreate a new contact.\n\n[API Reference](https://loops.so/docs/api-reference/create-contact)\n\n#### Parameters\n\n| Name           | Type   | Required | Notes                                                                                                                                                                                                                                                                                                                                                                                                                |\n| -------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `email`        | string | Yes      | If a contact already exists with this email address, an error response will be returned.                                                                                                                                                                                                                                                                                                                             |\n| `properties`   | object | No       | An object containing default and any custom properties for your contact.<br />Please [add custom properties](https://loops.so/docs/contacts/properties#custom-contact-properties) in your Loops account before using them with the SDK.<br />Values can be of type `string`, `number`, `null` (to reset a value), `boolean` or `date` ([see allowed date formats](https://loops.so/docs/contacts/properties#dates)). |\n| `mailingLists` | object | No       | An object of mailing list IDs and boolean subscription statuses.                                                                                                                                                                                                                                                                                                                                                     |\n\n#### Examples\n\n```javascript\nconst resp = await loops.createContact({ email: \"hello@gmail.com\" });\n\nconst contactProperties = {\n  firstName: \"Bob\" /* Default property */,\n  favoriteColor: \"Red\" /* Custom property */,\n};\nconst mailingLists = {\n  cm06f5v0e45nf0ml5754o9cix: true /* Subscribe */,\n  cm16k73gq014h0mmj5b6jdi9r: false /* Unsubscribe */,\n};\nconst resp = await loops.createContact({\n  email: \"hello@gmail.com\",\n  properties: contactProperties,\n  mailingLists,\n});\n```\n\n#### Response\n\n```json\n{\n  \"success\": true,\n  \"id\": \"clw9h3y5a014yl70k9m2n4p8q\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n---\n\n### updateContact()\n\nUpdate a contact. This method will create a contact if one doesn't already exist.\n\nNote: To update a contact's email address, the contact requires a `userId` value. Then you can make a request with their `userId` and an updated email address.\n\n[API Reference](https://loops.so/docs/api-reference/update-contact)\n\n#### Parameters\n\n| Name           | Type   | Required | Notes                                                                                                                                                                                                                                                                                                                                                                                                                |\n| -------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `email`        | string | No       | The email address of the contact to update. If there is no contact with this email address, a new contact will be created using the email and properties in this request. Required if `userId` is not present.                                                                                                                                                                                                       |\n| `userId`       | string | No       | The contact's unique user ID. If you use `userId` without `email`, this value must have already been added to your contact in Loops. Required if `email` is not present.                                                                                                                                                                                                                                             |\n| `properties`   | object | No       | An object containing default and any custom properties for your contact.<br />Please [add custom properties](https://loops.so/docs/contacts/properties#custom-contact-properties) in your Loops account before using them with the SDK.<br />Values can be of type `string`, `number`, `null` (to reset a value), `boolean` or `date` ([see allowed date formats](https://loops.so/docs/contacts/properties#dates)). |\n| `mailingLists` | object | No       | An object of mailing list IDs and boolean subscription statuses.                                                                                                                                                                                                                                                                                                                                                     |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateContact({\n  email: \"hello@gmail.com\",\n  properties: {\n    firstName: \"Bob\" /* Default property */,\n    favoriteColor: \"Blue\" /* Custom property */,\n  },\n});\n\n/* Updating a contact's email address using userId */\nconst resp = await loops.updateContact({\n  userId: \"1234\",\n  email: \"newemail@gmail.com\",\n});\n\n/* Subscribe a contact to a mailing list */\nconst resp = await loops.updateContact({\n  email: \"hello@gmail.com\",\n  mailingLists: {\n    cm06f5v0e45nf0ml5754o9cix: true,\n  },\n});\n```\n\n#### Response\n\n```json\n{\n  \"success\": true,\n  \"id\": \"clw9h3y5a014yl70k9m2n4p8q\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n---\n\n### findContact()\n\nFind a contact.\n\n[API Reference](https://loops.so/docs/api-reference/find-contact)\n\n#### Parameters\n\nYou must use one parameter in the request.\n\n| Name     | Type   | Required | Notes |\n| -------- | ------ | -------- | ----- |\n| `email`  | string | No       |       |\n| `userId` | string | No       |       |\n\n#### Examples\n\n```javascript\nconst resp = await loops.findContact({ email: \"hello@gmail.com\" });\n\nconst resp = await loops.findContact({ userId: \"12345\" });\n```\n\n#### Response\n\nThis method will return a list containing a single contact object, which will include all default properties and any custom properties.\n\nIf no contact is found, an empty list will be returned.\n\n```json\n[\n  {\n    \"id\": \"cll6b3i8901a9jx0oyktl2m4u\",\n    \"email\": \"hello@gmail.com\",\n    \"firstName\": \"Bob\",\n    \"lastName\": null,\n    \"source\": \"API\",\n    \"subscribed\": true,\n    \"userGroup\": \"\",\n    \"userId\": \"12345\",\n    \"mailingLists\": {\n      \"cm06f5v0e45nf0ml5754o9cix\": true\n    },\n    \"optInStatus\": null,\n    \"favoriteColor\": \"Blue\" /* Custom property */\n  }\n]\n```\n\n---\n\n### deleteContact()\n\nDelete a contact, either by email address or `userId`.\n\n[API Reference](https://loops.so/docs/api-reference/delete-contact)\n\n#### Parameters\n\nYou must use one parameter in the request.\n\n| Name     | Type   | Required | Notes |\n| -------- | ------ | -------- | ----- |\n| `email`  | string | No       |       |\n| `userId` | string | No       |       |\n\n#### Example\n\n```javascript\nconst resp = await loops.deleteContact({ email: \"hello@gmail.com\" });\n\nconst resp = await loops.deleteContact({ userId: \"12345\" });\n```\n\n#### Response\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Contact deleted.\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n```json\nHTTP 404 Not Found\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n---\n\n### checkContactSuppression()\n\nCheck whether a contact is suppressed, either by email address or `userId`.\n\n[API Reference](https://loops.so/docs/api-reference/check-contact-suppression)\n\n#### Parameters\n\nYou must use one parameter in the request.\n\n| Name     | Type   | Required | Notes |\n| -------- | ------ | -------- | ----- |\n| `email`  | string | No       |       |\n| `userId` | string | No       |       |\n\n#### Example\n\n```javascript\nconst resp = await loops.checkContactSuppression({ email: \"hello@gmail.com\" });\n\nconst resp = await loops.checkContactSuppression({ userId: \"12345\" });\n```\n\n#### Response\n\n```json\n{\n  \"contact\": {\n    \"id\": \"cll6b3i8901a9jx0oyktl2m4u\",\n    \"email\": \"adam@loops.so\",\n    \"userId\": null\n  },\n  \"isSuppressed\": true,\n  \"removalQuota\": {\n    \"limit\": 100,\n    \"remaining\": 4\n  }\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An email or userId is required.\"\n}\n```\n\n```json\nHTTP 404 Not Found\n{\n  \"success\": false,\n  \"message\": \"This contact was not found.\"\n}\n```\n\n---\n\n### removeContactSuppression()\n\nRemove suppression for a contact, either by email address or `userId`.\n\n[API Reference](https://loops.so/docs/api-reference/remove-contact-suppression)\n\n#### Parameters\n\nYou must use one parameter in the request.\n\n| Name     | Type   | Required | Notes |\n| -------- | ------ | -------- | ----- |\n| `email`  | string | No       |       |\n| `userId` | string | No       |       |\n\n#### Example\n\n```javascript\nconst resp = await loops.removeContactSuppression({ email: \"hello@gmail.com\" });\n\nconst resp = await loops.removeContactSuppression({ userId: \"12345\" });\n```\n\n#### Response\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Email removed from suppression list.\",\n  \"removalQuota\": {\n    \"limit\": 100,\n    \"remaining\": 4\n  }\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"This contact is not suppressed.\"\n}\n```\n\n```json\nHTTP 404 Not Found\n{\n  \"success\": false,\n  \"message\": \"This contact was not found.\"\n}\n```\n\n---\n\n### createContactProperty()\n\nCreate a new contact property.\n\n[API Reference](https://loops.so/docs/api-reference/create-contact-property)\n\n#### Parameters\n\n| Name   | Type   | Required | Notes                                                                                  |\n| ------ | ------ | -------- | -------------------------------------------------------------------------------------- |\n| `name` | string | Yes      | The name of the property. Should be in camelCase, like `planName` or `favouriteColor`. |\n| `type` | string | Yes      | The property's value type.<br />Can be one of `string`, `number`, `boolean` or `date`. |\n\n#### Examples\n\n```javascript\nconst resp = await loops.createContactProperty(\"planName\", \"string\");\n```\n\n#### Response\n\n```json\n{\n  \"success\": true\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n---\n\n### listContactProperties()\n\nGet a list of your account's contact properties.\n\n[API Reference](https://loops.so/docs/api-reference/list-contact-properties)\n\n#### Parameters\n\n| Name   | Type   | Required | Notes                                                           |\n| ------ | ------ | -------- | --------------------------------------------------------------- |\n| `list` | string | No       | Use \"custom\" to retrieve only your account's custom properties. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listContactProperties();\n\nconst resp = await loops.listContactProperties(\"custom\");\n```\n\n#### Response\n\nThis method will return a list of contact property objects containing `key`, `label` and `type` attributes.\n\n```json\n[\n  {\n    \"key\": \"firstName\",\n    \"label\": \"First Name\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"lastName\",\n    \"label\": \"Last Name\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"email\",\n    \"label\": \"Email\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"notes\",\n    \"label\": \"Notes\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"source\",\n    \"label\": \"Source\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"userGroup\",\n    \"label\": \"User Group\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"userId\",\n    \"label\": \"User Id\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"subscribed\",\n    \"label\": \"Subscribed\",\n    \"type\": \"boolean\"\n  },\n  {\n    \"key\": \"createdAt\",\n    \"label\": \"Created At\",\n    \"type\": \"date\"\n  },\n  {\n    \"key\": \"favoriteColor\",\n    \"label\": \"Favorite Color\",\n    \"type\": \"string\"\n  },\n  {\n    \"key\": \"plan\",\n    \"label\": \"Plan\",\n    \"type\": \"string\"\n  }\n]\n```\n\n---\n\n### listMailingLists()\n\nGet a list of your account's mailing lists. [Read more about mailing lists](https://loops.so/docs/contacts/mailing-lists)\n\n[API Reference](https://loops.so/docs/api-reference/list-mailing-lists)\n\n#### Parameters\n\nNone\n\n#### Example\n\n```javascript\nconst resp = await loops.listMailingLists();\n```\n\n#### Response\n\nThis method will return a list of mailing list objects containing `id`, `name`, `description` and `isPublic` attributes.\n\nIf your account has no mailing lists, an empty list will be returned.\n\n```json\n[\n  {\n    \"id\": \"cm06f5v0e45nf0ml5754o9cix\",\n    \"name\": \"Main list\",\n    \"description\": \"All customers.\",\n    \"isPublic\": true\n  },\n  {\n    \"id\": \"cm16k73gq014h0mmj5b6jdi9r\",\n    \"name\": \"Investors\",\n    \"description\": null,\n    \"isPublic\": false\n  }\n]\n```\n\n---\n\n### sendEvent()\n\nSend an event to trigger an email in Loops. [Read more about events](https://loops.so/docs/events)\n\n[API Reference](https://loops.so/docs/api-reference/send-event)\n\n#### Parameters\n\n| Name                | Type   | Required | Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n| ------------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `email`             | string | No       | The contact's email address. Required if `userId` is not present.                                                                                                                                                                                                                                                                                                                                                                                              |\n| `userId`            | string | No       | The contact's unique user ID. If you use `userId` without `email`, this value must have already been added to your contact in Loops. Required if `email` is not present.                                                                                                                                                                                                                                                                                       |\n| `eventName`         | string | Yes      |                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n| `contactProperties` | object | No       | An object containing contact properties, which will be updated or added to the contact when the event is received.<br />Please [add custom properties](https://loops.so/docs/contacts/properties#custom-contact-properties) in your Loops account before using them with the SDK.<br />Values can be of type `string`, `number`, `null` (to reset a value), `boolean` or `date` ([see allowed date formats](https://loops.so/docs/contacts/properties#dates)). |\n| `eventProperties`   | object | No       | An object containing event properties, which will be made available in emails that are triggered by this event.<br />Values can be of type `string`, `number`, `boolean` or `date` ([see allowed date formats](https://loops.so/docs/events/properties#important-information-about-event-properties)).                                                                                                                                                         |\n| `mailingLists`      | object | No       | An object of mailing list IDs and boolean subscription statuses.                                                                                                                                                                                                                                                                                                                                                                                               |\n| `headers`           | object | No       | Additional headers to send with the request.                                                                                                                                                                                                                                                                                                                                                                                                                   |\n\n#### Examples\n\n```javascript\nconst resp = await loops.sendEvent({\n  email: \"hello@gmail.com\",\n  eventName: \"signup\",\n});\n\nconst resp = await loops.sendEvent({\n  email: \"hello@gmail.com\",\n  eventName: \"signup\",\n  eventProperties: {\n    username: \"user1234\",\n    signupDate: \"2024-03-21T10:09:23Z\",\n  },\n  mailingLists: {\n    cm06f5v0e45nf0ml5754o9cix: true,\n    cm16k73gq014h0mmj5b6jdi9r: false,\n  },\n});\n\n// In this case with both email and userId present, the system will look for a contact with either a\n//  matching `email` or `userId` value.\n// If a contact is found for one of the values (e.g. `email`), the other value (e.g. `userId`) will be updated.\n// If a contact is not found, a new contact will be created using both `email` and `userId` values.\n// Any values added in `contactProperties` will also be updated on the contact.\nconst resp = await loops.sendEvent({\n  userId: \"1234567890\",\n  email: \"hello@gmail.com\",\n  eventName: \"signup\",\n  contactProperties: {\n    firstName: \"Bob\",\n    plan: \"pro\",\n  },\n});\n\n// Example with Idempotency-Key header\nconst resp = await loops.sendEvent({\n  email: \"hello@gmail.com\",\n  eventName: \"signup\",\n  headers: {\n    \"Idempotency-Key\": \"550e8400-e29b-41d4-a716-446655440000\",\n  },\n});\n```\n\n#### Response\n\n```json\n{\n  \"success\": true\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"message\": \"An error message here.\"\n}\n```\n\n---\n\n### sendTransactionalEmail()\n\nSend a transactional email to a contact. [Learn about sending transactional email](https://loops.so/docs/transactional/guide)\n\n[API Reference](https://loops.so/docs/api-reference/send-transactional-email)\n\n#### Parameters\n\n| Name                        | Type     | Required | Notes                                                                                                                                                                                                         |\n| --------------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `transactionalId`           | string   | Yes      | The ID of the transactional email to send.                                                                                                                                                                    |\n| `email`                     | string   | Yes      | The email address of the recipient.                                                                                                                                                                           |\n| `addToAudience`             | boolean  | No       | If `true`, a contact will be created in your audience using the `email` value (if a matching contact doesn’t already exist).                                                                                  |\n| `dataVariables`             | object   | No       | An object containing data as defined by the data variables added to the transactional email template.<br />Values can be of type `string`, `number`, or an array of objects with `string` or `number` values. |\n| `attachments`               | object[] | No       | A list of attachments objects.<br />**Please note**: Attachments need to be enabled on your account before using them with the API. [Read more](https://loops.so/docs/transactional/attachments)              |\n| `attachments[].filename`    | string   | No       | The name of the file, shown in email clients.                                                                                                                                                                 |\n| `attachments[].contentType` | string   | No       | The MIME type of the file.                                                                                                                                                                                    |\n| `attachments[].data`        | string   | No       | The base64-encoded content of the file.                                                                                                                                                                       |\n| `headers`                   | object   | No       | Additional headers to send with the request.                                                                                                                                                                  |\n\n#### Examples\n\n```javascript\nconst resp = await loops.sendTransactionalEmail({\n  transactionalId: \"clfq6dinn000yl70fgwwyp82l\",\n  email: \"hello@gmail.com\",\n  dataVariables: {\n    loginUrl: \"https://myapp.com/login/\",\n  },\n});\n\n// Example with Idempotency-Key header\nconst resp = await loops.sendTransactionalEmail({\n  transactionalId: \"clfq6dinn000yl70fgwwyp82l\",\n  email: \"hello@gmail.com\",\n  dataVariables: {\n    loginUrl: \"https://myapp.com/login/\",\n  },\n  headers: {\n    \"Idempotency-Key\": \"550e8400-e29b-41d4-a716-446655440000\",\n  },\n});\n\n// Please contact us to enable attachments on your account.\nconst resp = await loops.sendTransactionalEmail({\n  transactionalId: \"clfq6dinn000yl70fgwwyp82l\",\n  email: \"hello@gmail.com\",\n  dataVariables: {\n    loginUrl: \"https://myapp.com/login/\",\n  },\n  attachments: [\n    {\n      filename: \"presentation.pdf\",\n      contentType: \"application/pdf\",\n      data: \"JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPD...\",\n    },\n  ],\n});\n```\n\n#### Response\n\n```json\n{\n  \"success\": true\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"path\": \"dataVariables\",\n  \"message\": \"There are required fields for this email. You need to include a 'dataVariables' object with the required fields.\"\n}\n```\n\n```json\nHTTP 400 Bad Request\n{\n  \"success\": false,\n  \"error\": {\n    \"path\": \"dataVariables\",\n    \"message\": \"Missing required fields: login_url\"\n  },\n  \"transactionalId\": \"clfq6dinn000yl70fgwwyp82l\"\n}\n```\n\n---\n\n### listTransactionalEmails()\n\nGet a paginated list of transactional emails, most recently created first.\n\n[API Reference](https://loops.so/docs/api-reference/list-transactional-emails)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listTransactionalEmails();\n\nconst resp = await loops.listTransactionalEmails({ perPage: 15 });\n```\n\n#### Response\n\n```json\n{\n  \"pagination\": {\n    \"totalResults\": 23,\n    \"returnedResults\": 20,\n    \"perPage\": 20,\n    \"totalPages\": 2,\n    \"nextCursor\": \"clyo0q4wo01p59fsecyxqsh38\",\n    \"nextPage\": \"https://app.loops.so/api/v1/transactional-emails?cursor=clyo0q4wo01p59fsecyxqsh38&perPage=20\"\n  },\n  \"data\": [\n    {\n      \"id\": \"clfn0k1yg001imo0fdeqg30i8\",\n      \"name\": \"Sign up confirmation\",\n      \"draftEmailMessageId\": null,\n      \"publishedEmailMessageId\": \"clm9x3o5q002yl70a8b3c4d5e\",\n      \"transactionalGroupId\": null,\n      \"createdAt\": \"2023-11-06T17:48:07.249Z\",\n      \"updatedAt\": \"2023-11-06T17:48:07.249Z\",\n      \"dataVariables\": []\n    },\n    {\n      \"id\": \"cll42l54f20i1la0lfooe3z12\",\n      \"name\": \"Password reset\",\n      \"draftEmailMessageId\": \"clm8k2n4p000yl70f6g7h8i9j\",\n      \"publishedEmailMessageId\": \"clm8k2n4p001yl70k1l2m3n4o\",\n      \"transactionalGroupId\": \"clq3b7s9u006yl70p5q6r7s8t\",\n      \"createdAt\": \"2025-02-02T02:56:28.845Z\",\n      \"updatedAt\": \"2025-02-02T02:56:28.845Z\",\n      \"dataVariables\": [\n        \"confirmationUrl\"\n      ]\n    },\n    ...\n  ]\n}\n```\n\n---\n\n### getTransactionalEmail()\n\nRetrieve a single transactional email by ID.\n\n[API Reference](https://loops.so/docs/api-reference/get-transactional-email)\n\n#### Parameters\n\n| Name                  | Type   | Required | Notes                                |\n| --------------------- | ------ | -------- | ------------------------------------ |\n| `transactionalId`                  | string | Yes      | The ID of the transactional email.   |\n\n#### Example\n\n```javascript\nconst resp = await loops.getTransactionalEmail(\"clfn0k1yg001imo0fdeqg30i8\");\n```\n\n---\n\n### createTransactionalEmail()\n\nCreate a new transactional email. An empty draft email message is created automatically.\n\n[API Reference](https://loops.so/docs/api-reference/create-transactional-email)\n\n#### Parameters\n\n| Name                  | Type   | Required | Notes                                                                                    |\n| --------------------- | ------ | -------- | ---------------------------------------------------------------------------------------- |\n| `name`                | string | Yes      | The name of the transactional email.                                                     |\n| `transactionalGroupId`| string | No       | The ID of the group to add this transactional email to. Defaults to the team's default group. |\n\n#### Example\n\n```javascript\nconst resp = await loops.createTransactionalEmail({ name: \"Welcome email\" });\n```\n\n---\n\n### updateTransactionalEmail()\n\nUpdate a transactional email by ID. At least one field is required.\n\n[API Reference](https://loops.so/docs/api-reference/update-transactional-email)\n\n#### Parameters\n\n| Name                  | Type   | Required | Notes                                                    |\n| --------------------- | ------ | -------- | -------------------------------------------------------- |\n| `transactionalId`                  | string | Yes      | The ID of the transactional email.                       |\n| `name`                | string | No       | The name of the transactional email.                     |\n| `transactionalGroupId`| string | No       | The ID of the group to move this transactional email to. |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateTransactionalEmail(\"clfn0k1yg001imo0fdeqg30i8\", {\n  name: \"Updated name\",\n});\n\nconst resp = await loops.updateTransactionalEmail(\"clfn0k1yg001imo0fdeqg30i8\", {\n  transactionalGroupId: \"clq3b7s9u006yl70p5q6r7s8t\",\n});\n```\n\n---\n\n### ensureTransactionalEmailDraft()\n\nEnsure a transactional email has a draft email message. Use [`updateEmailMessage()`](#updateemailmessage) to edit the draft content.\n\n[API Reference](https://loops.so/docs/api-reference/ensure-transactional-email-draft)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                              |\n| ---- | ------ | -------- | ---------------------------------- |\n| `transactionalId` | string | Yes      | The ID of the transactional email. |\n\n#### Example\n\n```javascript\nconst resp = await loops.ensureTransactionalEmailDraft(\"clfn0k1yg001imo0fdeqg30i8\");\n```\n\n---\n\n### publishTransactionalEmail()\n\nPublish a transactional email's current draft.\n\n[API Reference](https://loops.so/docs/api-reference/publish-transactional-email)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                              |\n| ---- | ------ | -------- | ---------------------------------- |\n| `transactionalId` | string | Yes      | The ID of the transactional email. |\n\n#### Example\n\n```javascript\nconst resp = await loops.publishTransactionalEmail(\"clfn0k1yg001imo0fdeqg30i8\");\n```\n\n---\n\n### listDedicatedSendingIps()\n\nGet a list of Loops' dedicated sending IP addresses. This is intended for rare cases where you need to whitelist Loops' sending IPs.\n\n[API Reference](https://loops.so/docs/api-reference/dedicated-sending-ips)\n\n#### Parameters\n\nNone\n\n#### Example\n\n```javascript\nconst resp = await loops.listDedicatedSendingIps();\n```\n\n#### Response\n\n```json\n[\n  \"1.2.3.4\",\n  \"5.6.7.8\"\n]\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### listThemes()\n\nRetrieve a paginated list of email themes, most recently created first.\n[API Reference](https://loops.so/docs/api-reference/list-themes)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listThemes();\n\nconst resp = await loops.listThemes({ perPage: 15, cursor: \"clyo0q4wo01p59fsecyxqsh38\" });\n```\n\n#### Response\n\n```json\n{\n  \"pagination\": {\n    \"totalResults\": 1,\n    \"returnedResults\": 1,\n    \"perPage\": 20,\n    \"totalPages\": 1,\n    \"nextCursor\": null,\n    \"nextPage\": null\n  },\n  \"data\": [\n    {\n      \"id\": \"clo1z5q7s004yl70y3z4a5b6c\",\n      \"name\": \"Default\",\n      \"styles\": {\n        \"backgroundColor\": \"#ffffff\"\n      },\n      \"isDefault\": true,\n      \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2025-01-01T00:00:00.000Z\"\n    }\n  ]\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### getTheme()\n\nRetrieve a single theme by ID.\n[API Reference](https://loops.so/docs/api-reference/get-theme)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                |\n| ---- | ------ | -------- | -------------------- |\n| `themeId` | string | Yes      | The ID of the theme. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getTheme(\"clo1z5q7s004yl70y3z4a5b6c\");\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"clo1z5q7s004yl70y3z4a5b6c\",\n  \"name\": \"Default\",\n  \"styles\": {\n    \"backgroundColor\": \"#ffffff\"\n  },\n  \"isDefault\": true,\n  \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2025-01-01T00:00:00.000Z\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### listComponents()\n\nRetrieve a paginated list of email components.\n[API Reference](https://loops.so/docs/api-reference/list-components)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listComponents();\n\nconst resp = await loops.listComponents({ perPage: 15 });\n```\n\n#### Response\n\n```json\n{\n  \"pagination\": {\n    \"totalResults\": 1,\n    \"returnedResults\": 1,\n    \"perPage\": 20,\n    \"totalPages\": 1,\n    \"nextCursor\": null,\n    \"nextPage\": null\n  },\n  \"data\": [\n    {\n      \"id\": \"clp2a6r8t005yl70d7e8f9g0h\",\n      \"name\": \"Header\",\n      \"lmx\": \"<Section>...</Section>\"\n    }\n  ]\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### getComponent()\n\nRetrieve a single component by ID.\n[API Reference](https://loops.so/docs/api-reference/get-component)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                     |\n| ---- | ------ | -------- | ------------------------- |\n| `componentId` | string | Yes      | The ID of the component. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getComponent(\"clp2a6r8t005yl70d7e8f9g0h\");\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"clp2a6r8t005yl70d7e8f9g0h\",\n  \"name\": \"Header\",\n  \"lmx\": \"<Section>...</Section>\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### listCampaigns()\n\nRetrieve a paginated list of campaigns.\n[API Reference](https://loops.so/docs/api-reference/list-campaigns)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listCampaigns();\n\nconst resp = await loops.listCampaigns({ perPage: 15 });\n```\n\n#### Response\n\n```json\n{\n  \"pagination\": {\n    \"totalResults\": 1,\n    \"returnedResults\": 1,\n    \"perPage\": 20,\n    \"totalPages\": 1,\n    \"nextCursor\": null,\n    \"nextPage\": null\n  },\n  \"data\": [\n    {\n      \"id\": \"cln0y4p6r003yl70i1j2k3l4m\",\n      \"emailMessageId\": \"clm9x3o5q002yl70a8b3c4d5e\",\n      \"name\": \"Spring announcement\",\n      \"status\": \"Draft\",\n      \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2025-01-01T00:00:00.000Z\",\n      \"campaignGroupId\": null,\n      \"mailingListId\": null,\n      \"audienceSegmentId\": null,\n      \"audienceFilter\": null,\n      \"scheduling\": {\n        \"method\": \"now\",\n        \"timestamp\": null\n      }\n    }\n  ]\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### createCampaign()\n\nCreate a new draft campaign. An empty email message is created automatically and its `emailMessageId` is returned. Use [`updateEmailMessage()`](#updateemailmessage) to set subject, sender, preview text, and LMX content. The audience (mailing list, segment, or filter), group, and scheduling can be set on create or later via update.\n[API Reference](https://loops.so/docs/api-reference/create-campaign)\n\n#### Parameters\n\n| Name                | Type    | Required | Notes                                                                                    |\n| ------------------- | ------- | -------- | ---------------------------------------------------------------------------------------- |\n| `name`              | string  | Yes      | The campaign name.                                                                       |\n| `campaignGroupId`   | string  | No       | The ID of the group to add this campaign to.                                             |\n| `mailingListId`     | string  | No       | The ID of the mailing list to send to.                                                   |\n| `audienceSegmentId` | string  | No       | The ID of an audience segment. Setting this clears any `audienceFilter`.                 |\n| `audienceFilter`    | object  | No       | An audience filter object. See the [API reference](https://loops.so/docs/api-reference/create-campaign). |\n| `scheduling`        | object  | No       | When the campaign should send (`method`: `now` or `schedule`, with optional `timestamp`). |\n\n#### Example\n\n```javascript\nconst resp = await loops.createCampaign({ name: \"Spring announcement\" });\n\nconst resp = await loops.createCampaign({\n  name: \"Spring announcement\",\n  mailingListId: \"cm06f5v0e45nf0ml5754o9cix\",\n  scheduling: { method: \"schedule\", timestamp: \"2026-06-15T10:00:00.000Z\" },\n});\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"cln0y4p6r003yl70i1j2k3l4m\",\n  \"name\": \"Spring announcement\",\n  \"status\": \"Draft\",\n  \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2025-01-01T00:00:00.000Z\",\n  \"emailMessageId\": \"clm9x3o5q002yl70a8b3c4d5e\",\n  \"emailMessageContentRevisionId\": \"clv8g2x4z012yl70n5o6p7q8r\",\n  \"campaignGroupId\": null,\n  \"mailingListId\": null,\n  \"audienceSegmentId\": null,\n  \"audienceFilter\": null,\n  \"scheduling\": {\n    \"method\": \"now\",\n    \"timestamp\": null\n  }\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### getCampaign()\n\nRetrieve a single campaign by ID.\n[API Reference](https://loops.so/docs/api-reference/get-campaign)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                   |\n| ---- | ------ | -------- | ----------------------- |\n| `campaignId` | string | Yes      | The ID of the campaign. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getCampaign(\"cln0y4p6r003yl70i1j2k3l4m\");\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"cln0y4p6r003yl70i1j2k3l4m\",\n  \"name\": \"Spring announcement\",\n  \"status\": \"Draft\",\n  \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2025-01-01T00:00:00.000Z\",\n  \"emailMessageId\": \"clm9x3o5q002yl70a8b3c4d5e\",\n  \"campaignGroupId\": null,\n  \"mailingListId\": null,\n  \"audienceSegmentId\": null,\n  \"audienceFilter\": null,\n  \"scheduling\": {\n    \"method\": \"now\",\n    \"timestamp\": null\n  }\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### updateCampaign()\n\nUpdate a draft campaign's name, group, audience, or scheduling. At least one field must be provided. Campaigns can only be updated while in draft status.\n[API Reference](https://loops.so/docs/api-reference/update-campaign)\n\n#### Parameters\n\n| Name                | Type   | Required | Notes                                                                                    |\n| ------------------- | ------ | -------- | ---------------------------------------------------------------------------------------- |\n| `campaignId`                | string | Yes      | The ID of the campaign.                                                                  |\n| `name`              | string | No       | The campaign name.                                                                       |\n| `campaignGroupId`   | string | No       | The ID of the group to move this campaign to.                                            |\n| `mailingListId`     | string | No       | The ID of the mailing list to send to.                                                   |\n| `audienceSegmentId` | string | No       | The ID of an audience segment. Setting this clears any `audienceFilter`.                 |\n| `audienceFilter`    | object | No       | An audience filter object.                                                               |\n| `scheduling`        | object | No       | When the campaign should send. At least one field is required.                         |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateCampaign(\"cln0y4p6r003yl70i1j2k3l4m\", { name: \"Updated name\" });\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"cln0y4p6r003yl70i1j2k3l4m\",\n  \"name\": \"Updated name\",\n  \"status\": \"Draft\",\n  \"createdAt\": \"2025-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2025-01-02T00:00:00.000Z\",\n  \"emailMessageId\": \"clm9x3o5q002yl70a8b3c4d5e\",\n  \"campaignGroupId\": null,\n  \"mailingListId\": null,\n  \"audienceSegmentId\": null,\n  \"audienceFilter\": null,\n  \"scheduling\": {\n    \"method\": \"now\",\n    \"timestamp\": null\n  }\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 409 Conflict\n{\n  \"success\": false,\n  \"message\": \"Campaign is not in draft status.\"\n}\n```\n\n---\n\n### getEmailMessage()\n\nRetrieve an email message, including its compiled LMX content.\n[API Reference](https://loops.so/docs/api-reference/get-email-message)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                        |\n| ---- | ------ | -------- | ---------------------------- |\n| `emailMessageId` | string | Yes      | The ID of the email message. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getEmailMessage(\"clm9x3o5q002yl70a8b3c4d5e\");\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"clm9x3o5q002yl70a8b3c4d5e\",\n  \"campaignId\": \"cln0y4p6r003yl70i1j2k3l4m\",\n  \"subject\": \"Hello\",\n  \"previewText\": \"Preview text\",\n  \"fromName\": \"Loops\",\n  \"fromEmail\": \"hello\",\n  \"replyToEmail\": \"\",\n  \"emailFormat\": \"styled\",\n  \"lmx\": \"<Email>...</Email>\",\n  \"contentRevisionId\": \"clv8g2x4z012yl70n5o6p7q8r\",\n  \"updatedAt\": \"2025-01-01T00:00:00.000Z\"\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n---\n\n### updateEmailMessage()\n\nUpdate fields on an email message (subject, preview text, sender, LMX content). The campaign must be in draft status. Supply `expectedRevisionId` matching the current `contentRevisionId` — the server rejects mismatched revisions with 409.\n[API Reference](https://loops.so/docs/api-reference/update-email-message)\n\n#### Parameters\n\n| Name                           | Type   | Required | Notes                                                                                                                                          |\n| ------------------------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |\n| `emailMessageId`                           | string | Yes      | The ID of the email message.                                                                                                                   |\n| `expectedRevisionId`           | string | No       | The `contentRevisionId` you last fetched. Used for optimistic concurrency.                                                                     |\n| `subject`                      | string | No       | The email subject.                                                                                                                             |\n| `previewText`                  | string | No       | The email preview text.                                                                                                                        |\n| `fromName`                     | string | No       | The sender name.                                                                                                                               |\n| `fromEmail`                    | string | No       | The sender username (without `@` or domain). The team's sending domain is appended automatically.                                              |\n| `replyToEmail`                 | string | No       | Reply-to email. Must be empty or a valid email address.                                                                                        |\n| `ccEmail`                      | string | No       | CC email address. Requires CC/BCC to be enabled for your team.                                                                                |\n| `bccEmail`                     | string | No       | BCC email address. Requires CC/BCC to be enabled for your team.                                                                               |\n| `languageCode`                 | string | No       | Language code for the email. Requires translation to be enabled for your team.                                                                 |\n| `emailFormat`                  | string | No       | The rendering format: `styled` or `plain`.                                                                                                   |\n| `lmx`                          | string | No       | The email body serialized as LMX. Styles must be embedded in the LMX `<Style />` tag.                                                          |\n| `contactPropertiesFallbacks`   | object | No       | Fallback values for contact properties, keyed by property name.                                                                                |\n| `eventPropertiesFallbacks`     | object | No       | Fallback values for event properties, keyed by property name.                                                                                  |\n| `dataVariablesFallbacks`       | object | No       | Fallback values for data variables, keyed by variable name.                                                                                    |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateEmailMessage(\"clm9x3o5q002yl70a8b3c4d5e\", {\n  expectedRevisionId: \"clv8g2x4z012yl70n5o6p7q8r\",\n  subject: \"Hello\",\n  previewText: \"Preview text\",\n  fromName: \"Loops\",\n  fromEmail: \"hello\",\n  lmx: \"<Email>...</Email>\",\n});\n```\n\n#### Response\n\n```json\n{\n  \"id\": \"clm9x3o5q002yl70a8b3c4d5e\",\n  \"campaignId\": \"cln0y4p6r003yl70i1j2k3l4m\",\n  \"subject\": \"Hello\",\n  \"previewText\": \"Preview text\",\n  \"fromName\": \"Loops\",\n  \"fromEmail\": \"hello\",\n  \"replyToEmail\": \"\",\n  \"emailFormat\": \"styled\",\n  \"lmx\": \"<Email>...</Email>\",\n  \"contentRevisionId\": \"clv8g2x4z013yl70s9t0u1v2w\",\n  \"updatedAt\": \"2025-01-02T00:00:00.000Z\",\n  \"warnings\": [\n    {\n      \"rule\": \"example\",\n      \"severity\": \"warning\",\n      \"message\": \"Example warning\"\n    }\n  ]\n}\n```\n\nError handling is done through the `APIError` class, which provides `statusCode` and `json` properties containing the API's error response details. For implementation examples, see the [Usage section](#usage).\n\n```json\nHTTP 409 Conflict\n{\n  \"success\": false,\n  \"message\": \"Content revision ID is stale.\"\n}\n```\n\n---\n\n### listTransactionalGroups()\n\nRetrieve a paginated list of transactional groups.\n[API Reference](https://loops.so/docs/api-reference/list-transactional-groups)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listTransactionalGroups();\n```\n\n---\n\n### createTransactionalGroup()\n\nCreate a new transactional group.\n[API Reference](https://loops.so/docs/api-reference/create-transactional-group)\n\n#### Parameters\n\n| Name          | Type   | Required | Notes                                  |\n| ------------- | ------ | -------- | -------------------------------------- |\n| `name`        | string | Yes      | The group name. Cannot be `\"Unsorted\"`. |\n| `description` | string | No       | An optional description for the group. |\n\n#### Example\n\n```javascript\nconst resp = await loops.createTransactionalGroup({\n  name: \"Onboarding\",\n  description: \"Transactional emails for new users\",\n});\n```\n\n---\n\n### getTransactionalGroup()\n\nRetrieve a single transactional group by ID.\n[API Reference](https://loops.so/docs/api-reference/get-transactional-group)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                              |\n| ---- | ------ | -------- | ---------------------------------- |\n| `transactionalGroupId` | string | Yes      | The ID of the transactional group. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getTransactionalGroup(\"clq3b7s9u006yl70p5q6r7s8t\");\n```\n\n---\n\n### updateTransactionalGroup()\n\nUpdate a transactional group's name or description. At least one field must be provided. The reserved `\"Unsorted\"` group cannot be edited.\n[API Reference](https://loops.so/docs/api-reference/update-transactional-group)\n\n#### Parameters\n\n| Name          | Type   | Required | Notes                              |\n| ------------- | ------ | -------- | ---------------------------------- |\n| `transactionalGroupId`          | string | Yes      | The ID of the transactional group. |\n| `name`        | string | No       | The group name.                    |\n| `description` | string | No       | A description for the group.       |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateTransactionalGroup(\"clq3b7s9u006yl70p5q6r7s8t\", {\n  name: \"Updated name\",\n});\n```\n\n---\n\n### listAudienceSegments()\n\nRetrieve a paginated list of audience segments.\n[API Reference](https://loops.so/docs/api-reference/list-audience-segments)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listAudienceSegments();\n```\n\n---\n\n### getAudienceSegment()\n\nRetrieve a single audience segment by ID.\n[API Reference](https://loops.so/docs/api-reference/get-audience-segment)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                            |\n| ---- | ------ | -------- | -------------------------------- |\n| `audienceSegmentId` | string | Yes      | The ID of the audience segment. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getAudienceSegment(\"clr4c8t0v008yl70x3y4z5a6b\");\n```\n\n---\n\n### listCampaignGroups()\n\nRetrieve a paginated list of campaign groups.\n[API Reference](https://loops.so/docs/api-reference/list-campaign-groups)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results. Cursors can be found from the `pagination.nextCursor` value in each response. |\n\n#### Example\n\n```javascript\nconst resp = await loops.listCampaignGroups();\n```\n\n---\n\n### createCampaignGroup()\n\nCreate a new campaign group.\n[API Reference](https://loops.so/docs/api-reference/create-campaign-group)\n\n#### Parameters\n\n| Name          | Type   | Required | Notes                                  |\n| ------------- | ------ | -------- | -------------------------------------- |\n| `name`        | string | Yes      | The group name. Cannot be `\"Unsorted\"`. |\n| `description` | string | No       | An optional description for the group. |\n\n#### Example\n\n```javascript\nconst resp = await loops.createCampaignGroup({\n  name: \"Newsletters\",\n});\n```\n\n---\n\n### getCampaignGroup()\n\nRetrieve a single campaign group by ID.\n[API Reference](https://loops.so/docs/api-reference/get-campaign-group)\n\n#### Parameters\n\n| Name | Type   | Required | Notes                         |\n| ---- | ------ | -------- | ----------------------------- |\n| `campaignGroupId` | string | Yes      | The ID of the campaign group. |\n\n#### Example\n\n```javascript\nconst resp = await loops.getCampaignGroup(\"clq3b7s9u007yl70u9v0w1x2y\");\n```\n\n---\n\n### updateCampaignGroup()\n\nUpdate a campaign group's name or description. At least one field must be provided. The reserved `\"Unsorted\"` group cannot be edited.\n[API Reference](https://loops.so/docs/api-reference/update-campaign-group)\n\n#### Parameters\n\n| Name          | Type   | Required | Notes                         |\n| ------------- | ------ | -------- | ----------------------------- |\n| `campaignGroupId`          | string | Yes      | The ID of the campaign group. |\n| `name`        | string | No       | The group name.               |\n| `description` | string | No       | A description for the group.  |\n\n#### Example\n\n```javascript\nconst resp = await loops.updateCampaignGroup(\"clq3b7s9u007yl70u9v0w1x2y\", {\n  description: \"Monthly product updates\",\n});\n```\n\n---\n\n### sendEmailMessagePreview()\n\nSend a test preview of an email message to one or more addresses.\n[API Reference](https://loops.so/docs/api-reference/send-email-message-preview)\n\n#### Parameters\n\n| Name                | Type     | Required | Notes                                                                                       |\n| ------------------- | -------- | -------- | ------------------------------------------------------------------------------------------- |\n| `emailMessageId`                | string   | Yes      | The ID of the email message.                                                                |\n| `emails`            | string[] | Yes      | One or more addresses to send the preview to.                                               |\n| `contactProperties` | object   | No       | Contact property values to render. Accepted for campaign and workflow previews.             |\n| `eventProperties`   | object   | No       | Event property values to render. Accepted for workflow previews only.                       |\n| `dataVariables`     | object   | No       | Transactional data variables to render. Accepted for transactional previews only.           |\n\n#### Example\n\n```javascript\nconst resp = await loops.sendEmailMessagePreview(\"clm9x3o5q002yl70a8b3c4d5e\", {\n  emails: [\"test@example.com\"],\n  contactProperties: {\n    firstName: \"Alex\",\n  },\n});\n```\n\n---\n\n### listWorkflows()\n\nRetrieve a paginated list of workflows.\n[API Reference](https://loops.so/docs/api-reference/list-workflows)\n\n#### Parameters\n\n| Name      | Type    | Required | Notes                                                                                                                         |\n| --------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `perPage` | integer | No       | How many results to return per page. Must be between 10 and 50. Defaults to 20 if omitted.                                    |\n| `cursor`  | string  | No       | A cursor, to return a specific page of results.","readmeFilename":"README.md"}