{"_id":"@aimeter/sdk","name":"@aimeter/sdk","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@aimeter/sdk","version":"1.0.0","description":"Server-side TypeScript SDK for aimeter usage tracking and limit enforcement.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"keywords":["ai","llm","usage-tracking","cost-tracking","ai-metering","saas"],"license":"MIT","publishConfig":{"access":"public"},"devDependencies":{"@workspace/typescript-config":"workspace:*","typescript":"^5"},"gitHead":"5521eb52f324f90acaf59c395294628b1a20b270","_id":"@aimeter/sdk@1.0.0","_nodeVersion":"26.4.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-2Qn7W95PBRcXTOd7m0Z/qs/dMMK19Szq9YMHUVzXE/RimE+Q7GWEGAmfok6+h4FNh5/PiVZu9FPZ60jVDjjhew==","shasum":"bfcafa5a01f04d64698f4d76b396286fd2428451","tarball":"https://registry.npmjs.org/@aimeter/sdk/-/sdk-1.0.0.tgz","fileCount":14,"unpackedSize":12134,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDoD3RpeUGibjsotn8PhrAx0M+NcbgzetX4aXkt1Qn/bwIhANy4q7eVkw0D+dXl+weVJsRwapYPg7qlugg4vMQJvukp"}]},"_npmUser":{"name":"deepakjonnalagadda","email":"deepak.jonnalagadda@gmail.com"},"directories":{},"maintainers":[{"name":"deepakjonnalagadda","email":"deepak.jonnalagadda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.0.0_1782971986278_0.3504881062039997"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-02T05:59:46.096Z","1.0.0":"2026-07-02T05:59:46.414Z","modified":"2026-07-02T05:59:46.661Z"},"maintainers":[{"name":"deepakjonnalagadda","email":"deepak.jonnalagadda@gmail.com"}],"description":"Server-side TypeScript SDK for aimeter usage tracking and limit enforcement.","keywords":["ai","llm","usage-tracking","cost-tracking","ai-metering","saas"],"license":"MIT","readme":"# @aimeter/sdk\n\nServer-side TypeScript SDK for checking AI usage limits and reporting token usage to aimeter.\n\nFull setup, provider integrations, product guides, and API reference are available at [aimeter.cloud/docs](https://aimeter.cloud/docs).\n\n## Server-side only\n\nDo not import `@aimeter/sdk` into browser-side code. Project API keys are private credentials and must only be used in route handlers, server actions, API servers, serverless functions, or workers.\n\n## Install\n\n```bash\npnpm add @aimeter/sdk\n```\n\n## Initialize\n\n```ts\nimport { Aimeter } from \"@aimeter/sdk\"\n\nconst aimeter = new Aimeter({\n  apiKey: process.env.AIMETER_API_KEY!,\n})\n```\n\nThe production API defaults to `https://api.aimeter.cloud`.\n\nFor local development, set `baseUrl` to the aimeter API origin:\n\n```ts\nconst aimeter = new Aimeter({\n  apiKey: process.env.AIMETER_API_KEY!,\n  baseUrl: \"http://localhost:4000\",\n  timeoutMs: 5_000,\n})\n```\n\n## Check a limit\n\nCall this before making an AI provider request:\n\n```ts\nconst limit = await aimeter.checkLimit({\n  userId: user.id,\n  userEmail: user.email,\n  plan: \"pro\",\n  feature: \"rewrite\",\n})\n\nif (!limit.allowed) {\n  throw new Error(`AI request blocked: ${limit.reason}`)\n}\n```\n\nLimit checks are best-effort in v1. Concurrent requests can pass checks before earlier requests are reported.\n\n## Track usage\n\nCall this after receiving token usage from the AI provider:\n\n```ts\ntry {\n  await aimeter.trackUsage({\n    requestId: completion.id,\n    userId: user.id,\n    userEmail: user.email,\n    plan: \"pro\",\n    feature: \"rewrite\",\n    provider: \"openai\",\n    model: \"gpt-4o-mini\",\n    inputTokens: completion.usage?.prompt_tokens ?? 0,\n    outputTokens: completion.usage?.completion_tokens ?? 0,\n  })\n} catch (error) {\n  // Tracking failures should normally be logged without hiding AI output.\n  console.error(\"aimeter tracking failed\", error)\n}\n```\n\n`requestId` makes retries idempotent within a project. Reusing it returns the existing usage event instead of recording a duplicate.\n\n## Errors\n\n```ts\nimport { AimeterApiError } from \"@aimeter/sdk\"\n\ntry {\n  await aimeter.checkLimit(input)\n} catch (error) {\n  if (error instanceof AimeterApiError) {\n    console.error(error.code, error.status, error.message)\n  }\n}\n```\n\nApplications should explicitly choose whether a failed limit check fails open or fails closed. The SDK does not choose this policy for you.\n\n## Provider guides\n\n- [OpenAI Responses API](https://aimeter.cloud/docs/integrations/openai)\n- [Anthropic Messages API](https://aimeter.cloud/docs/integrations/anthropic)\n- [Google Gemini](https://aimeter.cloud/docs/integrations/gemini)\n- [REST API](https://aimeter.cloud/docs/integrations/rest-api)\n","readmeFilename":"README.md","_rev":"1-3e1a31de3697f42e6459a9a3f96c3c2c"}