{"_id":"@capturly/capture-sdk","_rev":"7-964bfdbe94c5f28d6c5f1b8f2bd81416","name":"@capturly/capture-sdk","dist-tags":{"latest":"2.12.0"},"versions":{"2.10.2":{"name":"@capturly/capture-sdk","version":"2.10.2","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.10.2","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"407e5e19d0737b6217093cecc237ff570af9d4ed","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.10.2.tgz","fileCount":9,"integrity":"sha512-wlRrmLKE8AQd5b1bn88AQHz06RUvakdA1G3++PE4d8yVo5flc514l8KH6l41uZ49Ud5K0jTfZUjozY0+voYoog==","signatures":[{"sig":"MEUCIQC4IikSEu4hzXrUfsKeLbX+CkcsBwGh8Njelb8k4NA3ugIgdWB6AFu/tgNaE5xLG0f7Vv6JIPX50hMrX7xrWXoLOw4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171823},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"60cb31228a3009d61cc4bb077cb269f3cb08c386","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit","prepublishOnly":"pnpm clean && pnpm type-check && pnpm test && pnpm build"},"_npmUser":{"name":"nx211","email":"corey@coreyalan.com"},"repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"11.19.0","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"workspace:*","@capturly/eslint-config":"workspace:*","@capturly/recording-engine":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.10.2_1788896012914_0.06609296734786896","host":"s3://npm-registry-packages-npm-production"}},"2.11.0":{"name":"@capturly/capture-sdk","version":"2.11.0","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.11.0","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"bba053e67b452b99e6a4e9a4bf969df23d1982ab","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.11.0.tgz","fileCount":9,"integrity":"sha512-3pJ06hPYMiEApA4ghgW3yHeeFDGXfLFjY/eerAs11U85/jdy/38PAXYoSgXZNUt7Vu2Bj1E/V6R4kSvHild95w==","signatures":[{"sig":"MEUCIEESOuP/wHIfHKUVH7ev2YdFM49Bbt7Uy/f2aBedulNCAiEArKajchvns1rLq8n3NIyJ6Zu+RL03Tj/JF4LODWfNTBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD/I37QMeJYPiJoBdlgMPs8YwVYqt/ftpahho7Wq+t9PQIgY/jtcnFPcvpoRB/gAPUMh0eesFzgYC8Sm6p0WiB8T20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182803},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/capturly-capture-sdk-2.11.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a4609cd-7f9b-42f7-b1e5-13efe58ceb50"}},"_resolved":"/home/runner/work/_temp/capturly-capture-sdk-2.11.0.tgz","_integrity":"sha512-3pJ06hPYMiEApA4ghgW3yHeeFDGXfLFjY/eerAs11U85/jdy/38PAXYoSgXZNUt7Vu2Bj1E/V6R4kSvHild95w==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"12.0.2","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.11.0","@capturly/eslint-config":"2.11.0","@capturly/recording-engine":"2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.11.0_1789003982495_0.37601555267506725","host":"s3://npm-registry-packages-npm-production"}},"2.11.1":{"name":"@capturly/capture-sdk","version":"2.11.1","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.11.1","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"981a65875ea184c3d678805b91cc4e2d8670b7b7","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.11.1.tgz","fileCount":11,"integrity":"sha512-m9XT+e68zaovDcNR9EOAWC+InwzCR8jeabjw1S5J6qw4+Zfoewb8Dpm+iKg9BxyPjw0oeq0WU0Nw364/sSrQ2g==","signatures":[{"sig":"MEUCIEWnY+mzNqk9e8Bav0oYlRmx24DntwCp9DzeVN+HiANvAiEAiqS8JcGVJAdvWlXbGUqm3HIUFJF/tmrUm8F/g1S5trw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDSVKiMUw+rsukm6SkbNgmlYbltGZQpOrqkh23HMHeQTAIhAM5T7BUUp/y7dyxnhIjZL2QjDxHPxAOzO1c2m1g8gPcA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190490},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/capturly-capture-sdk-2.11.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./transport":{"types":"./dist/transport.d.ts","default":"./dist/transport.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"pnpm clean && node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a4609cd-7f9b-42f7-b1e5-13efe58ceb50"}},"_resolved":"/home/runner/work/_temp/capturly-capture-sdk-2.11.1.tgz","_integrity":"sha512-m9XT+e68zaovDcNR9EOAWC+InwzCR8jeabjw1S5J6qw4+Zfoewb8Dpm+iKg9BxyPjw0oeq0WU0Nw364/sSrQ2g==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"12.0.2","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.11.1","@capturly/eslint-config":"2.11.1","@capturly/recording-engine":"2.11.1"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.11.1_1789569255252_0.16572506541941734","host":"s3://npm-registry-packages-npm-production"}},"2.11.2":{"name":"@capturly/capture-sdk","version":"2.11.2","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.11.2","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"8d699bb37dba412c4d46677b9769e5d2b6c8c09c","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.11.2.tgz","fileCount":11,"integrity":"sha512-ZdjBEgz1YHpi8A4SEvYWM5+auv4wUHWdq+0ETiriexlcYmZYmYejzsDPyEjuJtDDrxLelq+epzgxaB1h7P6u7A==","signatures":[{"sig":"MEUCIDSFUH56uowc1Y0vccpiKJoSt14/MtVlUfe9cs1DPQZlAiEAyLgZREgEE0A8oP6t3HQJ1x7VNlJqcCPlmFsKdw1cJ/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCfDMNJ98BhaitClo/pE2aRRbrZGHeACaVZg+M7H/prDwIgVs35bAw6K5Flh2T0FgcsNoqHwV2Ydymbpjg7F+fRf+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190501},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/capturly-capture-sdk-2.11.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./transport":{"types":"./dist/transport.d.ts","default":"./dist/transport.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"pnpm clean && node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a4609cd-7f9b-42f7-b1e5-13efe58ceb50"}},"_resolved":"/home/runner/work/_temp/capturly-capture-sdk-2.11.2.tgz","_integrity":"sha512-ZdjBEgz1YHpi8A4SEvYWM5+auv4wUHWdq+0ETiriexlcYmZYmYejzsDPyEjuJtDDrxLelq+epzgxaB1h7P6u7A==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"12.0.2","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.11.2","@capturly/eslint-config":"2.11.2","@capturly/recording-engine":"2.11.2"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.11.2_1790030657615_0.42788875527693326","host":"s3://npm-registry-packages-npm-production"}},"2.11.3":{"name":"@capturly/capture-sdk","version":"2.11.3","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.11.3","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"62ebf68ab77d495398677642e77e0599b3888220","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.11.3.tgz","fileCount":11,"integrity":"sha512-Sn1LBm7KAIGB6CUiGNN/dYvqARTMQaF4QGVVAj+vF+6fWoie8A2adf3zGyAjgAfDrtCdbQL+VYg2j1+c5hCDww==","signatures":[{"sig":"MEUCIExPXjNBurk309IzlSdXBGRBr/Tm294XBkUHPmXvwkllAiEAqVgsbj9oZZSJoOb5QJ6pZE4li7iAMnJkz0bAChOZvzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIChE3Ou1rBKQZYoh5FGlhXd2p1/b8d5RRzmtkucQZ3p0AiEAtgCugHVPXNsIuG87VlhpZL1hts8hYpovUzBSryWq4NU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190512},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/capturly-capture-sdk-2.11.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./transport":{"types":"./dist/transport.d.ts","default":"./dist/transport.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"pnpm clean && node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a4609cd-7f9b-42f7-b1e5-13efe58ceb50"}},"_resolved":"/home/runner/work/_temp/capturly-capture-sdk-2.11.3.tgz","_integrity":"sha512-Sn1LBm7KAIGB6CUiGNN/dYvqARTMQaF4QGVVAj+vF+6fWoie8A2adf3zGyAjgAfDrtCdbQL+VYg2j1+c5hCDww==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"12.0.2","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.11.3","@capturly/eslint-config":"2.11.3","@capturly/recording-engine":"2.11.3"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.11.3_1790086152096_0.8374409271945009","host":"s3://npm-registry-packages-npm-production"}},"2.11.4":{"name":"@capturly/capture-sdk","version":"2.11.4","keywords":["recording","video","capture","testimonials","capturly"],"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@capturly/capture-sdk@2.11.4","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"homepage":"https://capturly.app/platform","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"ee8dc09995cc899667676fc40fcb386683c64d61","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.11.4.tgz","fileCount":11,"integrity":"sha512-vLxGvKr7oyPfTL/s/2gq+wlwSdZQEsvLg6aQmuenx682M8WfRkSHuDjJoiV5TNgMGSX5dtgex98sR2OFgIHHEQ==","signatures":[{"sig":"MEQCIDd5KCSJ2RiMSmS834M+69PjldUQ19CCq41XvXQ9MaUlAiAWo929E3lUwAp0QGg9epDl+/D/NTztBPKSelHDzColgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC/QTacWSQrBGUf5mJ2gn91PIG+It+LG3bgRXVfsEKbpAIgDG+zQDA6pjtEJA6Y/TzrVPp+5ez28OecK5n89eDNv90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193929},"main":"./dist/index.js","type":"module","_from":"file:/tmp/sdk-pack/capturly-capture-sdk-2.11.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./transport":{"types":"./dist/transport.d.ts","default":"./dist/transport.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"pnpm clean && node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"nx211","email":"corey@coreyalan.com"},"_resolved":"/tmp/sdk-pack/capturly-capture-sdk-2.11.4.tgz","_integrity":"sha512-vLxGvKr7oyPfTL/s/2gq+wlwSdZQEsvLg6aQmuenx682M8WfRkSHuDjJoiV5TNgMGSX5dtgex98sR2OFgIHHEQ==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"11.19.0","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.11.4","@capturly/eslint-config":"2.11.4","@capturly/studios-client":"0.3.0","@capturly/recording-engine":"2.11.4"},"_npmOperationalInternal":{"tmp":"tmp/capture-sdk_2.11.4_1790263890434_0.9183641958609976","host":"s3://npm-registry-packages-npm-production"}},"2.12.0":{"_id":"@capturly/capture-sdk@2.12.0","bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"dist":{"shasum":"95a52aabca44082a6d910b94017757c229d13517","tarball":"https://registry.npmjs.org/@capturly/capture-sdk/-/capture-sdk-2.12.0.tgz","fileCount":11,"integrity":"sha512-v9Ju1CtQjjQXHUgjeXCvuiVnG7cKf/X8imN5ZKmgWnRpdflIUggcf6AcDTemaVWMTejbYmoM9ZTGkAovQPWzZQ==","signatures":[{"sig":"MEUCIQDt85nm1uaXmtw+SwLTCemW+Yw+X9Mdp4nkYH+RG1uY0gIgeKvq+k2qbrb8G10G6kNb4wS3l1GAo9iRt4r9xp+c7BY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCyCrH8oqk06wgNXFj+UR8wHZgGUFcnO2cx1EMBITniPQIgPDpaX7eV4QdBRJ/Vj+nqnNisb6GPSJ+kIBjpDmzoMMk="}],"unpackedSize":196514},"main":"./dist/index.js","name":"@capturly/capture-sdk","type":"module","_from":"file:/home/runner/work/_temp/capturly-capture-sdk-2.12.0.tgz","types":"./dist/index.d.ts","author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./transport":{"types":"./dist/transport.d.ts","default":"./dist/transport.js"},"./package.json":"./package.json"},"license":"SEE LICENSE IN LICENSE","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"pnpm clean && node build.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"version":"2.12.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a4609cd-7f9b-42f7-b1e5-13efe58ceb50"}},"homepage":"https://capturly.app/platform","keywords":["recording","video","capture","testimonials","capturly"],"_resolved":"/home/runner/work/_temp/capturly-capture-sdk-2.12.0.tgz","_integrity":"sha512-v9Ju1CtQjjQXHUgjeXCvuiVnG7cKf/X8imN5ZKmgWnRpdflIUggcf6AcDTemaVWMTejbYmoM9ZTGkAovQPWzZQ==","repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"_npmVersion":"12.1.0","description":"Record full-quality audio and video on your user's own device, from your own product.","directories":{},"maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","esbuild":"^0.25.0","typescript":"^5.4.0","@capturly/tsconfig":"2.12.0","@capturly/eslint-config":"2.12.0","@capturly/studios-client":"0.4.0","@capturly/recording-engine":"2.12.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/capture-sdk_2.12.0_1790361238676_0.16822862186867416"}}},"time":{"created":"2026-09-08T19:33:32.664Z","modified":"2026-09-25T18:33:59.003Z","2.10.2":"2026-09-08T19:33:33.054Z","2.11.0":"2026-09-10T01:33:02.569Z","2.11.1":"2026-09-16T14:34:15.350Z","2.11.2":"2026-09-21T22:44:17.714Z","2.11.3":"2026-09-22T14:09:12.185Z","2.11.4":"2026-09-24T15:31:30.519Z","2.12.0":"2026-09-25T18:33:58.762Z"},"bugs":{"url":"https://github.com/Corey-Alan-Consulting/capturly.app/issues"},"author":{"url":"https://capturly.app","name":"Corey Alan LLC"},"license":"SEE LICENSE IN LICENSE","homepage":"https://capturly.app/platform","keywords":["recording","video","capture","testimonials","capturly"],"repository":{"url":"git+https://github.com/Corey-Alan-Consulting/capturly.app.git","type":"git","directory":"packages/capture-sdk"},"description":"Record full-quality audio and video on your user's own device, from your own product.","maintainers":[{"name":"nx211","email":"corey@coreyalan.com"}],"readme":"# @capturly/capture-sdk\n\nRecord full-quality audio and video on your user's own device, from your own\nproduct. The recording happens locally and uploads afterwards, so a weak\nconnection costs your user a slow upload rather than a ruined take. What lands\nin your Capturly library is the original file, not a re-encode of a stream\nthat was fighting their WiFi.\n\nThis is the browser half of Capturly's capture-request flow. Your backend\ncreates the request and mints a per-person link; this package records against\nit.\n\n## Install\n\n```bash\nnpm install @capturly/capture-sdk\n```\n\nPublic package. Nothing here needs npm scope access; the recording engine it\nuses is bundled in.\n\n## Environment\n\nBrowsers only. It needs MP4 `MediaRecorder` or WebCodecs, OPFS\n(`navigator.storage`), and `getUserMedia`: Chrome/Edge 124+ and Safari 16.4+.\n\n**Firefox is not supported.** It has neither MP4 `MediaRecorder` nor\n`MediaStreamTrackProcessor`, so there is no way to write the file — this is a\nmissing capability, not a version floor.\n\nCall `CaptureClient.isSupported()` before you show a record button; a browser\nthat fails it cannot be talked into working, so offer another browser rather\nthan a retry.\n\n`getUserMedia` also requires a secure context, so this will not work on a page\nserved over plain HTTP (localhost excepted).\n\n## The shape of an integration\n\nThree things happen on your server and one in the browser.\n\n**1. Your backend creates a capture request** with your secret API key. Never\nput that key in a browser; it carries your whole organization's access.\n\n```js\nconst res = await fetch('https://capturly.app/api/v1/capture-requests', {\n  method: 'POST',\n  headers: { authorization: `Bearer ${process.env.CAPTURLY_API_KEY}`, 'content-type': 'application/json' },\n  body: JSON.stringify({ title: 'Customer stories', prompt: 'How did it go?', status: 'active' }),\n});\nconst { captureRequest } = await res.json();\n```\n\n**2. Your backend adds the person** and gets their personal link back. Adding a\ncontact does not email them. Sending is yours, if you want to send anything at\nall.\n\n```js\nconst res = await fetch(\n  `https://capturly.app/api/v1/capture-requests/${captureRequest.id}/contacts`,\n  {\n    method: 'POST',\n    headers: { authorization: `Bearer ${process.env.CAPTURLY_API_KEY}`, 'content-type': 'application/json' },\n    body: JSON.stringify({ contacts: [{ email: 'jane@example.com', name: 'Jane Doe' }] }),\n  },\n);\nconst { contacts } = await res.json();\n// contacts[0].url is https://capturly.app/c/<contactId>?k=<key>\n```\n\n**3. Your frontend records** with the id and key from that URL.\n\n```js\nimport { CaptureClient } from '@capturly/capture-sdk';\n\nconst client = new CaptureClient({\n  access: { mode: 'contact', contactId, key },\n});\n\nconst stream = await client.preview();       // shows the permission prompt\nvideoEl.srcObject = stream;                  // render it however you like\n\nawait client.start();\n// ...\nconst take = await client.stop();            // nothing has left the browser yet\npreviewEl.src = take.previewUrl;             // let them watch it back\n\nawait client.submit({ releaseAccepted: true, onProgress: (p) => setBar(p) });\nclient.destroy();\n```\n\n**4. Your backend learns it landed**, from the\n`capture_request.submission_received` webhook, or by polling\n`GET /v1/capture-requests/{id}/submissions`, which carries the consent the\nrespondent accepted.\n\n`GET /v1/recordings/{id}` returns the recording's metadata and its files.\nDownload a file with\n`GET /v1/recordings/{id}/files/{fileId}/download-url`, which mints a signed\nURL — the API never proxies the bytes.\n\nThe recording id is not returned to the browser. Trust your backend for it.\n\n## Consent\n\nIf the capture request requires a release, read its `release.text` from the API\nand show it before recording, then pass `releaseAccepted: true` only if the\nperson actually accepted it. That stores a consent record with the text\nverbatim as it was displayed. Editing the request's wording later never rewrites what a\npast respondent appears to have agreed to; passing `true` without showing them\nanything produces a record that says something untrue.\n\n## Errors\n\nEvery failure is a `CaptureError` with a `code`. What matters is whether\nretrying can work, and who has to act:\n\n| Code | Meaning | Retry? |\n| --- | --- | --- |\n| `unsupported_browser` | No MP4 recording in this browser | No — offer another browser |\n| `permission_denied` | Camera or microphone refused | No — your user must allow it |\n| `no_devices` | No camera or microphone found | No — your user must connect one |\n| `not_recording`, `nothing_to_submit` | Called out of order | No — fix the call sequence |\n| `invalid_request` | The call or its payload was rejected — missing release, missing name, take too long | No — fix the input |\n| `link_expired` | Unknown link, or a key that no longer matches | No |\n| `request_closed` | The capture request is closed, past its deadline, revoked, or the workspace has lapsed | No |\n| `superseded` | Another take for this person landed first | No — their other submission is the live one |\n| `quota_exceeded` | No room right now: take too large, or the request is at its cap | No — the workspace owner must act |\n| `rate_limited` | Too many requests | **Yes**, after a pause |\n| `upload_failed` | Storage or the API failed server-side | **Yes** |\n| `network` | The request never reached Capturly | **Yes** |\n\nOnly the last three are worth retrying as-is. Retrying anything above them\nre-uploads the whole take to fail the same way.\n\n### Cancelling\n\n`submit` takes an `AbortSignal`. Aborting rejects with `aborted` and leaves the\ntake in local storage, so the same client can submit it again.\n\n```ts\nconst controller = new AbortController();\ncancelButton.onclick = () => controller.abort();\n\nawait client.submit({ releaseAccepted: true, signal: controller.signal });\n```\n\nYou do not need a timeout of your own. JSON calls give up after 30 seconds, and\nan upload that stops making progress for 60 seconds is abandoned with a\nretryable `network` error — an idle limit rather than a total one, so a long\ntake on a slow connection is never cut off mid-upload.\n\n## What this does not do\n\n**Multi-participant sessions.** This records one person at a time. Hosting a\nroom where several people record at once needs signaling, TURN and a join\nceremony, and is not part of this package.\n\n**UI.** You get a `MediaStream` and state events; you render the buttons.\n\n**Transcription.** Capturly delivers masters. Transcription is your pipeline's\njob.\n\n## Reference\n\n- `CaptureClient.isSupported()` probes before you show a record button\n- `listDevices()` lists cameras and microphones; labels only populate after the\n  first permission grant\n- `preview(options)` requests devices and returns the `MediaStream` to render\n- `start()` and `stop()` drive recording; `stop()` returns the take\n- `submit(options)` uploads and records the submission\n- `discard()` throws the take away so you can record again\n- `destroy()` releases the camera and microphone; call it on unmount\n- `onStateChange(fn)` reports `idle`, `starting`, `recording`, `stopping`,\n  `stopped`\n\n## Licence\n\nProprietary. See [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}