{"_id":"2factor-sdk","_rev":"9-5617cb320ede832cdf9331e3e997e84c","name":"2factor-sdk","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.0":{"name":"2factor-sdk","version":"1.0.0","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.0","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"dist":{"shasum":"1781c16c682e446dc0959a8f2d8457743e9da6e2","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.0.tgz","fileCount":6,"integrity":"sha512-E3mEHPVHPbab0vIyxfjt/FLmGqzDOm8JaQRG/me6ARink1DQmgSHsioBJCLpR4iAxvwfn/qQhDfb1QbdntBLJQ==","signatures":[{"sig":"MEUCIQDWnwIcX4hzMt7CYiiBYPVCbdj3NJLSGgEjq6dvIk0X6AIgbZ2uVdOkd9VBogfDW/MgLe4fxH9mZn7iHBwsi1e8IWE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40125},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"9ee07d6f21558ed4a7cafa2b07b68142e77e1279","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"deprecated":"Versions below 1.0.4 are deprecated. Please upgrade.","_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","2factor-sdk":"file:2factor-sdk-1.0.0.tgz","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2","@arethetypeswrong/cli":"^0.17.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.0_1736024948260_0.6436357805990036","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"2factor-sdk","version":"1.0.1","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.1","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"dist":{"shasum":"c4b02373e76c114ce0b7593adb15ea6e29f191b5","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.1.tgz","fileCount":6,"integrity":"sha512-G+H2AGbAy0cmWYAuiMW9ofrkCLwRYYyQKccGMugl2fERI9PCidnLFgkgG0N0g3EHICARcK9y553FqzCCn+kl6A==","signatures":[{"sig":"MEUCIQDTBnUy6OS1DmTbaCi2HP6sv0XQYlLtxc4ZW7u+imriTQIgKy+se19y5K6ppnvfo/8LeNJ1lmqgY00l7lR4WhLI7dI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40125},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"9ee07d6f21558ed4a7cafa2b07b68142e77e1279","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"deprecated":"Versions below 1.0.4 are deprecated. Please upgrade.","_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","2factor-sdk":"file:2factor-sdk-1.0.0.tgz","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2","@arethetypeswrong/cli":"^0.17.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.1_1736069934591_0.7113998769420571","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"2factor-sdk","version":"1.0.2","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.2","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"dist":{"shasum":"8eb7ff49c6e565de02e7abec0d102c0d36442f68","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.2.tgz","fileCount":6,"integrity":"sha512-LFS1LlebBl9eDjEPTpJiNy45OEAXZ33C1ed6BCLpXZwXF2bT7m8V1vEFi7ZfEkNjnPWnCxOgcjUxFNuanBgPgA==","signatures":[{"sig":"MEUCIQDQlIWbNLilz08Sm75M86MOurH5QcoKxCNBIiqJaX8FDAIgVoml79NnwvIIgfkuohiUoYDATY01A0qmYk6yDPVsSh0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40036},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"ad9e440e5e5978c86a10d7cbc217d0fb1cabe6ef","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"deprecated":"Versions below 1.0.4 are deprecated. Please upgrade.","_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.2_1736070483277_0.40728419528067294","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"2factor-sdk","version":"1.0.3","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.3","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"dist":{"shasum":"7eac972c4d1bd6e75f0f2b498a1ce20cfdfd1828","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.3.tgz","fileCount":6,"integrity":"sha512-JdSLyq7qpWe/5Mv0OkI2wwsTHYWWXToFl6CrFmaQ52+gv8dGqJ67x6Inzsn8z1TFK7MxJ9w7ykRCckZBoM+4rw==","signatures":[{"sig":"MEQCIDEzcwNNpFkhoIIac0VzpYnh50Gz5f56PD7M1ezy2atgAiA0uS+yX3K3X6jnYxSA95Lg6wXYxhDnkNq0RfdaOyAj0w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40036},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"d3300898058b6c2fef4c3a6aecbfc3b75a22569c","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"deprecated":"Versions below 1.0.4 are deprecated. Please upgrade.","_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.3_1736070682308_0.5722325929292891","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"2factor-sdk","version":"1.0.4","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.4","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"homepage":"https://github.com/fateenNisar/2factor#readme","bugs":{"url":"https://github.com/fateenNisar/2factor/issues"},"dist":{"shasum":"eb2841683b6e00b2a6c137369cd6fe496815813f","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.4.tgz","fileCount":6,"integrity":"sha512-Qfrnb7bZG3unr/WvxnSmuu2TUeoH6i1vQBR7JklAZyfxRexO2EVTKDNMLv9A7JA9O7a3lOXJBJjapeN84CWkiw==","signatures":[{"sig":"MEYCIQC4ZzisRx1BzdbAKrCR7qNb96BHc0huvOPzS15k8FwEdwIhAOJMZZZ//I0VcqQd4pjNvaPnCPc0Be28WBMugpkrLFii","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42007},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"794f3c5ad9aa120a42207da2696d222e083ce8a9","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"repository":{"url":"git+https://github.com/fateenNisar/2factor.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.4_1736074907443_0.19562970262409163","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"2factor-sdk","version":"1.0.5","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.5","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"homepage":"https://github.com/fateenNisar/2factor#readme","bugs":{"url":"https://github.com/fateenNisar/2factor/issues"},"dist":{"shasum":"2e0ef1b68022b18c45e596f72272103bb5ff0157","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.5.tgz","fileCount":6,"integrity":"sha512-qdxkL2S+K118AlW9tRP75KV6ATnWhxaDueIaQdUTKHZpsx23AORQbfK9Je1dkMa57Q2Axj/BPBTkmAT6tU85hQ==","signatures":[{"sig":"MEUCIQCK0LhUod6Wcgdhu2d0yR8vQPEZ8OHT0rPmQylUA5yLPgIgP9yOWpmcvZD2SIaOyZ43YLB4OBa414uwce757O9iVPQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42076},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"eb9d79386e7f0c714886ab3c68e134c6463d5b22","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"repository":{"url":"git+https://github.com/fateenNisar/2factor.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.5_1736275062095_0.989036056946655","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"2factor-sdk","version":"1.0.6","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api"],"author":{"name":"fateennisar"},"license":"MIT","_id":"2factor-sdk@1.0.6","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"homepage":"https://github.com/fateenNisar/2factor#readme","bugs":{"url":"https://github.com/fateenNisar/2factor/issues"},"dist":{"shasum":"f888d205e0b4a221225ec112d4c7aba4def4fce5","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.6.tgz","fileCount":6,"integrity":"sha512-k/nLolBzj1g5abyWKhWzswsRKyOxq3u9ivVaWu4EEL85dRKOTCdst2bTOSeugj1usiT1qoPi66quyQvjVHYZrw==","signatures":[{"sig":"MEYCIQC06UmKQ6K69O1zqwQ8jQYuuJ11poBx6jZ06LHreUU5MwIhAJJw3XAc19A9ObBCK9jdvZz7rVnv+VnjwmxqFcb6Kz/w","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":42077},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","module":"./lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","default":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"63455b34e4cf344f9025e861d3ad6736afdcacf8","scripts":{"test":"jest","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","clean":"rimraf lib","prepublishOnly":"npm run build"},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"repository":{"url":"git+https://github.com/fateenNisar/2factor.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"tsc":"^2.0.4","zod":"^3.24.1","axios":"^1.7.9","typescript":"^5.7.2","@upstash/redis":"^1.34.3","@upstash/ratelimit":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","rimraf":"^6.0.1","prettier":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/2factor-sdk_1.0.6_1736534276835_0.6821616648223876","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"2factor-sdk","version":"1.0.7","description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","type":"module","main":"./lib/index.js","module":"./lib/index.js","types":"./lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","require":"./lib/index.js","import":"./lib/index.js","default":"./lib/index.js"}},"scripts":{"clean":"rimraf lib","build":"npm run clean && tsup src/index.ts --format esm,cjs --dts --clean --outDir lib","test":"jest","prepublishOnly":"npm run build","lint":"eslint . --ext .js,.mjs,.cjs,.ts","lint:fix":"eslint . --ext .js,.mjs,.cjs,.ts --fix"},"keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api","2factor.in"],"author":{"name":"fateennisar"},"license":"MIT","dependencies":{"@upstash/ratelimit":"^2.0.5","@upstash/redis":"^1.34.3","axios":"^1.7.9","clean":"^4.0.2","tsc":"^2.0.4","typescript":"^5.7.2","zod":"^3.24.1"},"devDependencies":{"prettier":"^3.5.3","rimraf":"^6.0.1","tsup":"^8.0.1"},"repository":{"type":"git","url":"git+https://github.com/fateenNisar/2factor.git"},"_id":"2factor-sdk@1.0.7","gitHead":"91b2f800295e37be71bc2314da3532cb80d95954","bugs":{"url":"https://github.com/fateenNisar/2factor/issues"},"homepage":"https://github.com/fateenNisar/2factor#readme","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-dby2UaD3gOxjdkttawqOXmhAIH4Bc/77/KMlxbbFeTmr6S/nfEDFijMJ77aPYyYGRNZvom4di8gTzKesM1OD7Q==","shasum":"8a2bebdbffccc5b2914543d4de354b52d6f600dc","tarball":"https://registry.npmjs.org/2factor-sdk/-/2factor-sdk-1.0.7.tgz","fileCount":6,"unpackedSize":42228,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDydxfq9MKwzEdGH3R6YBLFjFHhrhxs1VZWu2gqyU1vrwIgKELsUiXbgdSwpOBKWrbzU7p4Y172WrKyw8lQuBB5TuY="}]},"_npmUser":{"name":"fateennisar","email":"fateennisar121@gmail.com"},"directories":{},"maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/2factor-sdk_1.0.7_1742669779528_0.657848402876327"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-04T21:09:08.259Z","modified":"2025-03-22T18:56:19.902Z","1.0.0":"2025-01-04T21:09:08.438Z","1.0.1":"2025-01-05T09:38:54.795Z","1.0.2":"2025-01-05T09:48:03.467Z","1.0.3":"2025-01-05T09:51:22.468Z","1.0.4":"2025-01-05T11:01:47.630Z","1.0.5":"2025-01-07T18:37:42.305Z","1.0.6":"2025-01-10T18:37:57.052Z","1.0.7":"2025-03-22T18:56:19.735Z"},"bugs":{"url":"https://github.com/fateenNisar/2factor/issues"},"author":{"name":"fateennisar"},"license":"MIT","homepage":"https://github.com/fateenNisar/2factor#readme","keywords":["2factor","2-factor","OTP","2factor-sdk","2-factor-sdk","authentication","rate-limiting","2factorin","otp-validation","two-factor-authentication","2fa","security","authentication-sdk","sms-otp","email-otp","otp-service","token-authentication","two-factor-api","2factor.in"],"repository":{"type":"git","url":"git+https://github.com/fateenNisar/2factor.git"},"description":"A TypeScript SDK for sending and validating OTPs with support for rate limiting.","maintainers":[{"name":"fateennisar","email":"fateennisar121@gmail.com"}],"readme":"\n# 2Factor.in SDK\n\nAn sdk for [2Factor.in](https://2factor.in) SMS OTP service with support for rate limiting and built-in validation using Zod.\n\n## Installation\n\n```bash\nnpm install 2factor-sdk\n```\n\n## Quick Start\n\n\n- Go to [2factor](https://2factor.in/) , sign up and get the api key.\n\n```typescript\nimport { TWOFactor } from '2factor-sdk';\n\nconst twofactor = TWOFactor.init({ \n  apiKey: 'YOUR_API_KEY',\n  // only when you want to use rate limiting.\n  upstashToken: 'YOUR_UPSTASH_TOKEN', // Optional: for rate limiting\n  upstashUrl: 'YOUR_UPSTASH_URL' // Optional: for rate limiting\n});\n\n// Send OTP\nconst result = await twofactor.sendOTP({\n  phoneNumber: '9XXXXXXXXX',\n  templateName: 'Template_Name', //two factor template name (optional)\n  interval: '30 s', // Optional: rate limiting interval (default: '30 s')\n  limit: 1 // Optional: rate limiting count (default: 1)\n});\n```\n\n## Validation Rules\n\nIf any of the validation fails it will throw an error. Wrap the code in try catch to handle the errors. use handleTFError function to get errors that can be sent to clients.\n\n### Phone Number\n\n- Must be 10 digits\n- Must start with 6, 7, 8, or 9  (Indian phone numbers only).\n\n\n```typescript\nconst response = await twofactor.sendOTP({\n  phoneNumber: '9876543210', // Valid format\n  templateName: 'Template_Name', // two factor template name (optional)\n});\n```\n\n### OTP\n\n- Length: 4-6 digits\n- Must be numeric\n\n\n```typescript\nconst verify = await twofactor.verifyByUID({\n  otp: '123456', // Valid 6-digit OTP\n  UID: 'session-uid',\n});\n```\n\n## Rate Limiting\n\nThis SDK supports rate limiting using Upstash Redis. To enable rate limiting, provide your Upstash token and URL when initializing the SDK. If these are not provided, rate limiting will not be applied.\n\nTo create an Upstash account and get your token and URL, follow these steps:\n\n1. Go to [Upstash](https://upstash.com/) and sign up for an account.\n2. Create a new Redis database.\n3. In your database details, you'll find the `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN`.\n\n\nYou can customize the rate limiting for each method call by providing `interval` and `limit` parameters. The default is 1 request per 30 seconds.\n\n```typescript\nconst result = await twofactor.sendOTP({\n  phoneNumber: '9XXXXXXXXX',\n  templateName: 'Template_Name',\n  interval: '1 m', // 1 minute\n  limit: 5 // 5 requests allowed per minute\n});\n```\n\n## Error Handling\n\nThis sdk has proper support for error handling and will return sanitized errors that we can directly sent to client without exposing other errors.\n\n```typescript\nimport { handleTFError, TWOFactor } from '2factor-sdk'\n\ntry {\n  const response = await client.sendOTP({\n    phoneNumber: '9XXXXXXXXX',\n    templateName: 'Template_Name'\n  });\n} catch (error) {\n  const handledError = handleTFError(error);\n  if (handledError) {\n    // return sanitized error to client\n  }\n}\n```\n\n\n\n## API Methods\n\n### sendOTP()\n\nGenerates and sends a random OTP to the specified phone number. Supports both 4-digit and 6-digit OTPs.\n\n```typescript\nconst response = await twofactor.sendOTP({\n  phoneNumber: \"9XXXXXXXXX\", // Required: 10-digit number\n  // Optional fields\n  templateName: \"OTP1\", // Optional: SMS template\n  otpLength: 4, // Optional: 4 or 6 (default: 4)\n  interval: \"30 s\", // Optional: rate limiting interval (default: '30 s')\n  limit: 1 // Optional: rate limiting count (default: 1)\n});\n```\n\nReturns: `{ UID: string }` - Session UID for verification\n\n### sendAndReturnOTP()\n\nSimilar to sendOTP but also returns the generated OTP value. Useful for testing or scenarios where you need to know the OTP.\n\n```typescript\nconst response = await client.sendAndReturnOTP({\n  phoneNumber: \"9XXXXXXXXX\", // Required: 10-digit number\n  // optional fields\n  templateName: \"OTP1\", // Optional: SMS template\n  interval: \"30 s\", // Optional: rate limiting interval (default: '30 s')\n  limit: 1 // Optional: rate limiting count (default: 1)\n});\n```\n\nReturns: `{ OTP: string, UID: string }` - Both OTP and session UID\n\n### sendCustomOTP()\n\nSends a custom OTP value instead of generating a random one. Useful when you want to control the OTP value.\n\n```typescript\nconst response = await twofactor.sendCustomOTP({\n  phoneNumber: \"9XXXXXXXXX\", // Required: 10-digit number\n  // optional fields\n  templateName: \"OTP1\", // Optional: SMS template\n  otp: \"1234\", // Required: 4 or 6  digit numeric OTP\n  interval: \"30 s\", // Optional: rate limiting interval (default: '30 s')\n  limit: 1 // Optional: rate limiting count (default: 1)\n});\n```\n\nReturns: `{ UID: string }` - Session UID for verification\n\n### verifyByUID()\n\nVerifies an OTP using the session UID. Most secure method as it validates against a specific session.\n\n```typescript\nconst isValid = await client.verifyByUID({\n  otp: '1234', // Required: 4-6 digit OTP\n  UID: '47dac35a-c9f9-11ef-8b17-0200cd936042', // Required: 36-char session ID\n});\nif (!isValid)\n{\n    // throw error\n}\n```\n\nReturns: `boolean` - true if OTP is valid. Undefined if not valid.\n\n### verifyByPhone()\n\nVerifies an OTP using the phone number. Alternative verification method when UID is not available.\n\n```typescript\nconst isValid = await client.verifyByPhone({\n  otp: string, // Required: 4-6 digit OTP\n  phoneNumber: string, // Required: 10-digit number\n});\nif (!isValid)\n{\n    // throw error\n}\n```\n\n\n\n\n\nReturns: `boolean` - true if OTP is valid. Undefined if not valid.\n\n\n\n### Example Usage (With rate limiting).\n\n\n```js\nimport express from 'express';\nimport dotenv from 'dotenv';\nimport { TWOFactor, handleTFError } from '2factor-sdk';\n\n// Load environment variables\ndotenv.config();\n\nconst app = express();\nconst port = process.env.PORT || 3000;\n\n// Initialize TWOFactor client\nconst tf = TWOFactor.init({\n  apiKey: process.env.TWOFACTOR_API_KEY!,\n  upstashToken: process.env.UPSTASH_TOKEN,\n  upstashUrl: process.env.UPSTASH_URL,\n});\n\n// Middleware to parse JSON bodies\napp.use(express.json());\n\n// OTP sending endpoint\napp.post('/send-otp', async (req, res) => {\n  const { phoneNumber } = req.body;\n\n  try {\n    // Send OTP\n    const result = await tf.sendOTP({\n      phoneNumber: phoneNumber,\n      limit: 1,\n      interval: '30 s'\n    });\n\n    return res.json({\n      success: true,\n      data: result\n    });\n  } catch (error) {\n    // Handle TWOFactor specific errors including validation errors.\n    // can be send to client.\n    const handledError = handleTFError(error);\n    \n    if (handledError) {\n      return res.status(400).json({\n        success: false,\n        error: handledError\n      });\n    }\n\n    // Handle unexpected errors\n    console.error('Unexpected error:', error);\n    return res.status(500).json({\n      success: false,\n      error: 'Internal server error'\n    });\n  }\n});\n\n// Start the server\napp.listen(port, () => {\n  console.log(`OTP API server running on port ${port}`);\n});\n\n\n```\n\n## License\n\nMIT\n\n## Support\n\nFor support, email [fateennisar121@gmail.com](mailto:fateennisar121@gmail.com) or create an issue in the GitHub repository.\n","readmeFilename":"README.md"}