{
  "slug": "sdk/typescript",
  "title": "TypeScript SDK",
  "description": "The @cuitty/sdk package — a fail-silent, batched HTTP client for TypeScript and Node.js applications.",
  "url": "https://cuitty.com/docs/sdk/typescript",
  "markdown_url": "https://cuitty.com/docs/sdk/typescript.md",
  "json_url": "https://cuitty.com/docs/sdk/typescript.json",
  "frontmatter": {
    "title": "TypeScript SDK",
    "description": "The @cuitty/sdk package — a fail-silent, batched HTTP client for TypeScript and Node.js applications.",
    "order": 1,
    "section": "SDK",
    "updatedAt": "2026-04-27"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "typescript-sdk",
      "text": "TypeScript SDK"
    },
    {
      "depth": 2,
      "slug": "install",
      "text": "Install"
    },
    {
      "depth": 2,
      "slug": "quickstart",
      "text": "Quickstart"
    },
    {
      "depth": 2,
      "slug": "configuration",
      "text": "Configuration"
    },
    {
      "depth": 2,
      "slug": "plugins",
      "text": "Plugins"
    },
    {
      "depth": 2,
      "slug": "hono-adapter",
      "text": "Hono adapter"
    },
    {
      "depth": 2,
      "slug": "lifecycle",
      "text": "Lifecycle"
    },
    {
      "depth": 2,
      "slug": "live-performance-numbers",
      "text": "Live performance numbers"
    },
    {
      "depth": 2,
      "slug": "see-also",
      "text": "See also"
    }
  ],
  "body_markdown": "# TypeScript SDK\n\n`@cuitty/sdk` is the canonical client for sending events from a TypeScript or Bun application. It is single-package, tree-shakeable, fail-silent, and batched.\n\n## Install\n\n```bash\nbun add @cuitty/sdk\n# or\nnpm install @cuitty/sdk\n```\n\n## Quickstart\n\n```typescript\nimport { createCuittyClient } from \"@cuitty/sdk\";\nimport { auditPlugin } from \"@cuitty/sdk/plugins/audit\";\n\nconst cuitty = createCuittyClient({\n  portalUrl: \"https://app.cuitty.com\",\n  projectId: process.env.CUITTY_PROJECT_ID!,\n  apiKey: process.env.CUITTY_API_KEY!,\n});\n\ncuitty.use(auditPlugin());\ncuitty.start();\n\nawait cuitty.emit({\n  type: \"audit\",\n  timestamp: new Date().toISOString(),\n  data: {\n    actor: \"alice@example.com\",\n    action: \"secret.rotate\",\n    resource: \"stripe.live_key\",\n  },\n});\n```\n\n## Configuration\n\n```typescript\ninterface CuittyConfig {\n  portalUrl: string;          // Cuitty portal base URL\n  projectId: string;          // Project UUID\n  apiKey: string;             // cuitty_sk_...\n  flushInterval?: number;     // ms between flushes (default 5000)\n  maxBufferSize?: number;     // events before forced flush (default 500)\n  timeout?: number;           // per-request HTTP timeout (default 10000)\n  debug?: boolean;            // log to stderr (default false)\n  enabled?: boolean;          // kill switch (default true)\n}\n```\n\n## Plugins\n\n| Plugin       | Import                                  | Captures                              |\n| ------------ | --------------------------------------- | ------------------------------------- |\n| `auditPlugin` | `@cuitty/sdk/plugins/audit`             | HTTP request/response audit events    |\n| `logsPlugin`  | `@cuitty/sdk/plugins/logs`              | Pino log records                      |\n| `deploysPlugin` | `@cuitty/sdk/plugins/deploys`         | CI/CD deploy events                   |\n| `repositoryPlugin` | `@cuitty/sdk/plugins/repository`   | Git metadata                          |\n| `configsPlugin` | `@cuitty/sdk/plugins/configs`         | Config file change watcher            |\n| `costsPlugin` | `@cuitty/sdk/plugins/costs`             | Cloud cost metrics                    |\n\n## Hono adapter\n\n```typescript\nimport { Hono } from \"hono\";\n\nconst app = new Hono();\napp.use(\"*\", cuitty.honoMiddleware());\n```\n\n## Lifecycle\n\n```typescript\ncuitty.start();          // Begin buffering and flushing\nawait cuitty.flush();    // Force flush (call before process exit)\nawait cuitty.shutdown(); // Flush + stop timers\n```\n\n## Live performance numbers\n\nSee live benchmarks at [https://benchmarks.cuitty.com/sdks/typescript](https://benchmarks.cuitty.com/sdks/typescript). The benchmark harness re-runs on every release tag and posts results back to the marketing site.\n\n## See also\n\n- [Wire protocol](/docs/reference/wire-protocol)\n- [SDK parity & divergence](/docs/sdk/parity)\n- [Python SDK](/docs/sdk/python)\n- [Curl examples](/docs/sdk/curl)",
  "body_html": "<h1 id=\"typescript-sdk\">TypeScript SDK</h1>\n<p><code>@cuitty/sdk</code> is the canonical client for sending events from a TypeScript or Bun application. It is single-package, tree-shakeable, fail-silent, and batched.</p>\n<h2 id=\"install\">Install</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">bun</span><span style=\"color:#9ECBFF\"> add</span><span style=\"color:#9ECBFF\"> @cuitty/sdk</span></span>\n<span class=\"line\"><span style=\"color:#6A737D\"># or</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">npm</span><span style=\"color:#9ECBFF\"> install</span><span style=\"color:#9ECBFF\"> @cuitty/sdk</span></span></code></pre>\n<h2 id=\"quickstart\">Quickstart</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { createCuittyClient } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"@cuitty/sdk\"</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { auditPlugin } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"@cuitty/sdk/plugins/audit\"</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> cuitty</span><span style=\"color:#F97583\"> =</span><span style=\"color:#B392F0\"> createCuittyClient</span><span style=\"color:#E1E4E8\">({</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  portalUrl: </span><span style=\"color:#9ECBFF\">\"https://app.cuitty.com\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  projectId: process.env.</span><span style=\"color:#79B8FF\">CUITTY_PROJECT_ID</span><span style=\"color:#F97583\">!</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  apiKey: process.env.</span><span style=\"color:#79B8FF\">CUITTY_API_KEY</span><span style=\"color:#F97583\">!</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">});</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">cuitty.</span><span style=\"color:#B392F0\">use</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">auditPlugin</span><span style=\"color:#E1E4E8\">());</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">cuitty.</span><span style=\"color:#B392F0\">start</span><span style=\"color:#E1E4E8\">();</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">await</span><span style=\"color:#E1E4E8\"> cuitty.</span><span style=\"color:#B392F0\">emit</span><span style=\"color:#E1E4E8\">({</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  type: </span><span style=\"color:#9ECBFF\">\"audit\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  timestamp: </span><span style=\"color:#F97583\">new</span><span style=\"color:#B392F0\"> Date</span><span style=\"color:#E1E4E8\">().</span><span style=\"color:#B392F0\">toISOString</span><span style=\"color:#E1E4E8\">(),</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  data: {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    actor: </span><span style=\"color:#9ECBFF\">\"alice@example.com\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    action: </span><span style=\"color:#9ECBFF\">\"secret.rotate\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    resource: </span><span style=\"color:#9ECBFF\">\"stripe.live_key\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  },</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">});</span></span></code></pre>\n<h2 id=\"configuration\">Configuration</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">interface</span><span style=\"color:#B392F0\"> CuittyConfig</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  portalUrl</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;          </span><span style=\"color:#6A737D\">// Cuitty portal base URL</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  projectId</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;          </span><span style=\"color:#6A737D\">// Project UUID</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  apiKey</span><span style=\"color:#F97583\">:</span><span style=\"color:#79B8FF\"> string</span><span style=\"color:#E1E4E8\">;             </span><span style=\"color:#6A737D\">// cuitty_sk_...</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  flushInterval</span><span style=\"color:#F97583\">?:</span><span style=\"color:#79B8FF\"> number</span><span style=\"color:#E1E4E8\">;     </span><span style=\"color:#6A737D\">// ms between flushes (default 5000)</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  maxBufferSize</span><span style=\"color:#F97583\">?:</span><span style=\"color:#79B8FF\"> number</span><span style=\"color:#E1E4E8\">;     </span><span style=\"color:#6A737D\">// events before forced flush (default 500)</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  timeout</span><span style=\"color:#F97583\">?:</span><span style=\"color:#79B8FF\"> number</span><span style=\"color:#E1E4E8\">;           </span><span style=\"color:#6A737D\">// per-request HTTP timeout (default 10000)</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  debug</span><span style=\"color:#F97583\">?:</span><span style=\"color:#79B8FF\"> boolean</span><span style=\"color:#E1E4E8\">;            </span><span style=\"color:#6A737D\">// log to stderr (default false)</span></span>\n<span class=\"line\"><span style=\"color:#FFAB70\">  enabled</span><span style=\"color:#F97583\">?:</span><span style=\"color:#79B8FF\"> boolean</span><span style=\"color:#E1E4E8\">;          </span><span style=\"color:#6A737D\">// kill switch (default true)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span></code></pre>\n<h2 id=\"plugins\">Plugins</h2>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Plugin</th><th>Import</th><th>Captures</th></tr></thead><tbody><tr><td><code>auditPlugin</code></td><td><code>@cuitty/sdk/plugins/audit</code></td><td>HTTP request/response audit events</td></tr><tr><td><code>logsPlugin</code></td><td><code>@cuitty/sdk/plugins/logs</code></td><td>Pino log records</td></tr><tr><td><code>deploysPlugin</code></td><td><code>@cuitty/sdk/plugins/deploys</code></td><td>CI/CD deploy events</td></tr><tr><td><code>repositoryPlugin</code></td><td><code>@cuitty/sdk/plugins/repository</code></td><td>Git metadata</td></tr><tr><td><code>configsPlugin</code></td><td><code>@cuitty/sdk/plugins/configs</code></td><td>Config file change watcher</td></tr><tr><td><code>costsPlugin</code></td><td><code>@cuitty/sdk/plugins/costs</code></td><td>Cloud cost metrics</td></tr></tbody></table>\n<h2 id=\"hono-adapter\">Hono adapter</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { Hono } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"hono\"</span><span style=\"color:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> app</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> new</span><span style=\"color:#B392F0\"> Hono</span><span style=\"color:#E1E4E8\">();</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">app.</span><span style=\"color:#B392F0\">use</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"*\"</span><span style=\"color:#E1E4E8\">, cuitty.</span><span style=\"color:#B392F0\">honoMiddleware</span><span style=\"color:#E1E4E8\">());</span></span></code></pre>\n<h2 id=\"lifecycle\">Lifecycle</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"typescript\"><code><span class=\"line\"><span style=\"color:#E1E4E8\">cuitty.</span><span style=\"color:#B392F0\">start</span><span style=\"color:#E1E4E8\">();          </span><span style=\"color:#6A737D\">// Begin buffering and flushing</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">await</span><span style=\"color:#E1E4E8\"> cuitty.</span><span style=\"color:#B392F0\">flush</span><span style=\"color:#E1E4E8\">();    </span><span style=\"color:#6A737D\">// Force flush (call before process exit)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">await</span><span style=\"color:#E1E4E8\"> cuitty.</span><span style=\"color:#B392F0\">shutdown</span><span style=\"color:#E1E4E8\">(); </span><span style=\"color:#6A737D\">// Flush + stop timers</span></span></code></pre>\n<h2 id=\"live-performance-numbers\">Live performance numbers</h2>\n<p>See live benchmarks at <a href=\"https://benchmarks.cuitty.com/sdks/typescript\">https://benchmarks.cuitty.com/sdks/typescript</a>. The benchmark harness re-runs on every release tag and posts results back to the marketing site.</p>\n<h2 id=\"see-also\">See also</h2>\n<ul>\n<li><a href=\"/docs/reference/wire-protocol\">Wire protocol</a></li>\n<li><a href=\"/docs/sdk/parity\">SDK parity &#x26; divergence</a></li>\n<li><a href=\"/docs/sdk/python\">Python SDK</a></li>\n<li><a href=\"/docs/sdk/curl\">Curl examples</a></li>\n</ul>",
  "links_out": [
    "https://benchmarks.cuitty.com/sdks/typescript",
    "/docs/reference/wire-protocol",
    "/docs/sdk/parity",
    "/docs/sdk/python",
    "/docs/sdk/curl"
  ]
}