{"_id":"@abundera/qr-pro","name":"@abundera/qr-pro","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@abundera/qr-pro","version":"0.1.0","description":"Official TypeScript SDK for Abundera QR Pro — dynamic QR codes, analytics, webhooks.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc","test":"vitest run","prepublishOnly":"npm run build"},"keywords":["qr","qr-code","dynamic-qr","abundera","analytics","webhooks"],"author":{"name":"Abundera, Inc."},"license":"MIT","homepage":"https://pro.qr.abundera.ai/docs/","repository":{"type":"git","url":"git+https://github.com/abundera/qr-pro-sdk-typescript.git"},"engines":{"node":">=18"},"devDependencies":{"typescript":"^5.4.0","vitest":"^3.2.4","@types/node":"^20.11.0"},"_id":"@abundera/qr-pro@0.1.0","gitHead":"1ad7a3432f3e196f5f52fd0186af8c0c756148f9","bugs":{"url":"https://github.com/abundera/qr-pro-sdk-typescript/issues"},"_nodeVersion":"23.9.0","_npmVersion":"11.2.0","dist":{"integrity":"sha512-LCI5TOdr81/R410jJsq6F9v269XIgNYo+z3C1Nifj+3yPHFQvM7D9qmoFdmFSEKkHS5vrMSSyBWsWzO0Ez0uzQ==","shasum":"199dd859395a2abb0a2cc9749c4b55a4fd04ceb1","tarball":"https://registry.npmjs.org/@abundera/qr-pro/-/qr-pro-0.1.0.tgz","fileCount":23,"unpackedSize":39732,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDWOUXYp20Q9fAtiqq2DTEr0lojeQkSihMfvA6NNC66PgIhAOQ1EXwMpSfDIDbyA6I2ZO9J+fqnVeLbbfTD51bx/h5j"}]},"_npmUser":{"name":"cisco801","email":"support@abundera.ai"},"directories":{},"maintainers":[{"name":"cisco801","email":"support@abundera.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/qr-pro_0.1.0_1777024461365_0.6946778906195392"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-24T09:54:21.273Z","0.1.0":"2026-04-24T09:54:21.504Z","modified":"2026-04-24T09:54:21.717Z"},"maintainers":[{"name":"cisco801","email":"support@abundera.ai"}],"description":"Official TypeScript SDK for Abundera QR Pro — dynamic QR codes, analytics, webhooks.","homepage":"https://pro.qr.abundera.ai/docs/","keywords":["qr","qr-code","dynamic-qr","abundera","analytics","webhooks"],"repository":{"type":"git","url":"git+https://github.com/abundera/qr-pro-sdk-typescript.git"},"author":{"name":"Abundera, Inc."},"bugs":{"url":"https://github.com/abundera/qr-pro-sdk-typescript/issues"},"license":"MIT","readme":"# @abundera/qr-pro\n\nOfficial TypeScript SDK for [Abundera QR Pro](https://pro.qr.abundera.ai).\n\nDynamic QR codes that you actually own. Scan analytics. Webhooks. Privacy-safe by default.\n\n## Install\n\n```bash\nnpm install @abundera/qr-pro\n```\n\nRequires Node 18+ (uses built-in `fetch` and `node:crypto`).\n\n## Quickstart\n\n```ts\nimport { AbunderaQRProClient } from \"@abundera/qr-pro\";\n\nconst client = new AbunderaQRProClient({\n  apiKey: process.env.ABUNDERA_API_KEY!,\n});\n\n// Create a dynamic code\nconst code = await client.createCode({\n  destination_url: \"https://example.com/launch\",\n  label: \"Spring launch poster\",\n  tags: [\"print\", \"q2\"],\n});\n\nconsole.log(code.short_url); // https://aqr.net/xY3pK2\n\n// Later: change where it points\nawait client.updateCode(code.id, {\n  destination_url: \"https://example.com/launch/v2\",\n});\n\n// Pull analytics\nconst stats = await client.getAnalytics(code.id, { from: \"2026-04-01\" });\nconsole.log(stats.total_scans, stats.by_country);\n```\n\n## Webhook verification\n\n```ts\nimport { verifyWebhookSignature } from \"@abundera/qr-pro\";\n\n// In your webhook handler:\nconst signature = req.headers[\"x-abundera-signature\"];\nconst body = await readRawBody(req); // raw string, NOT parsed JSON\n\nverifyWebhookSignature({\n  signature,\n  body,\n  secret: process.env.ABUNDERA_WEBHOOK_SECRET!,\n});\n// throws if invalid — safe to parse and act on body after this line\n```\n\n## Configuration\n\n| Option         | Default                        | Description                                  |\n| -------------- | ------------------------------ | -------------------------------------------- |\n| `apiKey`       | **required**                   | API key from `/account/keys`                 |\n| `baseUrl`      | `https://pro.qr.abundera.ai`   | Override for self-hosted / staging           |\n| `timeoutMs`    | `30000`                        | Per-request timeout                          |\n| `maxRetries`   | `3`                            | Retries for 429/5xx (exponential backoff)    |\n| `userAgent`    | `abundera-qr-pro-js/<version>` | Sent on every request                        |\n| `fetch`        | global `fetch`                 | Inject a custom fetch implementation         |\n\n## Error handling\n\nAll non-2xx responses (after retries) throw `AbunderaError`:\n\n```ts\nimport { AbunderaError } from \"@abundera/qr-pro\";\n\ntry {\n  await client.createCode({ destination_url: \"not a url\" });\n} catch (e) {\n  if (e instanceof AbunderaError) {\n    console.error(e.status, e.code, e.message, e.request_id);\n  }\n}\n```\n\n## Coverage\n\nSupported surfaces: codes (CRUD + import + slug check), analytics (JSON + CSV), groups, webhooks, user. See [API docs](https://pro.qr.abundera.ai/docs/) for the full OpenAPI 3.1 spec.\n\n## License\n\nMIT © Abundera, Inc.\n","readmeFilename":"README.md","_rev":"1-989860d6d9c183fba689fa97f4ca1d33"}