{"_id":"@boooply/ai-interviews-sdk","_rev":"16-1c008deeb5b78460675e29620ea598d8","name":"@boooply/ai-interviews-sdk","dist-tags":{"latest":"2.4.0"},"versions":{"1.0.0":{"name":"@boooply/ai-interviews-sdk","version":"1.0.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"6b76842562e9403a77a5361f2e4377cc53ac7cb5","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.0.tgz","fileCount":5,"integrity":"sha512-0dGYm8VgiE57JOmBmq+gIcM4M+pa5IR7FcP9EeCOpEu7a/g8fcfGCI2w3QQ5G/yY9laWboPHjG8SY+G8YZmsIg==","signatures":[{"sig":"MEYCIQDukwGikK1sjkS3uZjOotiFpWvKdGKsKVrKYGyZY/M7QgIhAKCFKDehbcBVAd29NyVsvDEFOh7CX4JzNg5Zm0803kQw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18214},"main":"index.js","types":"index.d.ts","gitHead":"62263d1648e28d742e568c0690de03ea7258a9f0","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.0_1760467730326_0.896942968104067","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@boooply/ai-interviews-sdk","version":"1.0.1","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.1","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"934d450cd040a8142d696f2cc0f635c1dea2eca5","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.1.tgz","fileCount":5,"integrity":"sha512-YAEvrtbx0SPnaxNtn9EscMvPWewfsK6+m+j2P2GLDw39HdgEOwVUgZIbfgdC7VlgA64I/kzOY91BRr+dyUL2Ww==","signatures":[{"sig":"MEQCIE+qwnUf7vJz+4r0RCwPou6MKVSwcuyazdrUm7EVXw4wAiASr0flNpYWNQEN3zXCgaYV6wyVvmeP4YjA7c6qkJfLhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18216},"main":"index.js","types":"index.d.ts","gitHead":"2f892fcd1974a7ff923a3762dbab341e0b4868f3","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.1_1760468083804_0.7846310458822761","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@boooply/ai-interviews-sdk","version":"1.0.2","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.2","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"a047703d92bf9565ebac0db523448f7586f5919c","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.2.tgz","fileCount":5,"integrity":"sha512-9oHLeuW/Jf5zPEDSmMqv9sk8fhwhmFhsonqwUTepDIWeNpu/R7UHP5BbDiAvFWM8pX8oa0I4J23h9hNC5z8jBg==","signatures":[{"sig":"MEQCICKOrHXR3Kl0eCBvTcANBwojpSixU0eWVi3LqjgBfc6FAiADISlU0SPZ5qyigXKrSYL6PcJKkCm3IoLATofH+2QsLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18871},"main":"index.js","types":"index.d.ts","gitHead":"5c8fb3b87b18e011283551e4bea50aef7f10268e","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.2_1760469511024_0.49948891232252457","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@boooply/ai-interviews-sdk","version":"1.0.3","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.3","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"e435446147ba191fca72432a9574ffe92a1812a2","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.3.tgz","fileCount":5,"integrity":"sha512-wNF0HdyQJsSNVlIPZp19pYa8ZIHLpryrmYtp2S7UgJBrLdaeVuYXRsU7dRPJm2HUTm52iCAjUczeFgK/2+1akw==","signatures":[{"sig":"MEYCIQChUFUXoS3n+rfI9F/4cMeWuAZw5yF8CA11oab2PmSCOgIhALt1ZtyyFgz8nEUT/i4tJtNCAUKmZPBJnq7tENaDZKct","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18980},"main":"index.js","types":"index.d.ts","gitHead":"6d4d172bd1fcb4719cf951c16dc6785a815a40a9","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.3_1760471137756_0.7094984211727837","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@boooply/ai-interviews-sdk","version":"1.0.6","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.6","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"59e6e569ef4adbaf9e3470fe3fba79b81f003a40","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.6.tgz","fileCount":6,"integrity":"sha512-ZcUaBA7pSh672mGteGgH473St10h1H8+11LPkVGfcpc6gAgpy5Qhu+LJgFjya5yqmTPsG+bcjK3gMjj8sDdX/w==","signatures":[{"sig":"MEUCIFiwUaZJXxYNPf0H3bcKekF/VEGW24zT88sp0f6uNcPpAiEA9utvKO5UR/SorKqgGRSRg3etSAGqzuaaVoAibed7sm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21375},"main":"index.js","types":"index.d.ts","gitHead":"e52c8430042312f9dc36df2b42449dd6973e14ef","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.6_1760477495307_0.7892220467818161","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@boooply/ai-interviews-sdk","version":"1.0.7","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.7","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"7d303411321d59ba2122da8f2c969e4939f81e98","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.7.tgz","fileCount":6,"integrity":"sha512-Vrk8pJT+syTIXRAKSEBYcoVHeqXIy3MjVY3ooGwzlIGYT8x1uFkww9U2zPE3dAjrgBXHMKV3f2c/yVJzusRNGw==","signatures":[{"sig":"MEQCIG0EQqDrwA1hFudwQN4L2l6AtpdB5dYnfkhXH8IwKLKUAiB8OCH0aCLQEKMvdyzAMLi4bntv704Y7QlGaGdAWIejLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25862},"main":"index.js","types":"index.d.ts","gitHead":"883be4af78a7fb055972af614bbd8e2867c24e9c","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.7_1760479055960_0.7561871446809718","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@boooply/ai-interviews-sdk","version":"1.0.8","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.0.8","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"62341ac3162c7d0ae58ee42277c46faab527f8dc","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.0.8.tgz","fileCount":6,"integrity":"sha512-Tpm6J2UoWojFREhmyJrb+w1pcrT69EGoFoTYiJfxqrs4UspJe+wpmiA64Hq6ROmpcHO33uLVNr2qjVQBoGY9SQ==","signatures":[{"sig":"MEYCIQCrGl0WXP3ny3cUCCxPaARM7KRMbC0SIUrjP78z6wm8XgIhAJu0kutRQv5lJTQbo/ymQR2GCEfWg+qEpU69QRUqtt4z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26226},"main":"index.js","types":"index.d.ts","gitHead":"e2e8815e059847c9cd2f1e580030fc00bbb15b9b","scripts":{"build":"tsc"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.0.8_1760480387939_0.9486502708632456","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@boooply/ai-interviews-sdk","version":"1.1.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.1.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"22f2982b6c1fc6d3e599b0f41da65a2269702916","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.1.0.tgz","fileCount":7,"integrity":"sha512-iwDZvlQaMufMWCOYwO+NUCXZ4o6fBLR6Fiv60cRzr4m83U1Fdom8PNw3QrawCuwoUaH6QNhOd2m3h1R5kXXDPQ==","signatures":[{"sig":"MEUCIEQta/kt/At3VV00Mgyd4QRjDTpfYZ/toIkQv0jecTaCAiEA1oTnwWWGIuen8H1XTDUwX6JnSMKZ11H6gC8Db92oRa8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27267},"main":"index.js","types":"index.d.ts","gitHead":"2fe06793dfd196125c072c7274f14e0339966da1","scripts":{"test":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","build":"tsc","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.1.0_1760517869188_0.6387921437825674","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@boooply/ai-interviews-sdk","version":"1.4.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.4.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"fca01cfb699afe0dfd5831fbf92decc6bb1819f8","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.4.0.tgz","fileCount":7,"integrity":"sha512-Smetrsjy/TN4mNALEzcQENT0pBhDn1pt2YrT8HpaC+9zxez3SdM3KzYijMLFXqCjHt7kc6W/KtW5uxHSxkzw5w==","signatures":[{"sig":"MEUCIQDqysKU4BvMuJt6XEmlatMg0DOnQ7HUmy4X6olt06rVIwIgSZdhg9wjd3IbXs7Y7g5cwp3k4OJ4PVNWER+WQF7FZlo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27956},"main":"index.js","types":"index.d.ts","gitHead":"d181a1314feb82feddf9d856af522df4b45a77c6","scripts":{"test":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","build":"tsc","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.4.0_1767616041577_0.3333445754561819","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@boooply/ai-interviews-sdk","version":"1.6.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.6.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"2a19f546cb14d415be3879e17690345e67762729","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.6.0.tgz","fileCount":7,"integrity":"sha512-51UZmDhnmw58NSRwAQG+MLZf5sJuoX0Wd0wKOsypT94Vfa6LCFsmhUyuVJI7V4pjUImyHMaWwmXJhM5IAzoo0g==","signatures":[{"sig":"MEYCIQCGj/nSS4eGNyLfaBni7BC+mQBImlp4jll7pDS+/KBQagIhAIKQzZneqU9Kr5hQ+rlpOKtWXt/n9j5fSua30xcHEhaN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31591},"main":"index.js","types":"index.d.ts","gitHead":"9acf6094d37714811f51da100335660c35819fbf","scripts":{"test":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","build":"tsc","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.3.0","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.2.0","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.6.0_1767620878276_0.7005100477444246","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@boooply/ai-interviews-sdk","version":"1.7.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@1.7.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"1e47d2ff532356b106f7eba61a3656ac449dde0b","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-1.7.0.tgz","fileCount":7,"integrity":"sha512-ZiWrDkPTP010kGVbaDJpIgGqLbE4eO3z+YTvKcjXrnRGHYxFtf0A/fR1JCHRO5ALl0mP5Nwz9DFyxlH3vh468A==","signatures":[{"sig":"MEQCIA9rrrPOLNbVt/mlXLR4hw5BUsa1TA+VD5DnefoEgTCCAiAgb79T4OGSiitjbexfHZr1mT3WczQIjxcR56KVhKONAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31591},"main":"index.js","types":"index.d.ts","gitHead":"45eece2e3af597b850b2dc3f8cea74eec1ea0335","scripts":{"test":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","build":"tsc","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"11.6.2","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_1.7.0_1771447863964_0.6737968313914209","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@boooply/ai-interviews-sdk","version":"2.0.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@2.0.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"5c6915a9a60ae036d4fe40d06119a0d10f69507c","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-2.0.0.tgz","fileCount":8,"integrity":"sha512-pPJD2YXIrQag8Mi7AAWwelDlZIbEKzBuSLy4rnwwGQ5Gj/9BTknze9GyQ/4TqRWw+2LofKlPiBuEFRQX0R/Uvw==","signatures":[{"sig":"MEUCIQDwkok0h5sgXvdD74DJHOxnbyqDmpfPo+CcTLoWWWU7TQIgGRKmV3IlyOHAHQpIIu37TcRsVfSe9OGFJGRiWpUiJLU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36819},"main":"index.js","types":"index.d.ts","gitHead":"9ca30a29dd28b87966bc111be03a27d40ff7ad45","scripts":{"test":"node test/sdk.test.js","build":"tsc","test:e2e":"bash test/setup-sdk-test.sh","test:legacy":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:e2e:quick":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/test-e2e.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"20.20.1","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_2.0.0_1774109591782_0.8750365746502851","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@boooply/ai-interviews-sdk","version":"2.1.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@2.1.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"18c4e23d75b4014c2de9c981912a8a22ce5d4157","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-2.1.0.tgz","fileCount":8,"integrity":"sha512-nwnYq5VdjFBK3XLi9E23i8LGGJ7ufAIEhUlVWDC8MnuvdPxTK26RpkWazujLcPtlGmhKOhaFC13JN3kPyAQnpg==","signatures":[{"sig":"MEUCIQCjM1vCeFcouYb7kXdCRLwKI4AKeciWcGtUyKtqPaW8YwIgJZENJkzAG09v9RX3dw27g6kZylsaF7FiIHqzuVxhruA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37849},"main":"index.js","types":"index.d.ts","gitHead":"9ca30a29dd28b87966bc111be03a27d40ff7ad45","scripts":{"test":"node test/sdk.test.js","build":"tsc","test:e2e":"bash test/setup-sdk-test.sh","test:legacy":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:e2e:quick":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/test-e2e.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"20.20.1","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_2.1.0_1774297196991_0.9925198375327466","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@boooply/ai-interviews-sdk","version":"2.2.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@2.2.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"edb43e2c9652ea5d700fea337039fe5e829b22b3","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-2.2.0.tgz","fileCount":8,"integrity":"sha512-zaAUJH6QZiOLiQXt875jNOXYTazo+Te2dpHgF4w+b2jJmgnZebDD2SprSyhMX9uHE1EnQ6yPXCY8YMRc/x5C0g==","signatures":[{"sig":"MEUCIDcjK0PItlLuBaRUGx84JP7CUPwkeChxNwRuWsasYQ2lAiEA6LKK2D08RRXOPMzFNf8ziUHMsya8fuPBiheWcaxi9HA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49809},"main":"index.js","types":"index.d.ts","gitHead":"d08b498ac8fbef5eb56142dcb1a047ee0e1dc8f0","scripts":{"test":"node test/sdk.test.js","build":"tsc","test:e2e":"bash test/setup-sdk-test.sh","test:legacy":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:e2e:quick":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/test-e2e.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"20.20.1","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_2.2.0_1774346540179_0.19273314407990738","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@boooply/ai-interviews-sdk","version":"2.3.0","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","_id":"@boooply/ai-interviews-sdk@2.3.0","maintainers":[{"name":"55studio","email":"can@55.studio"}],"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"dist":{"shasum":"b5c48674f60617667206d18393f38327cc1155c8","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-2.3.0.tgz","fileCount":8,"integrity":"sha512-vkSx2D57GCy7rxgssb83wn3xK0epYVMY64dcbHIkXJgLaRp4TzVYH56kZbpFyaLpB3i3cBqnOaDSHHegpVHyuQ==","signatures":[{"sig":"MEUCIQCUEgTuRkBuTJUvjoHyfBS9fKcDyF3wOgg1Tvfv8GRF5AIgWOa8Uqb+lHFPooR4y/v2n4jNRvxQueLkG1vF3fjxoqQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52619},"main":"index.js","types":"index.d.ts","gitHead":"ca53a8bdfb101bae95f93f1a7637a32a9cc1b2d7","scripts":{"test":"node test/sdk.test.js","build":"tsc","test:e2e":"bash test/setup-sdk-test.sh","test:legacy":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:e2e:quick":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/test-e2e.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"_npmUser":{"name":"55studio","email":"can@55.studio"},"repository":{"url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Boooply AI Interviews Integration SDK","directories":{},"_nodeVersion":"20.20.1","dependencies":{"axios":"^1.12.2"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^17.2.3","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-interviews-sdk_2.3.0_1774355743379_0.019419344598347488","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@boooply/ai-interviews-sdk","version":"2.4.0","description":"Boooply AI Interviews Integration SDK","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git"},"scripts":{"build":"tsc","test":"node test/sdk.test.js","test:e2e":"bash test/setup-sdk-test.sh","test:e2e:quick":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/test-e2e.js","test:legacy":"NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:platform":"TEST_MODE=platform NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js","test:organization":"TEST_MODE=organization NODE_TLS_REJECT_UNAUTHORIZED=0 node test/runner.js"},"keywords":["boooply","ai-interviews","meetings","sdk","integration"],"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","dependencies":{"axios":"^1.12.2"},"devDependencies":{"@types/node":"^20.0.0","dotenv":"^17.2.3","typescript":"^5.0.0"},"_id":"@boooply/ai-interviews-sdk@2.4.0","gitHead":"ca53a8bdfb101bae95f93f1a7637a32a9cc1b2d7","bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-Q263+JC3Wd2dlproY5+mePyKYV76ndy/7taPUCRyx24c59Vw2hwpRQKxcPhVnAQwAz3lN3X7VTtLZurRxvc9Eg==","shasum":"31110423bc542637cfa4ec6d2b35588651377206","tarball":"https://registry.npmjs.org/@boooply/ai-interviews-sdk/-/ai-interviews-sdk-2.4.0.tgz","fileCount":8,"unpackedSize":53907,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHU8V1JB6YbKZSH2+gIRoMfXpvWhcF67X3ApATPvaoBCAiA03VnX5tu4XFDbytk9+H/OwiVkcPIe92yjPhF5z4Tpkg=="}]},"_npmUser":{"name":"55studio","email":"can@55.studio"},"directories":{},"maintainers":[{"name":"55studio","email":"can@55.studio"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-interviews-sdk_2.4.0_1774383665163_0.881275332404351"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-14T18:48:50.233Z","modified":"2026-03-24T20:21:05.466Z","1.0.0":"2025-10-14T18:48:50.521Z","1.0.1":"2025-10-14T18:54:43.980Z","1.0.2":"2025-10-14T19:18:31.217Z","1.0.3":"2025-10-14T19:45:37.998Z","1.0.6":"2025-10-14T21:31:35.495Z","1.0.7":"2025-10-14T21:57:36.163Z","1.0.8":"2025-10-14T22:19:48.141Z","1.1.0":"2025-10-15T08:44:29.413Z","1.4.0":"2026-01-05T12:27:21.740Z","1.6.0":"2026-01-05T13:47:58.436Z","1.7.0":"2026-02-18T20:51:04.111Z","2.0.0":"2026-03-21T16:13:11.958Z","2.1.0":"2026-03-23T20:19:57.136Z","2.2.0":"2026-03-24T10:02:20.312Z","2.3.0":"2026-03-24T12:35:43.580Z","2.4.0":"2026-03-24T20:21:05.312Z"},"bugs":{"url":"https://github.com/55studio/boooply-ai-interviews-sdk/issues"},"author":{"name":"Can Mehmet","email":"can@55.studio"},"license":"MIT","homepage":"https://github.com/55studio/boooply-ai-interviews-sdk#readme","keywords":["boooply","ai-interviews","meetings","sdk","integration"],"repository":{"type":"git","url":"git+https://github.com/55studio/boooply-ai-interviews-sdk.git"},"description":"Boooply AI Interviews Integration SDK","maintainers":[{"name":"55studio","email":"can@55.studio"}],"readme":"# Boooply AI Interviews SDK\n\nOfficial JavaScript/Node.js SDK for the [Boooply AI Interviews](https://boooply.com) API.\n\n## Installation\n\n```bash\nnpm install @boooply/ai-interviews-sdk\n```\n\n## Quick Start\n\n```javascript\nconst { BoooplyClient } = require('@boooply/ai-interviews-sdk');\n\nconst client = new BoooplyClient({\n  apiKey: process.env.BOOOPLY_API_KEY,       // Required — bply_... format\n  baseUrl: process.env.BOOOPLY_BASE_URL,     // Required — e.g. https://api.meetings.boooply.com\n  timeout: 30000,                            // Optional — request timeout in ms\n});\n\n// Create an AI interview\nconst interview = await client.interviews.create({\n  type: 'ai',\n  jobRole: 'Senior Frontend Engineer',\n  candidate: { name: 'Jane Doe', email: 'jane@example.com' },\n  skills: ['React', 'TypeScript'],\n  durationMinutes: 20,\n});\n\nconsole.log('Interview created:', interview.meetingCode);\nconsole.log('Join URL:', interview.url);\n```\n\n## Authentication\n\nThe SDK uses Bearer token authentication. Your API key is automatically included in all requests.\n\n### Getting an API Key\n\nContact Boooply or use the platform onboarding endpoint (see [Platform Providers](#platform-providers)).\n\n```bash\n# .env\nBOOOPLY_API_KEY=bply_org_xxxxxxxxxxxxx\nBOOOPLY_BASE_URL=https://api.meetings.boooply.com\n```\n\n> **Security:** Store your API key in environment variables. Never expose it in client-side code.\n\n---\n\n## API Reference\n\nThe SDK uses a **namespaced API** pattern:\n\n```\nclient.interviews.*    — Create, list, manage interviews\nclient.ai.*            — AI-powered features\nclient.organization.*  — Organization info\n```\n\n---\n\n### `client.interviews`\n\n#### `interviews.create(data)` — Create an interview\n\nA single unified method for creating AI interviews, human interviews, and team meetings.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `type` | `'ai' \\| 'human' \\| 'team'` | Yes | Interview type |\n| `jobRole` | `string` | Yes (ai/human) | Job role or title |\n| `candidate` | `{ name, email }` | Yes (ai) | Candidate info |\n| `participants` | `Array<{ name, email, role }>` | Yes (human/team) | Participant list |\n| `scheduledAt` | `string` | No | ISO 8601 datetime (required for `FIXED` mode) |\n| `schedulingMode` | `'IMMEDIATE' \\| 'FIXED' \\| 'CANDIDATE_PICKS'` | No | Scheduling mode (see [Scheduling Modes](#scheduling-modes)) |\n| `availableSlots` | `Array<{ start, end }>` | No | Time slots to offer the candidate (used with `CANDIDATE_PICKS` mode, max 50) |\n| `durationMinutes` | `number` | No | Duration (default: 30, min: 5) |\n| `skills` | `string[]` | No | Skills to evaluate |\n| `seniority` | `'JUNIOR' \\| 'MID' \\| 'SENIOR' \\| 'LEAD' \\| 'PRINCIPAL'` | No | Seniority level |\n| `department` | `string` | No | Department name |\n| `jobDescription` | `string` | No | Full job description |\n| `candidateCV` | `string` | No | CV/resume text |\n| `questions` | `string[]` | No | Custom interview questions |\n| `aiGenerate` | `boolean` | No | Auto-generate questions with AI |\n| `workSetup` | `'REMOTE' \\| 'ONSITE' \\| 'HYBRID'` | No | Work arrangement |\n| `employmentType` | `'FULL_TIME' \\| 'PART_TIME' \\| 'CONTRACT'` | No | Employment type |\n| `evaluationFocus` | `string` | No | `'knowledge' \\| 'balanced' \\| 'communication' \\| 'problem_solving' \\| 'culture'` |\n| `title` | `string` | No | Custom interview title. Default: \"AI Interview with {name} for {role} at {company}\" |\n| `category` | `string` | No | Interview category: `SCREENING` \\| `TECHNICAL` \\| `BEHAVIORAL` \\| `ASSIGNMENT` \\| `CULTURAL` \\| `CASE_STUDY` \\| `PANEL` \\| `FINAL` |\n| `stage` | `string` | No | Free-form stage label from your ATS (e.g., \"Round 1\", \"Final Interview\", \"Phone Screen\") |\n| `companyName` | `string` | No | Company name (defaults to your organization name). Useful for agencies posting for multiple clients |\n| `sendCandidateFeedback` | `boolean` | No | Send AI-generated feedback email to candidate after evaluation |\n| `externalJobId` | `string` | No | External job/position ID from your ATS |\n\n> **Emails:** When an interview is created, Boooply automatically sends invitation emails to all participants from `noreply@boooply.com`. Candidates receive a join link (or booking link for `CANDIDATE_PICKS` mode), and interviewers receive a separate join link. If `sendCandidateFeedback` is enabled, the candidate also receives an AI-generated feedback email after the evaluation completes.\n\n**Examples:**\n\n```javascript\n// AI Interview — candidate talks to AI interviewer\nconst ai = await client.interviews.create({\n  type: 'ai',\n  jobRole: 'Frontend Engineer',\n  candidate: { name: 'Jane Doe', email: 'jane@example.com' },\n  skills: ['React', 'TypeScript', 'CSS'],\n  seniority: 'SENIOR',\n  durationMinutes: 20,\n  aiGenerate: true,\n  evaluationFocus: 'balanced',\n  externalJobId: 'job_123',  // links to your ATS position\n});\n\n// Human Interview — real interviewer + candidate\nconst human = await client.interviews.create({\n  type: 'human',\n  jobRole: 'Backend Engineer',\n  scheduledAt: '2026-04-01T14:00:00Z',\n  participants: [\n    { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' },\n    { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' },\n  ],\n  skills: ['Node.js', 'PostgreSQL'],\n});\n\n// Human Interview — let candidate pick a time slot\nconst flexible = await client.interviews.create({\n  type: 'human',\n  jobRole: 'Product Designer',\n  schedulingMode: 'CANDIDATE_PICKS',\n  participants: [\n    { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' },\n    { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' },\n  ],\n  availableSlots: [\n    { start: '2026-04-01T09:00:00Z', end: '2026-04-01T10:00:00Z' },\n    { start: '2026-04-01T14:00:00Z', end: '2026-04-01T15:00:00Z' },\n    { start: '2026-04-02T11:00:00Z', end: '2026-04-02T12:00:00Z' },\n  ],\n  skills: ['Figma', 'Design Systems'],\n});\n// → Candidate receives a booking link to pick one of the offered slots\n\n// Team Meeting — internal meeting with transcription\nconst team = await client.interviews.create({\n  type: 'team',\n  scheduledAt: '2026-04-01T10:00:00Z',\n  participants: [\n    { name: 'Alice', email: 'alice@company.com', role: 'HOST' },\n    { name: 'Bob', email: 'bob@company.com', role: 'PARTICIPANT' },\n    { name: 'Carol', email: 'carol@company.com', role: 'PARTICIPANT' },\n  ],\n});\n```\n\n**Returns:**\n\n```javascript\n{\n  meetingCode: 'Boooply-AI-1234567890',\n  url: 'https://meetings.boooply.com/join/Boooply-AI-1234567890',\n  meetingType: 'AI_ONLY',\n  sessionStatus: 'SCHEDULED',\n  participants: [\n    { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE', joinToken: '...' }\n  ]\n}\n```\n\n---\n\n#### Scheduling Modes\n\nControl when the interview takes place:\n\n| Mode | Behavior | Available for |\n|------|----------|---------------|\n| `IMMEDIATE` | Interview is available to join right away (default for AI interviews) | AI, Human, Team |\n| `FIXED` | Interview is scheduled for a specific `scheduledAt` datetime | AI, Human, Team |\n| `CANDIDATE_PICKS` | Candidate receives a booking link to choose from `availableSlots` | AI, Human only |\n\n> **Note:** `CANDIDATE_PICKS` is not available for team meetings — there is no candidate to send a booking link to. Use `IMMEDIATE` or `FIXED` instead.\n\n**`CANDIDATE_PICKS` flow:**\n\n1. You create the interview with `schedulingMode: 'CANDIDATE_PICKS'` and an `availableSlots` array\n2. The candidate receives an email with a booking link\n3. The candidate picks one of the offered time slots\n4. The interview is confirmed — all participants are notified and calendar events are created\n5. The booking link expires after 7 days if no slot is selected\n\nEach slot in `availableSlots` is an object with `start` and `end` (ISO 8601 strings). You can offer up to 50 slots. Make sure each slot's duration matches the `durationMinutes` value — the booking page displays the time range based on the interview duration.\n\n```javascript\n// 30-minute interview → each slot spans 30 minutes\nawait client.interviews.create({\n  type: 'human',\n  jobRole: 'Product Designer',\n  durationMinutes: 30,\n  schedulingMode: 'CANDIDATE_PICKS',\n  participants: [\n    { name: 'Jane', email: 'jane@example.com', role: 'CANDIDATE' },\n    { name: 'Bob', email: 'bob@company.com', role: 'INTERVIEWER' },\n  ],\n  availableSlots: [\n    { start: '2026-04-01T09:00:00Z', end: '2026-04-01T09:30:00Z' },\n    { start: '2026-04-01T14:00:00Z', end: '2026-04-01T14:30:00Z' },\n  ],\n});\n```\n\n> **Tip for ATS integrations:** You have two options for providing time slots:\n> 1. **Pull from Boooply** — Use `getAvailability()` to fetch slots from the interviewer's Google Calendar already connected in Boooply (see below)\n> 2. **Push from your ATS** — Use your own calendar integration and pass `availableSlots` directly\n\n---\n\n#### `interviews.getAvailability(params)` — Get interviewer availability\n\nFetch available time slots from a team member's Google Calendar connected in Boooply. This lets you pull interviewer availability without building your own calendar integration.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `email` | `string` | Yes | Team member's email address |\n| `durationMinutes` | `number` | No | Slot duration in minutes (default: 30) |\n| `days` | `number` | No | Days ahead to look (default: 14, max: 30) |\n\n**Returns:**\n\n```javascript\n{\n  calendarConnected: true,      // false if user hasn't connected Google Calendar\n  email: 'bob@company.com',\n  durationMinutes: 30,\n  days: 14,\n  slots: [\n    { start: '2026-04-01T09:00:00Z', end: '2026-04-01T09:30:00Z' },\n    { start: '2026-04-01T09:30:00Z', end: '2026-04-01T10:00:00Z' },\n    // ...\n  ],\n  total: 42,\n}\n```\n\n**Example — full scheduling flow:**\n\n```javascript\n// 1. Check interviewer availability from Boooply\nconst { calendarConnected, slots } = await client.interviews.getAvailability({\n  email: 'bob@company.com',\n  durationMinutes: 45,\n  days: 7,\n});\n\nif (calendarConnected && slots.length > 0) {\n  // 2a. Use Boooply's calendar data → let candidate pick\n  const interview = await client.interviews.create({\n    type: 'human',\n    jobRole: 'Product Designer',\n    durationMinutes: 45,\n    schedulingMode: 'CANDIDATE_PICKS',\n    participants: [\n      { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' },\n      { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' },\n    ],\n    availableSlots: slots,\n  });\n} else {\n  // 2b. Fallback: use your own calendar integration to provide slots\n  const interview = await client.interviews.create({\n    type: 'human',\n    jobRole: 'Product Designer',\n    durationMinutes: 45,\n    schedulingMode: 'CANDIDATE_PICKS',\n    participants: [\n      { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' },\n      { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' },\n    ],\n    availableSlots: myCalendarService.getSlots('bob@company.com', 45),\n  });\n}\n```\n\n> If `calendarConnected` is `false`, the user hasn't connected Google Calendar in Boooply. You can either prompt them to connect it, or fall back to your own calendar integration.\n\n---\n\n#### `interviews.getBusyBlocks(params)` — Get calendar busy blocks\n\nFetch raw busy time blocks from a team member's Google Calendar. Unlike `getAvailability()` which returns computed available slots, this returns the raw busy periods — useful if you want to compute availability using your own logic (e.g., different working hours, custom slot durations, or merging with other calendars).\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `email` | `string` | Yes | Team member's email address |\n| `days` | `number` | No | Days ahead to look (default: 14, max: 30) |\n\n**Returns:**\n\n```javascript\n{\n  calendarConnected: true,\n  email: 'bob@company.com',\n  days: 14,\n  timezone: 'Europe/Berlin',\n  busyBlocks: [\n    { start: '2026-04-01T09:00:00Z', end: '2026-04-01T10:00:00Z' },\n    { start: '2026-04-01T13:00:00Z', end: '2026-04-01T14:30:00Z' },\n    // ...\n  ],\n  total: 18,\n}\n```\n\n**Example:**\n\n```javascript\nconst { calendarConnected, busyBlocks, timezone } = await client.interviews.getBusyBlocks({\n  email: 'bob@company.com',\n  days: 7,\n});\n\nif (calendarConnected) {\n  // Use busy blocks to compute your own availability\n  const available = myScheduler.findOpenSlots(busyBlocks, {\n    timezone,\n    workingHours: { start: 8, end: 18 },\n    slotDuration: 60,\n  });\n}\n```\n\n> **When to use `getBusyBlocks` vs `getAvailability`:**\n> - Use `getAvailability()` when you want ready-to-use slots (Mon–Fri, 9–5, filtered by duration)\n> - Use `getBusyBlocks()` when you need raw data to compute availability with your own rules\n\n---\n\n#### `interviews.list(params?)` — List interviews\n\n```javascript\nconst { interviews, total, page } = await client.interviews.list({\n  status: 'COMPLETED',     // SCHEDULED | ACTIVE | COMPLETED | CANCELLED\n  type: 'AI_ONLY',         // AI_ONLY | HUMAN | HYBRID\n  search: 'frontend',      // search by role, candidate name, email\n  page: 1,\n  limit: 20,\n});\n```\n\n---\n\n#### `interviews.get(meetingCode)` — Get interview details\n\n```javascript\nconst interview = await client.interviews.get('Boooply-AI-1234567890');\n\nconsole.log(interview.sessionStatus);   // 'COMPLETED'\nconsole.log(interview.meetingType);     // 'AI_ONLY'\nconsole.log(interview.participants);    // [{ name, email, role, joinToken }]\n```\n\n---\n\n#### `interviews.getTranscript(meetingCode)` — Get transcript\n\nReturns the full conversation transcript after the interview is completed.\n\n```javascript\nconst { transcript } = await client.interviews.getTranscript('Boooply-AI-1234567890');\n\n// transcript = [\n//   { speaker: 'AI Interviewer', role: 'AI', content: 'Tell me about...', timestamp: '...' },\n//   { speaker: 'Jane Doe', role: 'CANDIDATE', content: 'I worked on...', timestamp: '...' },\n// ]\n```\n\n---\n\n#### `interviews.getEvaluation(meetingCode)` — Get AI evaluation\n\nReturns AI-generated scores and analysis after the interview is completed.\n\n```javascript\nconst evaluation = await client.interviews.getEvaluation('Boooply-AI-1234567890');\n\n// evaluation = {\n//   recommendation: 'PASS',       // PASS | FAIL | REVIEW\n//   overallScore: 82,             // 0-100\n//   communication: 85,\n//   technical: 78,\n//   cultureFit: 90,\n//   questionEvaluations: [...]\n// }\n```\n\n---\n\n#### `interviews.triggerAnalysis(meetingCode)` — Re-run AI analysis\n\nTriggers (or re-triggers) AI analysis on a completed interview.\n\n```javascript\nawait client.interviews.triggerAnalysis('Boooply-AI-1234567890');\n```\n\n---\n\n#### `interviews.addParticipant(meetingCode, data)` — Add participant\n\n```javascript\nconst result = await client.interviews.addParticipant('Boooply-AI-1234567890', {\n  participants: [\n    { name: 'Late Joiner', email: 'late@company.com', role: 'INTERVIEWER' }\n  ]\n});\n```\n\n---\n\n#### `interviews.getParticipants(meetingCode)` — Get participants\n\n```javascript\nconst { participants, total } = await client.interviews.getParticipants('Boooply-AI-1234567890');\n// participants = [{ id, name, email, role, joinToken, joinedAt, leftAt, isActive }]\n```\n\n---\n\n#### `interviews.removeParticipant(meetingCode, participantId)` — Remove participant\n\n```javascript\nawait client.interviews.removeParticipant('Boooply-AI-1234567890', 'participant-uuid');\n```\n\n---\n\n#### `interviews.getRecording(meetingCode)` — Get recording\n\nReturns the video recording for a completed interview, with both a pre-signed URL (7-day expiry) and a stable API URL.\n\n```javascript\nconst { recording } = await client.interviews.getRecording('Boooply-AI-1234567890');\n\nif (recording) {\n  console.log(recording.duration);    // seconds\n  console.log(recording.format);      // 'mp4'\n  console.log(recording.videoUrl);    // pre-signed S3 URL (expires in 7 days)\n  console.log(recording.videoApiUrl); // stable URL (generates fresh link on each request)\n}\n```\n\n> **Tip:** Store `videoApiUrl` — it always works. The `videoUrl` expires after 7 days.\n\n---\n\n#### `interviews.reschedule(meetingCode, data)` — Reschedule\n\n```javascript\nawait client.interviews.reschedule('Boooply-AI-1234567890', {\n  scheduledAt: '2026-04-05T14:00:00Z',\n  durationMinutes: 30,\n  reason: 'Candidate requested new time',\n});\n```\n\n---\n\n#### `interviews.cancel(meetingCode, reason?)` — Cancel\n\n```javascript\nawait client.interviews.cancel('Boooply-AI-1234567890', 'Position filled');\n```\n\n---\n\n#### `interviews.delete(meetingCode)` — Delete permanently\n\n```javascript\nawait client.interviews.delete('Boooply-AI-1234567890');\n// ⚠️ This is irreversible\n```\n\n---\n\n### `client.ai`\n\n#### `ai.generateJobDescription(data)` — Generate job description with AI\n\n```javascript\nconst { jobDescription } = await client.ai.generateJobDescription({\n  jobRole: 'Senior Frontend Engineer',\n  department: 'Engineering',\n  skills: ['React', 'TypeScript', 'GraphQL'],\n  seniority: 'SENIOR',\n  workSetup: 'REMOTE',\n  employmentType: 'FULL_TIME',\n});\n```\n\n---\n\n### `client.organization`\n\n#### `organization.get()` — Get organization details\n\n```javascript\nconst org = await client.organization.get();\nconsole.log(org.name, org.slug);\n```\n\n---\n\n## Participant Mappers\n\nHelper functions to convert users from external platforms into Boooply's participant format.\n\n```javascript\nconst {\n  mapGoogleParticipant,\n  mapMicrosoftParticipant,\n  mapGenericParticipant,\n} = require('@boooply/ai-interviews-sdk');\n```\n\n### Google\n\n```javascript\nconst participant = mapGoogleParticipant({\n  name: 'Jane Smith',\n  email: 'jane@gmail.com',\n  id: 'google-user-id-123',\n  picture: 'https://...',\n  role: 'INTERVIEWER',       // optional, defaults to INTERVIEWER\n});\n```\n\n### Microsoft\n\n```javascript\nconst participant = mapMicrosoftParticipant({\n  displayName: 'Bob Johnson',\n  mail: 'bob@company.com',\n  id: 'ms-user-id-456',\n  role: 'HOST',              // optional, defaults to INTERVIEWER\n});\n```\n\n### Generic\n\n```javascript\nconst participant = mapGenericParticipant({\n  name: 'John Doe',\n  email: 'john@example.com',\n  externalUserId: '12345',\n  authProvider: 'YOUR_PLATFORM',\n  role: 'CANDIDATE',\n});\n```\n\n---\n\n## Platform Providers\n\nFor multi-tenant platforms that integrate Boooply for multiple organizations.\n\n### `BoooplyClient.createOrganizationApiKey(config, data)` — Static\n\nCreates an organization-specific API key. Call this from your backend when an organization connects to Boooply.\n\n```javascript\nconst result = await BoooplyClient.createOrganizationApiKey(\n  {\n    baseUrl: 'https://api.meetings.boooply.com',\n    platformKey: process.env.BOOOPLY_PLATFORM_KEY,  // your platform master key\n  },\n  {\n    userId: '12345',\n    userEmail: 'admin@acme.com',\n    userName: 'Jane Admin',\n    organizationId: 'org_7234567890',      // your platform's org ID\n    organizationName: 'Acme Corporation',\n    teamMembers: [                         // optional — import team\n      { email: 'bob@acme.com', name: 'Bob', role: 'ADMIN' },\n    ],\n  }\n);\n\n// Store result.apiKey for this organization\nconsole.log(result.apiKey);  // 'bply_tenant_xxxxx'\n```\n\n> **Security:** Only call this from your server. The platform key grants elevated privileges.\n\n---\n\n## Webhooks\n\nBoooply can send real-time webhook events to your server when interviews reach key milestones — transcript ready, evaluation complete, scores available, or recording ready.\n\nWebhooks are configured in your [Boooply dashboard](https://boooply.com) under **Integrations**, not through the SDK. See the [Webhooks documentation](https://docs.boooply.com/webhooks) for event payloads, signature verification, and setup instructions.\n\n---\n\n## Error Handling\n\n```javascript\ntry {\n  const interview = await client.interviews.create({ ... });\n} catch (error) {\n  console.error(error.message);    // 'Boooply API 400: {...}'\n  console.error(error.status);     // 400\n  console.error(error.response);   // full axios response\n}\n```\n\nCommon errors:\n\n| Status | Meaning |\n|--------|---------|\n| `400` | Invalid parameters (check required fields) |\n| `401` | Invalid or expired API key |\n| `403` | Insufficient permissions |\n| `404` | Interview not found |\n| `429` | Rate limit exceeded |\n\n---\n\n## TypeScript Support\n\nThe SDK ships with JSDoc type definitions that provide IntelliSense in TypeScript and modern editors:\n\n```typescript\nimport {\n  BoooplyClient,\n  mapGoogleParticipant,\n} from '@boooply/ai-interviews-sdk';\n\nconst client = new BoooplyClient({\n  apiKey: process.env.BOOOPLY_API_KEY!,\n  baseUrl: 'https://api.meetings.boooply.com',\n});\n```\n\n---\n\n## Migration from v1\n\nv2 introduces a namespaced API. All v1 methods still work but are deprecated.\n\n| v1 (deprecated) | v2 |\n|------------------|----|\n| `client.createAIInterview(data)` | `client.interviews.create({ type: 'ai', ... })` |\n| `client.createHumanInterview(data)` | `client.interviews.create({ type: 'human', ... })` |\n| `client.createTeamMeeting(data)` | `client.interviews.create({ type: 'team', ... })` |\n| `client.listInterviews()` | `client.interviews.list()` |\n| `client.getInterview(code)` | `client.interviews.get(code)` |\n| `client.cancelInterview(code)` | `client.interviews.cancel(code)` |\n| `client.rescheduleInterview(code, data)` | `client.interviews.reschedule(code, data)` |\n| `client.deleteInterview(code)` | `client.interviews.delete(code)` |\n| `client.addParticipant(code, data)` | `client.interviews.addParticipant(code, data)` |\n| `client.getTranscript(code)` | `client.interviews.getTranscript(code)` |\n| `client.getEvaluation(code)` | `client.interviews.getEvaluation(code)` |\n| `client.triggerAnalysis(code)` | `client.interviews.triggerAnalysis(code)` |\n| `client.generateJobDescription(data)` | `client.ai.generateJobDescription(data)` |\n| `client.getOrganization()` | `client.organization.get()` |\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}