{"_id":"@outcrawl/sdk","_rev":"21-4ab445ecae59e701f9033829690c8d6b","name":"@outcrawl/sdk","dist-tags":{"latest":"0.4.15"},"versions":{"0.1.0":{"name":"@outcrawl/sdk","version":"0.1.0","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"_id":"@outcrawl/sdk@0.1.0","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"9e8a96fa1a24947c21dd65c25dbc446f9da67c3f","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.0.tgz","fileCount":32,"integrity":"sha512-Nq8CM3onY0wdQ+HbN1a4PKZh6OGi6hhdS+4C3P3kTlgrVGpU0L7eMInzeyIdeWZI+1MPs9WMXCCyxeFUz+NJqQ==","signatures":[{"sig":"MEUCIQDQug2dq4YHsIuInt2VnsAW8juydeBIMw2g7OndPdGHTQIgezhuWUxH2YZyLR9lSSoi31AHbfe4hPU9ly5XzWsHJBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":454469},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"c495db11219b6aa34c5c53caec9c6f0fc09248ac","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"agenthands":">=1.1.1","playwright":"^1.56.0"},"peerDependenciesMeta":{"agenthands":{"optional":true},"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1788889288896_0.03892174045676855","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@outcrawl/sdk","version":"0.1.1","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.1.1","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"dc5e54d09805da9205e5a52a4f05fc524ea3a121","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.1.tgz","fileCount":34,"integrity":"sha512-cLrU4VhqNECTjCVSE4YNFVm1irk1hykiXhrulB2RrqMDUMJb5MbLPvK3oEKpJq3qLzayKw8eQNTbBeH2W6RN8w==","signatures":[{"sig":"MEUCIQDlMiFMYInYfrkTMrYYaMkk5CO0ZJn7RQM0ioMg7Lyj9AIgKw1QlaHEsoMH6NvgvRRyY/MIIVr1gGUbIz40Bz8c98o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550279},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"2bc6c4f9e6c38ae92a1e874d89639130bff4816e","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1789251696061_0.21028450079104566","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@outcrawl/sdk","version":"0.1.2","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.1.2","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"69766d2a875b0fac70c0a61369d90e3953582a2a","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.2.tgz","fileCount":34,"integrity":"sha512-Xu2LU8mdHCus3K1LvT03XFhpexbYPay3etSUJGP8JugHdCbU0PQ+fJAAkijgOxjoOrfRXh6e4pIv2r3DhWJCEg==","signatures":[{"sig":"MEUCIQCYoPCGt7FAfvsEmJKxJyoCrVKkZgj8mjznKY3u17a7UgIgKI3M31fa6nMfRsD7P0JNIwbPxewfJOvfebPCGHtYnXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":563632},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"851cdad9d562255ddc2eeaec0186874ba62178a8","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1789594505497_0.056632744710664706","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@outcrawl/sdk","version":"0.1.3","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.1.3","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"573c3ab996c5c07aa12fd8f8751190e8f753a6ea","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.3.tgz","fileCount":34,"integrity":"sha512-2RfMd2GqRsOgidnhTFtLf7EhhRrApjqepqXACxYaiq4MiTcO7b6xfgI3F/J6Oql230iSWfFBa+NCslveNjElBw==","signatures":[{"sig":"MEUCIFpxqEbl6DIomZJ8xJ2cm8ndAluywGnHpJ3Oa/fSR+rnAiEArXGfUkALmhTNsWjK9g8mkiV8UPghQ82VBXmHSz0AIOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":571570},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"446447823444ee54b770eb4c737fd2ea70700660","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.3_1789612850708_0.5849976214491033","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@outcrawl/sdk","version":"0.1.4","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.1.4","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"d522d1aabef034626d7961eb6d4b8fb5e497e6b3","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.4.tgz","fileCount":34,"integrity":"sha512-de/j9Z1AvdEtVlOArzzDY2mo1Gp67hW9quaW210OXbGdyJD8uowEM3+uYpahdiBAfH9uU51Fc3CuszQnFMLvmg==","signatures":[{"sig":"MEUCIAQDweI8qHX59G0UXZXfgucW8ApoqgdbgIl2pfyDyxsZAiEAqez1j3CLSUW3m6rwMnXrVQku1c7R+ammKkW3eyxucjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE9z+8LtjOCeK6FCQr9O/5yGT+g3zPxeJ2Y2cwwrPM6/AiBkF7tk3s0PgF33QS15uN8qMiuvqnjpWZ1ClHLzpph3dA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":573653},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"a6011631d73064c7ddc75d70f4b440331dd259b2","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.4_1790000468849_0.14508157010203182","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@outcrawl/sdk","version":"0.1.5","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.1.5","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"66bc3459461edfff30c290f8593370d6ae738547","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.1.5.tgz","fileCount":34,"integrity":"sha512-LbbNkuORr/hiQE0/4q1iqnVGj9fe9tGAgKeaCk79p6qTWjSA3FTGiL9XJbpPh1aIAtEas6MgitH5mSvQlZsAQg==","signatures":[{"sig":"MEUCIDKpT42PW23cgyFVwft6kioC6Rz+g2qjPePrVRNzSoXoAiEAiU8HvgPIHNG5NySN6SHeCQoBL4IwwTm+NYNf7WH9LjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF8Z6bDwi2uRrFv7ykXY0qg2ByZOsSTbixhNbocEcOqlAiAqZrPYCAQhi+f3dYK/slnzFMNPBERhM+ATYQzThWRKNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":573665},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"152490420b8ec4b26ef962565b64877ea80fef75","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.5_1790027079840_0.22934519233786288","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@outcrawl/sdk","version":"0.2.0","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.2.0","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"7ae1a89302c64ea274e6fe4c2f019d815d7016ac","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.2.0.tgz","fileCount":34,"integrity":"sha512-SomGth0XqQLjDlwrYh6yJZoNmP5X/FkhlJ0RhXpFRZS1OUoDFqbKnDUmqOThqRKu29pw+xh6eCTJMqzR7gBpXA==","signatures":[{"sig":"MEQCIENtzWeZtxULce1O65eiy/s5Bk3MUp3M5zL0O926X/bdAiA1+7BXSm02gLFepJK+g0Nh5uqSsGM2FUjvmEnHt91Mhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCqhmXALargyMZPb2vsVBlsbP9HiAdg5esT/IDPeI03kAIhAK1Ve6bv9IjCruWi2/ZX9J5N1Xoq4QpKjsyglqYiYBqr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592449},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.2.0.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"_resolved":"/private/tmp/oc-rel020/npm/outcrawl-sdk-0.2.0.tgz","_integrity":"sha512-SomGth0XqQLjDlwrYh6yJZoNmP5X/FkhlJ0RhXpFRZS1OUoDFqbKnDUmqOThqRKu29pw+xh6eCTJMqzR7gBpXA==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1790218781467_0.2587319987792016","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@outcrawl/sdk","version":"0.4.2","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.2","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"d68c8bbcd7cea73fdcebcefa857e9652cc231480","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.2.tgz","fileCount":34,"integrity":"sha512-gekos+o3Ij/Kp0ZFUz6PyI+pkcSPl3VKL/M1bzIl2Ylg0abSFB7eYdNe07ZVOK2F5QP4lYCFke0ndAsJFhpDwQ==","signatures":[{"sig":"MEYCIQCe0UqRExb0teL5EZgPqAAPQQ3lk4mFJI0HIMkglKJyYAIhAJAUJnEc6qnSIttc45Vk+6oSAlH9spXWBsaSag62yuCL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE2BYhMZCWXl/Q/zwC+Jy4JslOoC14jBZd12dyWlBPrlAiBg/x84x9LPi0C92QGSer0zxJTQS18Dk1e/v2Hupq1hSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":675574},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.2_1790371470832_0.346807931984076","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@outcrawl/sdk","version":"0.4.3","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.3","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"99931fbf7d2a267ffd9c32ef1f2acfe193644c7e","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.3.tgz","fileCount":35,"integrity":"sha512-KvOex6897O1LTJko8r8xCV2XpOdPz9+Xah7rJsAp6C7aicVwlpT21Upm3KXLR2B9uTrOPiDn+SsJWveIfAi2JQ==","signatures":[{"sig":"MEQCIHeVI6F9gUS0gBYWMTdeEaeFpbDsFgxQrk16x5fIQfq4AiBTnsCX5Op7jq9Nj8RFM+HPxzyH35arpmh0eEZVprjjGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE3cvUap8OlPnPQKyLmu3bebbC+23CWlPIHG4fDKtZeWAiB90i1/5/O/BGNG0T+ESs5t92GOLLesdOUhwuQ6B1wsAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":751722},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"jishrocks","email":"jishu.nirupam@gmail.com"},"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.19.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.3_1790641116549_0.22143910526637023","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@outcrawl/sdk","version":"0.4.4","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.4","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"1673611e6c3a2f2aced73466b19af8c03da869b7","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.4.tgz","fileCount":35,"integrity":"sha512-k5oWubkhF1e/N0A4wTncIFFzt20NYlOk0i7+fYjkchN/HVPgjRDEB2e+0/1s+G3p7EktGU7HgJWIDAy/g9ISUg==","signatures":[{"sig":"MEUCIQDU9TQCNhmnOIfU+EXN3YUHqXwapuTDGfsoOAkg18hqyQIgdx62ZmZnJ77o0AA9OV9uIxdzwDlDb4bN1LjcFqbheY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCnB9uXuqnQrCdPpYVZosxDMrnBVtORB1swkmA070T0FAIhAK4su06sxEamau1B2rki3YWpt7iDuMaJd/TaLHUrE7A9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":732296},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.4.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.4.tgz","_integrity":"sha512-k5oWubkhF1e/N0A4wTncIFFzt20NYlOk0i7+fYjkchN/HVPgjRDEB2e+0/1s+G3p7EktGU7HgJWIDAy/g9ISUg==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.4_1790836746213_0.47724884220327546","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@outcrawl/sdk","version":"0.4.5","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.5","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"7264abe139dd70a976896b939d3c35d248887d92","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.5.tgz","fileCount":36,"integrity":"sha512-NRosBtx04DSXynq0edKxbO/7Iik5dm2nbL754Uy6ELwKhg68isgJKqv5P3Dpurbtr3llN+Uo/fjdj3caLbdFUA==","signatures":[{"sig":"MEQCICb29/i+UfAc0YtVzQO1kcXO2WcLpLt2pX4wrVP02LG8AiBeZmPMJTK5bpfPy0ICyo8tBRCTw94mpAkQ7e6bw3WYfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFEPa5hAU68ESnUjPSc1tBfa0DTO8p2FiPsjRbpnkjMNAiB8Z4+b7hrt8bTRnjOVR5NWiiN/9abwSOFAx59LOZhvJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":744511},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.5.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.5.tgz","_integrity":"sha512-NRosBtx04DSXynq0edKxbO/7Iik5dm2nbL754Uy6ELwKhg68isgJKqv5P3Dpurbtr3llN+Uo/fjdj3caLbdFUA==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.5_1790941907013_0.58583354418921","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@outcrawl/sdk","version":"0.4.6","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.6","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"ebc679468b27ecd97760bb4f42e4a443e3bd08b4","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.6.tgz","fileCount":36,"integrity":"sha512-s1dDSybASshj61QHJNEzkv88I81ftXjiYatkK/QzvCFRgBRMeQ0NOUqh7FvVvXkrbcHuzgQfdfli7ZN5lCis7A==","signatures":[{"sig":"MEYCIQC5ecRgjPrBngJ71+DsfxD2xtqCSgOvGLibIT5DIFBhQgIhAOWzBVDOc+XxylHhaf6TwkQ4wL+6fUZxDiB+QKmHMKJH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCDkYFH7vIPOqq0ogOYrqDK243LSvRaiAuhKvgT6DYpawIhANWAIRz+buv6Is5M44PwcZVPD1iFoqDgu55icRejVUhB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":750714},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.6.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.6.tgz","_integrity":"sha512-s1dDSybASshj61QHJNEzkv88I81ftXjiYatkK/QzvCFRgBRMeQ0NOUqh7FvVvXkrbcHuzgQfdfli7ZN5lCis7A==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.6_1790989215461_0.6297703679287716","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@outcrawl/sdk","version":"0.4.7","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.7","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"f1339a277fa49e25c94ae2004692a3ea1a518087","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.7.tgz","fileCount":36,"integrity":"sha512-E4KW19fhngZ+ZjYOOclZlKmzOT/JGkZ/sK1Cx6kt9dZ+iEeKB9TpBtI9xv0nmXUEjHmf2DwN7c5ZISQqpRQxAw==","signatures":[{"sig":"MEQCIDsnON5RhxGLsuqcv+PnlFdPfF6PU+0MZS7GuadwE9tFAiBOk0/PRpX95pbZDG6zPAq93r8Ox0Ql35d2LZQQrXMgGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGrltA/wIavbZgUJVCvL6YzgHkgB6JD97Xv0utidBZjyAiEAyZSpBPf2/y6QZIyY8TNlsdgivMug2XtJlT7gbvMtYRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":751195},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.7.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.7.tgz","_integrity":"sha512-E4KW19fhngZ+ZjYOOclZlKmzOT/JGkZ/sK1Cx6kt9dZ+iEeKB9TpBtI9xv0nmXUEjHmf2DwN7c5ZISQqpRQxAw==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.7_1791017327779_0.851392789943672","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@outcrawl/sdk","version":"0.4.8","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.8","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"fdbdc0dfca602baf199facb97435294015f17151","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.8.tgz","fileCount":36,"integrity":"sha512-L+sJyazT2qX8ALSUay1YzvKLce+bMKQR3Q51YwGnUmrnZ/mnKW9IY+D5h1RiMQdrYjlXljpI+Ec405yEhbCX8Q==","signatures":[{"sig":"MEUCIQD/gWnbQxH0gqRVaShw7AmftPBCJPMAtdI28Aq6R+FNsAIgPZtyRAbuSGygjxLTwMx3HIsYJlDExqpF+UcqboVmMXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICVDmr0HooHhf/Kehz9FgwVJrZ6sd2gKM1qPyz0AEqXWAiEA8PTs2LHImFkFgDS6uSwtKYy3FMLV5P0AjJ4TKbM6MdM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":753587},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.8.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.8.tgz","_integrity":"sha512-L+sJyazT2qX8ALSUay1YzvKLce+bMKQR3Q51YwGnUmrnZ/mnKW9IY+D5h1RiMQdrYjlXljpI+Ec405yEhbCX8Q==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.8_1791134789371_0.46672011784471534","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@outcrawl/sdk","version":"0.4.9","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.9","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"1793e64e135604206418f6d19c15284cbbd4b35c","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.9.tgz","fileCount":41,"integrity":"sha512-tylsEZveJwNVO+43Y8c6nukKbewg+JHUZcQLzx+v7pEo5hZ9RcRbwO0WbdGuGTVxeORrfiJK5nTin+r8kNFeLg==","signatures":[{"sig":"MEQCIBtV7gYLtXPhrKPh24KPP4PpOQkRwelrsbNKjdjzlZKpAiBN3VLFopsD3FLSpqE5uXfnQTEgzKPSYEbmFW84tcwAwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDpiERSR6vYKwpH7oPLgs9libQTmJrsBiukEjHe1HLu7QIgM4VFxBehPnnxyGYkiS6Bw/NX9UIKowIAoAD+JyA+gm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":875692},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.9.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.9.tgz","_integrity":"sha512-tylsEZveJwNVO+43Y8c6nukKbewg+JHUZcQLzx+v7pEo5hZ9RcRbwO0WbdGuGTVxeORrfiJK5nTin+r8kNFeLg==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.9_1791503975183_0.32510975423070443","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@outcrawl/sdk","version":"0.4.10","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.10","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"18ce3c19ea844de8667e2975bc7606d1ce137daa","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.10.tgz","fileCount":43,"integrity":"sha512-s/I4ohBZafb1yA2vP/rMZteJFqC5IfJU2USG/0tqJmJBvgtkarEqHCsm7i7d0jegSFv5bFoY7mvtgOjVrx9DLw==","signatures":[{"sig":"MEUCIQCQGyKTtPZmKeNLrE2OLamvE4MkDShnkg+6OIffZulsXQIgEP92srQogt/cbHvliO0js6B6pL1ivDPXym+olz8sq9w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDbv29evGY79jyph9Jf8/ac74psZXjGsRLTcXPIhl8JTgIgC3Ns9K/VaOeiXYkrxZqnakUEamBNepc/PUPAwqQB1Uo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":925432},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.10.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.10.tgz","_integrity":"sha512-s/I4ohBZafb1yA2vP/rMZteJFqC5IfJU2USG/0tqJmJBvgtkarEqHCsm7i7d0jegSFv5bFoY7mvtgOjVrx9DLw==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.10_1791553764361_0.08538326371151128","host":"s3://npm-registry-packages-npm-production"}},"0.4.11":{"name":"@outcrawl/sdk","version":"0.4.11","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.11","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"a163ced441acb53a96cdd59e825af0d378af4657","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.11.tgz","fileCount":43,"integrity":"sha512-JWteLWT7YXt2/8W5m/C4hOlM1xFkJisVCeO+c3vJJDuDIyfF/mGfDQrQES5MbUspCAQkQobevA9mBCCEPqKikQ==","signatures":[{"sig":"MEYCIQDvruDNH41/ibJ6KMTP0O8kdhgxvOWi5ehIFyhHnyPhqAIhAM1fJ1f+71/gne8IJQBb9rb4/Dg6L7z9fGORrjypjxRS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD6OWVZ2Jj9QLfnRRhzHVHE2fbY4Ho/dc8N+HeTMajYogIhAPzQWdAH5boj3lTBjiPpONKFMwZrLzkr6AmmoCY4Fr7n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":929218},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.11.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.11.tgz","_integrity":"sha512-JWteLWT7YXt2/8W5m/C4hOlM1xFkJisVCeO+c3vJJDuDIyfF/mGfDQrQES5MbUspCAQkQobevA9mBCCEPqKikQ==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.11_1791662414029_0.9993192661807637","host":"s3://npm-registry-packages-npm-production"}},"0.4.12":{"name":"@outcrawl/sdk","version":"0.4.12","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.12","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"fc6ec0b0e312332e2b7e7cdccfb56d930692e98b","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.12.tgz","fileCount":43,"integrity":"sha512-YooKlOnFrb0ZqyjGh3rVywE01v08SiUj55FA6s6spczFzVv/dfblxJwr7pL1uWFmbnNNIoIWui6RC53/0tO1Yg==","signatures":[{"sig":"MEQCIBYcm6R7nVAPzkELUEujeGs97JzYfbDwfe/Y7vyhTQ7RAiA3W6NNLjN85d78qMeXtGXYZeP1Spr3YgofbW6Fhjtwdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC7rrpWWyVWoRHT5tercNouzbhbZiMHJ31bxNqou2JQFQIhAL9wAreMKe1fXKNgJ4Gy9AwjL0qeS92lk9ayOYzhhWUg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":929469},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.12.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.12.tgz","_integrity":"sha512-YooKlOnFrb0ZqyjGh3rVywE01v08SiUj55FA6s6spczFzVv/dfblxJwr7pL1uWFmbnNNIoIWui6RC53/0tO1Yg==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.0","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.12_1791806212177_0.40768850277769086","host":"s3://npm-registry-packages-npm-production"}},"0.4.13":{"name":"@outcrawl/sdk","version":"0.4.13","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.13","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"09c5f7bc93fc9e4ea95441c622bb1299568cec49","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.13.tgz","fileCount":51,"integrity":"sha512-EPF2B0gUElSmLoZNObWw8wPOVHNy0fqQlaUgp7IFnFOMm/43J0Wb0ZHDGOXAyzFy1rhOZKsPRwCO0OxlkAgwAA==","signatures":[{"sig":"MEUCIHwUFUE1HKsf1VmtU/COL+R/qg52gc+H+wiXdVD9IHUuAiEAytrA3wPdXyQCJ2XMvfK4KlLyor5YdvcPFcYd6dgPaD4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCYVnM1JuXnmSlin8K2tnjZok0f3yvfRS6K5fVXPubXkQIgeJpax/tLTeWimCvGx7OFso2DnXGwuV+0fbo1/Tyb3CA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":952672},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.13.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.13.tgz","_integrity":"sha512-EPF2B0gUElSmLoZNObWw8wPOVHNy0fqQlaUgp7IFnFOMm/43J0Wb0ZHDGOXAyzFy1rhOZKsPRwCO0OxlkAgwAA==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.1","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/scout-core":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.13_1792449141726_0.3140858296939919","host":"s3://npm-registry-packages-npm-production"}},"0.4.14":{"name":"@outcrawl/sdk","version":"0.4.14","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"license":"MIT","_id":"@outcrawl/sdk@0.4.14","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"homepage":"https://outcrawl.ai","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"2cf5066fb73e04b144497c32eee50ccd5660f705","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.14.tgz","fileCount":52,"integrity":"sha512-neK3P/+hFN9aE57hgvsSdz1ItmttAWs0ig8XUdgu4o6C529NIU3JQHAV+KoalV7wlo1gso2yuFTZfJCAhI0vNA==","signatures":[{"sig":"MEYCIQCoFOfcHSTgtX7JGid2pnZk57JhgHuic6ehLfJ4+U2HuQIhAO//z5fLgnHudJRshExAnJBRPg5hsmrZXa2X+fyIsUS9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAnKo7VuTvlDCBMS19uup+M0/VgKrCCHjGYV1MQsL7aZAiEA6szwogqWpQbeV3T2nCHQohgY2mHvZXFbK3XT168qWbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":962168},"main":"./dist/index.js","type":"module","_from":"file:outcrawl-sdk-0.4.14.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.14.tgz","_integrity":"sha512-neK3P/+hFN9aE57hgvsSdz1ItmttAWs0ig8XUdgu4o6C529NIU3JQHAV+KoalV7wlo1gso2yuFTZfJCAhI0vNA==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.1","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/scout-core":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.14_1792454416351_0.47376592502544757","host":"s3://npm-registry-packages-npm-production"}},"0.4.15":{"_id":"@outcrawl/sdk@0.4.15","bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"dist":{"shasum":"122ad5c048d5050aa4ad8fa5edbdfb5ff9e55c6e","tarball":"https://registry.npmjs.org/@outcrawl/sdk/-/sdk-0.4.15.tgz","fileCount":52,"integrity":"sha512-qeq+8qtnl0n/UUcY/qqfXFsucwGIdQnIXm4MXlMvJdCJLpUx3uoRSRdDjaUqXwMw7JlwQr7apur4s3I+tR2spg==","signatures":[{"sig":"MEYCIQD8bipdZHbKLFZo8srAQbsapOiwcDsMCTmmCAVJx2EyiwIhAJm7XtGpvZd+RQPZRKyV6G8lSisdV3hEx6OANsy3LpJ3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDyYGPzZ4rzztDfaVhwdz6ofwl7lNtjPM7lgq5OKyWh4wIgBvm96P3aKJgMWStq4iWPMlY/k4fAohClDe3f0cBHbWE="}],"unpackedSize":966110},"main":"./dist/index.js","name":"@outcrawl/sdk","type":"module","_from":"file:outcrawl-sdk-0.4.15.tgz","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"bun test ./test","build":"bun ./scripts/build.ts","prepack":"bun ./scripts/build.ts"},"version":"0.4.15","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"50127243-dc90-4c5d-bf6b-3b3ca37b50a0"}},"homepage":"https://outcrawl.ai","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"_resolved":"/home/runner/work/release/release/dist/outcrawl-sdk-0.4.15.tgz","_integrity":"sha512-qeq+8qtnl0n/UUcY/qqfXFsucwGIdQnIXm4MXlMvJdCJLpUx3uoRSRdDjaUqXwMw7JlwQr7apur4s3I+tR2spg==","repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.21.1","description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","directories":{},"maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"_nodeVersion":"24.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@outcrawl/core":"workspace:*","@outcrawl/proxy":"workspace:*","@outcrawl/replay":"workspace:*","@outcrawl/scout-core":"workspace:*","@outcrawl/integrations":"workspace:*"},"peerDependencies":{"playwright":"^1.56.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.4.15_1792494786761_0.13716182068218874"}}},"time":{"created":"2026-09-08T17:41:28.716Z","modified":"2026-10-20T11:13:07.202Z","0.1.0":"2026-09-08T17:41:29.070Z","0.1.1":"2026-09-12T22:21:36.307Z","0.1.2":"2026-09-16T21:35:05.643Z","0.1.3":"2026-09-17T02:40:50.863Z","0.1.4":"2026-09-21T14:21:08.948Z","0.1.5":"2026-09-21T21:44:39.957Z","0.2.0":"2026-09-24T02:59:41.560Z","0.4.2":"2026-09-25T21:24:30.935Z","0.4.3":"2026-09-29T00:18:36.639Z","0.4.4":"2026-10-01T06:39:06.307Z","0.4.5":"2026-10-02T11:51:47.118Z","0.4.6":"2026-10-03T01:00:15.575Z","0.4.7":"2026-10-03T08:48:47.873Z","0.4.8":"2026-10-04T17:26:29.493Z","0.4.9":"2026-10-08T23:59:35.299Z","0.4.10":"2026-10-09T13:49:24.476Z","0.4.11":"2026-10-10T20:00:14.135Z","0.4.12":"2026-10-12T11:56:52.294Z","0.4.13":"2026-10-19T22:32:21.804Z","0.4.14":"2026-10-20T00:00:16.462Z","0.4.15":"2026-10-20T11:13:06.930Z"},"bugs":{"url":"https://github.com/aeonmindai/outcrawl-browser/issues"},"license":"MIT","homepage":"https://outcrawl.ai","keywords":["outcrawl","scraping","crawler","web-search","browser-automation","playwright","cdp","stealth","agent"],"repository":{"url":"git+https://github.com/aeonmindai/outcrawl-browser.git","type":"git","directory":"packages/sdk"},"description":"Outcrawl TypeScript client — scrape, crawl, search and drive real stealth browsers over CDP, on one credit balance.","maintainers":[{"name":"jishrocks","email":"jishu.nirupam@gmail.com"}],"readme":"# @outcrawl/sdk\n\nThe typed TypeScript client for [Outcrawl](https://outcrawl.ai): scrape, crawl, search, agent runs,\nand real stealth browsers driven over CDP. One credit balance — no separate proxy, browser or\nstealth credits. Zero runtime dependencies: `playwright` is an optional peer, reached only through\n`await import(...)`, so a caller who never opens a browser never installs it.\n\n**You bring no infrastructure.** There are no proxies to buy, no browsers to run and no stealth\npatches to maintain. `oc.browser()` allocates a session on our fleet and connects to it over CDP,\nso nothing launches locally and every request already leaves from a residential IP. You name a\ngeography, not an exit list.\n\n## Install\n\n```sh\nnpm install @outcrawl/sdk\nnpm install playwright   # only for oc.browser(); it drives our fleet over CDP and downloads no browser\n```\n\nScrape, crawl, search and agents need nothing else. `oc.browser()` without Playwright throws\n`PlaywrightMissingError` naming the command above, before anything is allocated.\n\n## Usage\n\n```ts\nimport { Outcrawl } from '@outcrawl/sdk';\n\nconst oc = new Outcrawl(); // reads OUTCRAWL_API_KEY; pass { apiKey } to override\n\nconst doc = await oc.scrape('https://example.com', { formats: ['markdown'] });\nconsole.log(doc.usage.credits); // \"1\" — what this call was charged, on the result that caused it\n\nconst profile = await oc.profiles.create({ label: 'demo-user-42' }); // minted once, reused by id\nconst browser = await oc.browser({ profile: profile.id });           // its cookies and logins persist\nconst page = await browser.newPage();\nawait page.goto('https://practicetestautomation.com/practice-test-login/'); // a public demo login\nawait page.fill('#username', 'student');       // natural input, the default\nawait page.fill('#password', 'Password123');   // so is typing\nawait page.click('#submit');                   // and clicking\nawait page.raw.waitForURL('**/logged-in-successfully/');\nconsole.log(await page.title());               // \"Logged In Successfully | Practice Test Automation\"\nawait browser.close();\n\n// No schema: `data` is the agent's own summary of what it found. A budget is the only cap a\n// submit must carry; `steps` and `duration` are optional dials on top of it. This task cost\n// 5.0–7.7 credits on 2026-10-03 (n=33); 16.00 is twice the most it took.\nconst run = oc.agent({ task: 'Report the title of the top story on Hacker News.', caps: { budget: '16.00' } });\nconst result = await run;          // await for the result\nconsole.log(result.status, result.data); // \"completed\" \"…\"; a run a cap stopped (status 'capped')\n                                   // carries whatever it found first, which may be nothing\nfor await (const step of run) {}   // or iterate the log — both on one job is fine, it is two\n                                   // requests against one durable row\n\n// With a schema, `data` is schema-shaped instead, and satisfying it is the success signal.\nconst typed = await oc.agent({\n  task: 'Report the title of the top story on Hacker News.',\n  caps: { steps: 20, budget: '16.00', duration: '5m' },\n  schema: { type: 'object', properties: { title: { type: 'string' } }, required: ['title'] },\n});\nif (typed.status === 'completed') console.log(typed.data); // { title: '…' }\nelse console.log(typed.status, typed.stopReason);          // capped, partial or failed: `data` may be absent\n```\n\n## Natural input is the default\n\nEvery browser session gets natural input unless you turn it off: `oc.browser()` here, and any\nplain Playwright or Puppeteer script on `/connect` with no `input` parameter. The browser host\nre-plans every input command your connection sends into measured pointer paths, trackpad-style\nscrolling and a natural typing rhythm:\n\n- **Pointer.** A move becomes a pointer path through the browser's own path entry point, and a\n  press settles and holds at the point the path landed on. Pointer timing and landing come from\n  the measured macOS trackpad profile in [agenthands](https://github.com/aeonmindai/agenthands).\n- **Scrolling.** A wheel event becomes a trackpad-style gesture: one gesture per scroll, a phase\n  on every event, the distance covered exactly, from the same profile.\n- **Typing.** Inserted text is typed as keystrokes replayed from recorded typists, the\n  [KeyRecs corpus](https://zenodo.org/records/7886743) (CC-BY-4.0, 99 people), so the rhythm\n  carries a typist's own hold times and the overlap of one key going down before the last comes\n  up.\n\n**Natural input takes real time.** Typing averages about 237 ms a character, so a 40-character\nfield takes about 9.5 seconds of browser time, billed as browser time. One insert types for at\nmost about 10 seconds and the rest of a longer value goes in at once, so a Playwright `fill`\nstays well inside its 30-second action timeout.\n\n**To turn it off**, opt in to raw input: `oc.browser({ input: 'raw' })`, or `&input=raw` on the\n`/connect` URL. The host then forwards your input exactly as sent, at machine speed, and the page\nmethods below are plain Playwright input. Use it where speed matters more than shape.\n\nWhat the page methods send, for the host to re-plan:\n\n| method | sends |\n| --- | --- |\n| `click(sel)` | Playwright `click` |\n| `hover(sel)` | `scrollIntoViewIfNeeded`, then one `mouse.move` to a point inside the part of the element the viewport shows (the viewport is read with `Page.getLayoutMetrics` on one CDP session per page) |\n| `fill(sel, value)` | `click(sel)`, then `Meta+A` (the host is macOS), then `keyboard.insertText(value)`, or `Backspace` for `''` |\n| `type(sel, text)` | `click(sel)`, then `keyboard.insertText(text)` |\n| `press(sel, key)` | on an editable text field, `click(sel)` then `keyboard.press(key)`; on anything else (a button, a link, a checkbox, `body`), Playwright's `locator.press(key)` with no click, so the key does not act a second time |\n| `selectOption(sel, values)` | a popup `<select>` is focused, never pressed: on the macOS host a press opens a native menu that a programmatic select never closes. A list box (`multiple`, or `size` above 1) is clicked. Then Playwright `selectOption` |\n| `scroll(deltaY, sel?)` | points at `sel` as `hover` does when given, then one `mouse.wheel(0, deltaY)` |\n\n**`page.raw` is natural too.** It is Playwright's own `Page`, untouched, and with natural input\nthe host re-plans its input the same way: every `Input` command on the connection is, whoever\nsent it. What `raw` skips is the sequences above: `page.raw.fill()` focuses the field by script\nand writes the value. With natural input the host clicks a field that script focused before it\ntypes into it, at a point it has checked lands on the field and not on a button drawn over it,\nand puts the caret or selection back where the script left it; when no such point exists it\ntypes with no click.\nWith natural input, prefer `page.mouse.move()` to Playwright's `hover()`: `hover()` checks the\ntarget on the first `mousemove` it sees, the first point of a pointer path is where the pointer\nwas, and after that failed check Playwright keeps every later `mousemove` from reaching the\npage. The page then sees pointer events with none of the mouse events that go with them.\nEvery raw input call (`click`, `fill`, `type`, `press`, `hover`, `keyboard.*`, `mouse.*`, …) is\nrecorded as a `RawInputMark` on `browser.rawCalls`; a read or a wait such as\n`page.raw.waitForURL()` is not input and is not marked. The replay itself records the input the\npage received, browser-side, with `source: 'client'`.\n\n`page.goto()` and `page.title()` are neither: navigation is not input, so they delegate straight\nto Playwright and are **not** marked.\n\n**Plain Playwright gets the same, with nothing to add.** A script that does not use this package\ngets natural input from the bare connection URL:\n`chromium.connectOverCDP('wss://api.outcrawl.ai/connect?token=…')`. Add `&input=raw` to turn it\noff; `&input=natural` says the default out loud. Any other value is a `400 bad_request` with\n`details.reason: 'bad_input'`, before a browser is claimed.\n\n`new Outcrawl({ hands })` swaps the driver behind the page methods for your own `Hands`. The\nswitch for natural input stays `oc.browser({ input })`: the host does the shaping, and a driver\nonly chooses what is sent.\n\n## Where this session exits\n\nIP-lookup sites (ipinfo.io, api.ipify.org, a site's `/cdn-cgi/trace` and the like) are not\navailable through our residential network: it is a condition of the network we use. Opening one\nfails with `PageUnreachableError`, `cause: 'ip_lookup_not_offered'`. To see the exit instead, ask\nthe session:\n\n```ts\nconst browser = await oc.browser({ proxy: { country: 'GB' } });\nawait browser.newPage();\nconst exit = await browser.exit();\n// { network: 'residential', country: 'GB', region: 'England', city: 'london',\n//   timezone: 'Europe/London', ip: '…', ipv6: null }\n```\n\n`browser.exit()` answers what was measured when the session's context was pinned; nothing is\nfetched. `network` is `residential`, `mobile`, `isp` or `datacenter` for one of our exits,\n`yours` for your own proxy (measured through it), and `direct` when there is no exit, with every\nother field `null`. A field is `null` when it was not measured: `ipv6` on an exit with none,\n`region` for your own proxy. Open a page first.\n\nFrom plain Playwright, send the same command on any CDP session of the connection:\n\n```ts\nconst exit = await (await page.context().newCDPSession(page)).send('Outcrawl.getExit');\n```\n\nBefore the connection has a context, it is refused with `no browser context yet: open a page first`.\n\n## Configuration\n\n| Variable | Meaning | Default |\n| --- | --- | --- |\n| `OUTCRAWL_API_KEY` | your key | required unless you pass `apiKey` or a `transport` |\n| `OUTCRAWL_API_URL` | base url | `https://api.outcrawl.ai` |\n\nThe same two names the `outcrawl` CLI, the Outcrawl MCP server and the Python SDK read, exported here\nas `API_KEY_ENV` and `API_URL_ENV` so a caller telling somebody what to set reads the name off the\nclient rather than retyping it. The default host is measured, not assumed: on 2026-09-23\n`https://api.outcrawl.ai/v1/credits` answered `401` for a missing key — the API, reachable — while\n`https://outcrawl.ai/v1/credits` answered the website's HTML `404`, because the apex now serves the\nwebsite and not the API.\n\n## Surface\n\n- `Outcrawl` — one entry point. The wire types (`ScrapeResult`, `AgentResult`, `SessionSummary`,\n  `Profile`, `CreditBalance`, `Usage`, …) are re-exported here, because `@outcrawl/core` is not\n  published and a type only nameable from there is a type no caller can name.\n- `oc.scrape` / `oc.crawl` / `oc.search` — `await oc.crawl(url)` answers an async-iterable\n  handle (`for await (const page of await oc.crawl(url))`). `search` reads more than\n  one search engine: when one refuses the query and another answers, the hits carry\n  `hits.warnings` with an `engines_refused` entry naming the engine that refused; when every\n  engine refuses, it throws `SearchRefusedError` (503, retryable after `Retry-After`, a retry is\n  served from another exit, nothing charged) rather than returning `[]`.\n- Scrape and crawl options are the API's own fields, typed as `ScrapeOptions` / `CrawlOptions`:\n  `formats` (default `['markdown']`), `onlyMainContent` (default `true`), `schema`, `profile`,\n  `exit`, `waitFor`, `timeoutMs` and `changeTrackingTag` on a scrape; `limit` (default 100),\n  `maxDepth`, `includePaths`, `excludePaths`, `allowSubdomains`, `allowExternalLinks`,\n  `ignoreSitemap`, `ignoreRobotsTxt` and `webhook` on a crawl. Both take `maxAge`: how old a cached answer may be,\n  in milliseconds, default `172800000` (2 days); `0` is always live, neither reading nor writing\n  the cache. A hit bills the same `page_load` credit a live fetch does, and a `profile` or change\n  tracking always renders live. A crawl honours each host's `robots.txt` (read out of band, never by the\n  crawl's browser) unless `ignoreRobotsTxt: true`: a disallowed URL is not fetched and is listed in\n  the crawl's `failures` with a message starting `robots_disallowed`. A URL the site refused twice\n  fails `site_rate_limited` (429) or `site_refused` (403/408/425/5xx), with the site's\n  `statusCode`. Once iteration ends, `crawl.failures` lists them and\n  `crawl.warnings` carries `crawl_incomplete` when the crawl settled `completed` short of its\n  `limit` because pages failed (its message names delivered/limit, `counts` the causes); both are\n  `[]` otherwise, and `oc.crawl.get(id)` answers the same `warnings`.\n- `usage.credits` is what the call was charged, as an exact decimal string (`\"1\"`, `\"4.5\"`) —\n  the same figure the ledger bills, never a float. A scrape states it (a cache hit included), a\n  search states the results plus the hits it rendered, and a crawl states it on every page and\n  for the whole crawl on its closing frame (`crawl.usage` once iteration ends). An agent run\n  states its charge as the run's own `credits`.\n- Every scrape result and crawl page says where it came from: `cacheState` is `'hit'`, `'miss'`\n  or `'bypass'` (this request did not consult the cache), `cachedAt` is when a hit was captured,\n  `usage.cache.status` agrees with `cacheState` (`HIT` / `MISS` / `DISABLED`), and\n  `metadata.servedVia` is `'direct'` or `'residential'`, the network path that fetched it, and\n  `metadata.egressCountry` the country (ISO code) of the address it was fetched from.\n  `metadata.exitRetries` (absent unless it happened) is how many times the page was fetched again\n  from a fresh exit inside your `timeoutMs`: `1` when the exit's connection never opened, the site\n  answered it with a reduced page, or the exit answered nothing under the page; `2` at most, only\n  when the first connection never opened. Still one `page_load`.\n  `metadata.readFrom` (absent unless it happened) is `'served'` when the content was extracted\n  from the page's HTML as the server sent it, before its scripts ran: a markdown/html/json request\n  whose page body already held its main content when it arrived. Set `waitFor` for the rendered page.\n- A degraded page still comes back, and says so in `warnings` (typed `ScrapeWarning[]`): absent on\n  a clean result, otherwise `{ code, format?, message }` entries whose `message` names the numbers.\n  `partial_document` — the page was read before its main document finished loading (the parser\n  was still in it, or the response was still arriving or had stopped), so `markdown`, `html` and\n  `rawHtml` are a prefix of the page; retry with a larger `timeoutMs` or a `waitFor`, or, when the\n  message says the response stopped arriving (already retried once on a fresh exit when time allowed),\n  retry as is. `empty_capture` — the\n  requested `markdown` or `html` came back empty. `blocked_interstitial` — a bot-protection page\n  came back instead of the page. `challenge_budget_exhausted` — a challenge left too little time\n  to finish reading. `source_truncated` — a JSON or text body arrived cut off. `json_no_content`,\n  `json_empty` and `json_required_empty` describe a `json` extraction: no page text, no data, or\n  empty values for fields your schema requires. `egress_country_mismatch` — the page is not the one a visitor in the country you asked for\n  sees: either this destination cannot be reached through our residential network, so the page was\n  fetched from our own address in `metadata.egressCountry`, or the site placed our exit in another country,\n  which the message names, also after one fresh exit; prices and availability may differ.\n  `search_challenge_unsolved` — a search engine's results page came back as its \"verify you are\n  human\" check rather than results; use `oc.search(...)` (`POST /v1/search`) for search results.\n  `degraded_document` — the URL names one item (today an Amazon product page) and the site\n  answered with a reduced page without it (recommendations and footer only); it is fetched\n  again, then once from a fresh exit, when `timeoutMs` allows, so a result still carrying it is a failed fetch.\n  `login_redirect` — the site redirected the request to its sign-in page and that page came\n  back instead (the message names where); treat it as a failed fetch. `render_incomplete` — the\n  page was rendered and was not whole when read (its loads were still running when the render\n  budget ran out, or its text changed on the confirming re-read); `metadata.complete` is `false`.\n  `robots_unchecked` — a crawl page from a host whose robots.txt could not be read (5xx or\n  timeout); the crawl went on as if the site had no rules.\n- `oc.agent(...)` — `caps` is required and `caps.budget` is required inside it, at the type level\n  and at runtime; `caps.steps` and `caps.duration` are optional and unset unless you name them.\n  All three are hard stops when present. `result.durationMs` is what agent minutes bill\n  from. It returns an `AgentJob` synchronously: `submitted` is the `{ id, status }` round trip,\n  `await` polls to settled, `for await` tails the log, and everything an `AgentHandle` does is on\n  it too — `status()`, `results()`, `events()`, `cancel()`, and the three human-in-the-loop\n  methods: `control('take' | 'release', who?)`, `answer(answer, answeredBy?)` and\n  `addFile({ name, bytes, contentType? })`, which takes a `Uint8Array` and base64s it for the\n  wire. `settled()` does not treat a PARKED run as settled: a run waiting on a person is about to\n  take more steps.\n- `oc.browser(...)` — allocates a session on the fleet and connects over CDP; nothing launches\n  locally. `Browser.rawCalls` collects a `RawInputMark` per `page.raw.*` call, client-side; nothing is sent for it.\n  `input` is `'natural'` (the default) or `'raw'`; see \"Natural input is the default\" above.\n  `browser.exit()` answers a `SessionExit`; see \"Where this session exits\" above.\n- `oc.sessions.get` / `list` / `export`; `session.live()` streams replay events and\n  `session.takeControl()` hands the wheel to a person.\n- Session reads (a `/connect` session or an agent run; scrape, crawl and search record nothing):\n  `oc.sessions.events(id, { kind, tab, after, follow })` and `oc.sessions.network(id, { url, method,\n  status, type, tab, minDurationMs, bodies, follow })` are streams whose `.source` says `schema: 'v1' |\n  'v2'` and names the `gaps` an older recording never carried; `oc.sessions.network.digest(id)` (what\n  went wrong, capped), `oc.sessions.request(id, requestId)`, `oc.sessions.console(id)`,\n  `oc.sessions.har(id)` (HAR 1.2), `oc.sessions.videos(id)`, and `oc.sessions.share(id, { visibility:\n  'private' | 'link' | 'people', people })` — private (your team) is the default and revokes a link.\n  The same methods sit on a `Session` handle. `oc.agent.list({ status, since })` lists your runs.\n  A session read or share refused for the key answers `replay_access_denied` (403,\n  `ReplayAccessDeniedError`, `details.reason`): `operator_key` means the key was issued by\n  Outcrawl staff, and such keys never open a customer's recordings; use a key made in the console.\n- `oc.profiles` and `oc.monitors` — `create` / `list` / `delete` each.\n- `oc.secrets` — `create` / `batch` / `list` / `each` / `delete` / `intent`, and deliberately\n  **no `get`**: there is no `secrets.get` route to widen. Kinds are `text`, `card` and `details`\n  (a person's or company's `name`, `email`, `phone` in E.164, `company`, `taxId`,\n  `billingAddress` and `shippingAddress`, at least one part; an address is `{ line1, line2?,\n  city, state?, postalCode, country }` with an ISO 3166-1 alpha-2 country). `create` takes\n  `tags?`, at most 16 of `^[a-z0-9][a-z0-9_-]{0,63}$`. `list({ handle?, kind?, tag?, limit?,\n  cursor? })` answers the handle, the kind, a card's last four (`hint`) and `brand`, the parts a\n  row holds (`fields`) and its `tags` — everything a human needs to pick one, never a value. It\n  is one page; `each(query)` is an async iterator over every page, following `cursor` until it is\n  absent. `batch({ items, onConflict? })` stores up to 500 create bodies in one call and answers\n  `{ results }`, one per item in request order: `{ handle, ok: true, id, outcome: 'created' |\n  'replaced' | 'skipped' }` or `{ handle, ok: false, code, field, message }`. One bad item never\n  fails the batch, and with `onConflict: 'skip'` (the default) a re-run is idempotent;\n  `'replace'` re-seals the value under the same id and never changes a handle's kind. A run\n  reaches a value only by naming the HANDLE in `AgentRequest.secrets`, and the substitution\n  happens below the model; a `details` item fills by part, `{{secret:<handle>.email}}`,\n  `.billing.postal_code` and so on, and a bare `{{secret:<handle>}}` naming one is refused.\n  `intent({ name, kind })` is for a value a person types into YOUR web page, so it never passes\n  through your server: your app server calls it and answers `{ name, kind, url, token, expiresAt }`;\n  hand `url` and `token` to the page, which sends `PUT url` with `Authorization: Bearer <token>`\n  and a body `{ \"value\": \"...\" }`. The token is single use, lasts five minutes and writes `name`\n  and nothing else (creating it, or replacing the value already stored under it). It is a\n  credential: give it to that page only and never log it. A refused `PUT` answers\n  `secret_intent_invalid` (401, the token does not open that URL for that name) or\n  `secret_intent_spent` (410, `details.reason` `used` or `expired`), which this SDK rebuilds as\n  `SecretIntentInvalidError` / `SecretIntentSpentError`; nothing is stored either way and the fix\n  is a new intent. Minting is capped per account per minute (`QuotaExceededError`,\n  `details.ceiling === 'secret_intents_per_minute'`). A value your server already holds goes\n  through `create`.\n- Purchase controls. `oc.agent({ ..., caps: { budget, spend: { limit: '250.00', currency: 'USD',\n  perPurchase: '100.00' } }, merchants: ['staples.com'], secrets: ['card_7731'], wallet: { card:\n  'card_7731' } })` lets a run buy only on those sites and within those amounts (exact decimal\n  strings, never numbers). A card handle without `caps.spend` throws `SpendCapRequiredError`\n  (`spend_cap_required`), and a card number in the task, a rule or an answer throws\n  `CardNumberInTaskError` (`card_number_in_task`, \"Put the card in a secret and name its handle.\"),\n  both in your process before anything is sent; the error never contains a digit.\n  `oc.agent.purchases(id, { cursor, limit })` and `oc.purchases.list({ cursor, limit, card,\n  merchant, status, since, until })` list purchases (the card's handle, brand and last four only).\n  `oc.wallet.settings.get()` / `.set({ approvalAbove: { amount, currency } | null })` sets the\n  amount above which a purchase pauses the run with `pause.ask.kind === 'approval'`; answer it with\n  `oc.agent.answer(id, { approve: true | false })`. It never lets a purchase past the run's caps.\n- Downloads. Every file the browser downloads, in an agent run or a browser you drive, is kept\n  7 days, up to 200 MB each. `oc.agent.downloads(runId, { cursor, limit })` (or `job.downloads()`)\n  and `oc.sessions.downloads(sessionId)` (or `session.downloads()`, `browser.downloads()`) list\n  them: `{ id, name, contentType, bytes, sourceUrl, createdAt, expiresAt, url }`. `url` needs no\n  API key and works for one hour; list again for a fresh one. `saveDownload(download, dir)`\n  streams one into an existing folder and answers the path; it never overwrites a file (a taken\n  name becomes `<stem>-<first 8 of id><ext>`) and deletes a transfer that ends short. Playwright's\n  own `download.saveAs()`, `path()` and `createReadStream()` work on a page from `oc.browser()`:\n  each waits up to 2 minutes for the file to be listed, then fetches it.\n- Your own card provider: Privacy.com, Brex, Slash, Stripe Issuing or Airwallex.\n  `oc.wallet.providers.list()` says what each needs (`fields`, the secret ones marked;\n  `values` where a field is a choice, the first its default), the currencies its cards can be\n  limited in, and whether this deployment can connect it (`available`, `unavailableReason`).\n  Connect from a server that holds the key; the provider's read-only test runs first and the\n  credential is stored, encrypted, only if it passes (`ProviderTestFailedError`,\n  `provider_test_failed`, otherwise). No route ever returns it.\n\n  ```ts\n  await oc.wallet.connections.create({\n    provider: 'privacy',\n    handle: 'ops_privacy',\n    credential: { apiKey: process.env.PRIVACY_API_KEY! },\n  });\n  const run = oc.agent({\n    task: 'Buy one box of A4 copy paper from staples.com.',\n    caps: { budget: '40', spend: { limit: '60.00', currency: 'USD', perPurchase: '60.00' } },\n    merchants: ['staples.com'],\n    wallet: { provider: 'ops_privacy' },\n  });\n  ```\n\n  The run gets ONE card minted from that account at its first purchase, limited to\n  `caps.spend`, and closed when the run ends (Privacy: one merchant-locked card per site it buys\n  at). `oc.wallet.connections.list({ provider?, cursor, limit })` / `.each()` / `.get(id)` read\n  connections with their `status` (`pending`, `active`, `failing`, `revoked`) and `warnings`;\n  `.test(id)` runs the provider's test again and answers `{ ok, account, warnings, reason }`;\n  `.delete(id)` closes every card it still has open, then deletes it. `.intent({ provider,\n  handle, origin?, ttlS? })` lets a browser send the credential instead (`PUT uploadUrl` with the\n  `token` and `{ value: { <field>: '...' } }`; a failed test keeps the token, up to five times,\n  then `SecretIntentSpentError` with `reason: 'attempts'`). A purchase's `card` is\n  `{ source, handle, provider, brand, last4, providerCardId }`.\n- Temporary secrets for ONE run: `runSecrets` on the submit, `oc.agent.secrets.add` on a live\n  run, or `oc.agent.secrets.intent` for a browser. Each is held only in the memory of the machine\n  running the run, never stored (even encrypted) and dropped when the run ends; at most 16 per run,\n  4 KB each. A temporary secret carries a security code, a whole card, a billing profile or a\n  text value: `kind: 'text'`; `'card'` (`{ number, expMonth, expYear, name?, billing?, cvc? }`,\n  the one place a card may carry its security code); `'details'` (a `DetailsValue`, the same\n  shape and checks as a stored `details` item, filled by part as `{{secret:<name>.email}}`,\n  `.billing.line1` and so on); and, on a live add or an intent, `'card_field'` with\n  `field: 'cvc'`, which adds the code to a card the run already holds. `wallet.card` and\n  `wallet.details` may name a run secret, and a run secret shadows a stored handle of the same\n  name. A run card is revealed only into an open purchase, as a stored one is.\n\n  ```ts\n  const job = oc.agent({\n    task: 'Buy one box of A4 copy paper from staples.com.',\n    caps: { budget: '40', spend: { limit: '60.00', currency: 'USD' } },\n    merchants: ['staples.com'],\n    runSecrets: {\n      card_tmp: {\n        kind: 'card',\n        value: { number: '4242424242424242', expMonth: 12, expYear: 2030, cvc: '123' },\n        singleUse: true,\n      },\n      billing_tmp: {\n        kind: 'details',\n        value: {\n          email: 'ops@example.com',\n          billingAddress: { line1: '1 Market St', city: 'San Francisco', postalCode: '94105', country: 'US' },\n        },\n      },\n    },\n    wallet: { card: 'card_tmp', details: 'billing_tmp' },\n  });\n  const { id } = await job.submitted;\n\n  // Live add: a billing profile, or a stored card's security code, for a run already going.\n  await oc.agent.secrets.add(id, {\n    name: 'ship_tmp',\n    kind: 'details',\n    value: { name: 'Jane Doe', shippingAddress: { line1: '1 Market St', city: 'San Francisco', postalCode: '94105', country: 'US' } },\n  });\n  await oc.agent.secrets.add(id, { name: 'card_7731', kind: 'card_field', field: 'cvc', value: '123' });\n\n  // Browser intent: your server mints it for your checkout page's origin...\n  const { uploadUrl, token } = await oc.agent.secrets.intent(id, {\n    name: 'card_typed',\n    kind: 'card',\n    origin: 'https://checkout.example.com',\n  });\n  // ...and that page sends the value straight to Outcrawl.\n  await fetch(uploadUrl, {\n    method: 'PUT',\n    headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json' },\n    body: JSON.stringify({ value: { number: '4242424242424242', expMonth: 12, expYear: 2030, cvc: '123' } }),\n  });\n  ```\n\n  `origin` is the exact origin of the page that sends the value: `https://host[:port]`, or\n  `http://localhost:<port>` / `http://127.0.0.1:<port>` while developing. Only that page may send\n  it; without `origin`, only the Outcrawl console may. The `PUT` body is `{ \"value\": ... }`: a\n  string for `text` and `card_field`, an object for `card` and `details`. A refused value answers\n  400 naming the field, never the value, and leaves the token unspent. The token is single use,\n  lasts at most five minutes and dies with the run. A value your server already holds goes through\n  `oc.agent.secrets.add`.\n- `oc.rules` — `get` / `set(rules)`. `set` REPLACES the set and answers the classification of\n  what it just stored, so a caller learns on that same call which sentences became `enforced`\n  gates and which are only `guidance`. Read `class`, and read `unenforceable`: it is present\n  exactly when we suspect a customer believes a rule is enforced and it is not.\n- `oc.integrations` — `connect(input)` / `test(input)` / `list()` / `update(id, input)` /\n  `delete(id)`, the management half of Outcrawl as an MCP **client**. `connect` is not granting:\n  reach is granted per run through `AgentRequest.integrations`, and a submit that names nothing\n  reaches nothing however many connectors the workspace has. `auth.secret` is a secrets-store\n  handle, never a token. `list` takes no query, because this listing is the blast radius; each\n  row carries `lastUsedAt` (a timestamp, or `null` if no run has called it successfully).\n  `test({ url, auth })` stores nothing and always answers a verdict — `{ ok: true, tools }` or\n  `{ ok: false, reason, message }`, `reason` one of `not_mcp`, `unauthorized`, `unreachable`,\n  `missing_secret`. `connect` runs the same check first, and so does `update` when it is given a\n  new `auth.secret`; a server that fails it throws `IntegrationCheckFailedError` (422, not\n  retryable) and nothing is stored. `update` changes only `tools` (`null` widens to every tool)\n  and `auth.secret`; the URL, the name and the auth kind are what a connector is, so change them\n  by connecting again under the same name. Each call a run makes, and each granted connector it\n  could not use, is a `kind: 'integration'` record on the run (`AgentIntegrationRecord`).\n- `oc.credits()` — `{ granted, expired, spent, balance, exhausted, malformed }`, every figure a\n  decimal **string**; never parse to `Number`.\n- `BrowserOptions` — `profile`, `proxy`, `record`, and nothing else.\n- Every error `errorFromWire` can return is exported, because `instanceof` against a class you\n  cannot import is not a contract: `OutcrawlError`, `BadRequestError`, `CapExceededError`,\n  `CapabilityUnavailableError`, `ConcurrencyLimitError`, `DecodeUnavailableError`,\n  `ExitUnavailableError`, `IntegrationCheckFailedError`, `InternalError`,\n  `MethodNotAllowedError`, `NoCapacityError`, `NotFoundError`, `PlanRequiredError`,\n  `ProfileInUseError`, `ProfileNotFoundError`, `QuotaExceededError`, `SearchRefusedError`, `TenantScopeError`,\n  `UnauthorizedError`, plus `isOutcrawlError`, `isKnownErrorCode` and `OUTCRAWL_ERROR_CODES`.\n  Branch on `error.code`, never on `message`. The Python SDK raises the same classes with the same\n  fields and the same messages; `packages/sdk-python/tests/error_parity.json` is the shared\n  contract and both suites read it.\n- `CAPABILITY_AVAILABILITY` — `satisfies Record<CapabilityName, Unavailable | null>`, so a new\n  registry capability does not compile until somebody states whether anything serves it; a\n  capability the table does not declare is refused by name.\n\n## Rules\n\n- **Browser settings are assigned, not chosen.** `timezoneId`, `timezone`, `locale`, `languages`, `userAgent`,\n  `viewport`, `screen`, `deviceScaleFactor`, `geolocation`, `webrtcIp`, `seed` and\n  `fingerprint` each throw `IdentityOverrideError` naming what pins them — the `PINNED` map is the list.\n- **The viewport is the browser window, and the screen is the machine's.** `browser.newPage()` opens its\n  context with Playwright's `viewport: null`, so no viewport or device scale factor is emulated: the page\n  reads the host display's real pixel ratio (2 on a Retina display) and the window's own size. A raw\n  Playwright client should do the same, `browser.newContext({ viewport: null })`; Playwright's default\n  context emulates 1280x720 at pixel ratio 1, which no Retina Mac reports. Screenshots are therefore at\n  device pixels (twice the CSS size on a Retina display); pass `page.raw.screenshot({ scale: 'css' })`\n  for one image pixel per CSS pixel.\n- **`proxy` picks where a browser's traffic leaves from**, the same way on both paths:\n  `oc.browser({ proxy })` sends it on `/connect` (a string as `?proxy=`), and a raw Playwright client puts it\n  there itself — `chromium.connectOverCDP('wss://api.outcrawl.ai/connect?token=…&proxy=' +\n  encodeURIComponent(proxy))`. Two forms:\n  - `outcrawl://<country>[/<region>[/<city>]]`, or a target object `{ country, region?, city? }`:\n    our network in that geography, e.g. `outcrawl://us/texas/austin`, `outcrawl://gb/london`,\n    `outcrawl://usa`, `{ country: 'US', city: 'New York' }`.\n    Spell places as a person would: the country is its ISO code or English name (`us`,\n    `United States`, `united_states`, and `usa`, `uk`, `england`, `holland` and friends); the\n    region is its code or name (`tx`, `texas`, `New York`); case does not matter, space, `-` and\n    `_` are the same, and accents fold (`são paulo` = `sao-paulo`). The region may be left out when\n    only one region has the city (`outcrawl://us/austin`); a second URI segment that is both a\n    region and a city is the region (`outcrawl://us/washington` is the state). With a city, the\n    region is a hint: it picks among the regions that have the city, and one that names none of\n    them (`outcrawl://ca/on/toronto`) still gets the city when one region dominates. An OBJECT says which\n    part is which, so `{ country: 'US', city: 'Washington' }` is the city and\n    `{ country: 'US', city: 'New York' }` is New York City — exactly as the same object means as\n    `exit` on `/v1`. `oc.browser()` sends a URI as `?proxy=`, as typed, and an object as one query\n    parameter per part, `?proxy_country=US&proxy_city=New%20York` (plus `proxy_region`), which a raw\n    client may send too; naming both `proxy` and a `proxy_*` part is a `400`. A place that does not\n    exist, or a city several regions share given none of them (`outcrawl://us/springfield`), is a `400 bad_request`\n    (`details.reason: 'bad_geography'`) before a browser is claimed, naming the closest real\n    places as working URIs. With a `profile`, the geography picks where the exit\n    is and the profile keeps its pinned network and device — the same precedence as `exit` on a\n    scrape.\n  - `http://`, `https://` or `socks5://[user[:password]@]host[:port]`: **your own proxy**. The\n    worker resolves the host, refuses loopback, private, link-local, carrier-grade NAT and\n    Outcrawl addresses, measures where the proxy exits with one request through the proxy itself\n    to `https://api.outcrawl.ai/ip` (our own address echo, never a third-party IP checker, always\n    reached over IPv4 so the exit measured is the proxy's IPv4 address), and\n    gives the context that IP's timezone and language. One exit IP is one device: the same account behind\n    the same IP gets the same fingerprint every session (a `profile`'s own device wins when you\n    pass one). Its bandwidth is yours — no `proxy_bytes` charge; browser time bills as normal. A\n    socks5 username or password must not need percent-encoding. The credential is sealed inside\n    the ticket and never appears in the `wsEndpoint`, a log or an error.\n\n  Playwright's own `newContext({ proxy: { server, username, password } })` works for a proxy that\n  needs no login. For one that does, give the credential on the connection as above: Playwright\n  sends `username`/`password` only after the context exists, too late to measure the proxy. After\n  that, `newContext({ proxy })` works with or without repeating the server. Once the fleet browser\n  supports it, `newContext({ proxy })` credentials work on their own too, and the context's\n  timezone, languages and WebRTC address then apply from the first navigation, not to\n  the blank page before it. With `proxy.username` set, Playwright also answers a website's HTTP\n  authentication challenge with that proxy login; pass `httpCredentials` explicitly if a site you\n  visit asks for its own login. A proxy that cannot be used fails `newContext()` (or, for credentials\n  given only to `newContext()`, the first `goto`) with a message that starts with its code:\n  `proxy_unreachable`, `proxy_auth_failed`, `proxy_forbidden`, `proxy_unplaceable` (an exit whose\n  country or timezone cannot be stated) or `proxy_unbound`. A malformed `?proxy=` is a\n  `400 bad_request` with `details.reason`, and never repeats the value. While a fleet upgrade is\n  rolling out, a `?proxy=` connection can be refused `503 no_capacity` with\n  `details.reason: 'proxy_unsupported'`: retry shortly.\n- **Recording is automatic; declining is explicit.** Only `record: false` declines (on `/connect`,\n  only `?record=false` or `?record=0`); a non-boolean `record` on an agent run is a `400`. A declined\n  session never has a recorder attached — no replay, no `replay_sessions` row, no blob,\n  `sessions.export` answers `404`, no `replayUrl`, and `recordingDeclined` is `true`. Declining\n  changes what is kept, never what is charged.\n- `scrape`, `crawl`, `search` and monitor checks record nothing and have no `record` field.\n- A profile is leased while open; a second concurrent open throws `ProfileInUseError`.\n- `oc.sessions.list()` throws `UnsupportedSessionFilterError` for a filter the API does not\n  implement, rather than returning an unfiltered page.\n- **Bandwidth is charged where you chose the bytes.** Egress lands on `oc.browser()` sessions and\n  agent runs; it is recorded and not charged on `scrape`, `crawl`, `search` and monitor checks,\n  where our pipeline decides the byte count. `result.billed.bandwidthBytes` reports it either way.\n- Pricing: [api.outcrawl.ai/pricing](https://api.outcrawl.ai/pricing) is authoritative and is GENERATED\n  from the capability registry and the rate card, so it cannot list something the API does not\n  serve. `OUTCRAWL_RATE_CARD` in `@outcrawl/persistence` is the same card production computes\n  against — ask one of those two rather than trusting a transcribed table.\n- The SDK is optional. An unmodified Playwright script pointed at our CDP endpoint keeps working;\n  this package is ergonomics, never the only door.\n\n## Testing\n\n```sh\ncd packages/sdk\nbun test ./test\nbun run build   # the publish path; `prepack` runs the same script\n```\n\n`bun run build` asserts the bundle evaluates and constructs, and that the shipped declarations\ntypecheck as a customer resolves them through the `exports` map, under `moduleResolution: nodenext`\n— twice, because \"the way a customer does\" is not one configuration: once DOM-flavoured with\n`skipLibCheck: false`, and once as a Node backend with `lib: [\"ES2024\"]` and `@types/node`. The\nsecond shape was added after a scratch install found three `TS2749` errors that the first could not\nsee; see the `Gaps` section.\n\n## Gaps\n\n- **`page.observe()` and `page.extract()` throw on every session.** Both need a raw CDP session\n  scoped to the open page, minted through Playwright's `context.newCDPSession()`. That call always\n  sends `Target.attachToBrowserTarget` first, whatever it is eventually scoped to, and this\n  product's browser refuses that method for every tenant connection. That is tenancy, not a bug to\n  route around client-side: that target carries `Outcrawl.setExitTable`. Measured against\n  production on 2026-09-23: `observe()` and `extract()` fail `Target.attachToBrowserTarget: Not\n  allowed`. `page.scroll()` no longer needs that session: it sends one `mouse.wheel`, and with\n  natural input the host turns it into the full gesture. The fix for the other two is a host-side\n  route to a CDP session scoped to a connection's own already-owned target, which does not exist\n  yet.\n- **One customer tsconfig still reports three errors, and they are in a carried declaration.**\n  Measured 2026-09-08 from a scratch install, five configurations: the default scaffold, strict with\n  `lib: [\"ES2024\"]` + `@types/node`, strict with DOM and `skipLibCheck: false`, and\n  `moduleResolution: bundler` are all clean; strict with `lib: [\"ES2024\"]` (no DOM) AND\n  `skipLibCheck: false` reports three `TS2749` on `CryptoKey` in `_deps/core/secrets.d.ts`. That\n  file is carried because `Secret`, `SecretKind`, `SecretCreateRequest`, `SecretIntent` and\n  `SecretIntentRequest` live in it; none of its\n  crypto half is on this package's surface. The fix belongs in `@outcrawl/core`, whose\n  `importSecretKey` names the ambient DOM `CryptoKey` —\n  `Awaited<ReturnType<typeof globalThis.crypto.subtle.importKey>>` resolves under all three lib\n  configurations, verified. Not changed here because this is the packaging layer and that is a\n  shared contract.\n- **Map is priced nowhere and implemented nowhere.** It has no registry row, no route, no handler\n  and no meter, and since 2026-09-12 `outcrawl.ai/pricing` is generated from the registry and the\n  rate card — so the page has no line for it and cannot acquire one until the code exists.\n- **Extract has no REST route.** `page.extract()` is its only door, and that door is closed today —\n  see the first entry. When it opens it is charged as that session's browser time and bandwidth,\n  never the published per-page rate.\n- **Bring-your-own-model is not available, and `model` is gone as a field.** `AgentRequest` has no\n  `model`: a request names a HARNESS — `agent: 'scout-1'`, the only one and the default — and\n  which models a harness runs is ours. A `model` key is refused by the same accept-list check that\n  refuses any unknown field, and no route exists for a customer credential to reach a worker.\n- **`caps.budget` binds the INVOICE, all of it.** It is a ceiling on what the run is billed — its\n  model usage (in credits at your plan's price per credit), browser time at 1 credit a minute for\n  as long as the run is open, and proxy usage at 2,000 credits/GB — enforced continuously against\n  that figure, so a run that reaches it stops with `status: 'capped'` and\n  `stopReason: 'max-budget'`. The WORK may overshoot by at most one step, because the step in\n  progress when the ceiling is reached still finishes; that overshoot is measured and not billed,\n  so no run is billed past its budget (measured 2026-09-23, four runs on a `2.00` budget, each\n  billed exactly `2.00`), and a run whose work passed the ceiling never reports `task-complete`.\n  Until 2026-09-08 this entry said `caps.budget` bound nothing but model spend and told you to\n  rely on `duration`; that was true, and it meant the ceiling was a no-op on every production run.\n- **A budget of 1 credit or less is a 400, not a run.** A run spends model usage, browser time\n  and bandwidth from its first step and the cap trips when spend REACHES the ceiling, so\n  `caps: { budget: '1.00' }` is reached before the run can read anything. Anything at or below 1\n  credit is therefore refused by `oc.agent(...)` in this process, with the number and what a\n  credit buys. `'1.01'` is accepted and may still cap — how much a first step spends is page\n  weight and model latency, not arithmetic.\n- **`credits().exhausted` is reported, not enforced.** Nothing refuses work when the granted pool\n  empties — admission is decided against the plan's monthly allowance. Treat it as a signal to top up.\n- **The availability gate is dormant, and that is a measurement rather than a hope.** Every one of\n  the 36 rows in `CAPABILITY_AVAILABILITY` is an explicit `null` as of 2026-09-25 — including\n  `integrations.test` and `integrations.update`, added that day — so nothing is refused locally;\n  the table is kept for the compile-time requirement that a new registry row cannot compile until\n  somebody states whether anything serves it. `assertAvailable` still fails closed on a name the\n  table does not declare, which is the case `satisfies` cannot cover.\n- **Unrelated server-side refusals share one code.** `capability_unavailable` from the API is not\n  this SDK's gate; it means the deployment cannot serve the call. A worker with no model client\n  configured answers it for `agent`, one with no exit provisioner answers it for a request naming\n  a geography, and a control plane with no `SECRETS_KEY` answers it for `secrets.create` and for\n  an agent submit that names `secrets` — the key is optional precisely so a card is never stored\n  under a key that dies with the isolate. An agent submit naming `integrations` on a deployment\n  with no control plane is refused the same way. Branch on `code`, then read `capability` and\n  `missing` — those two fields are what separate these.\n- **`AgentFile` is not nameable from this package.** `AgentHandle.addFile` and `AgentApi.addFile`\n  answer `Result<AgentFile>`, the interface is declared and exported in `src/agent.ts`, and\n  `src/index.ts` does not re-export it — so a customer resolving through the `exports` map cannot\n  name the type their own upload call returns. Same defect the Surface note above describes for\n  `@outcrawl/core` types, one hop closer.\n","readmeFilename":"README.md"}