{"_id":"@armature-tech/ai-traffic","_rev":"4-77dd3df8b1625816ea305fc4a23222f2","name":"@armature-tech/ai-traffic","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@armature-tech/ai-traffic","version":"0.1.0","keywords":["ai","crawler","bot","analytics","vercel","cloudflare","armature"],"author":{"name":"Armature","email":"support@armature.tech"},"license":"Apache-2.0","_id":"@armature-tech/ai-traffic@0.1.0","maintainers":[{"name":"benjamarmature","email":"benjamin@armature.tech"},{"name":"theotzen","email":"theodore@armature.tech"}],"homepage":"https://github.com/armature-tech/ai-traffic#readme","bugs":{"url":"https://github.com/armature-tech/ai-traffic/issues"},"dist":{"shasum":"3afa8a52aa12206ffc1b23c7a3ea24a9ae120d61","tarball":"https://registry.npmjs.org/@armature-tech/ai-traffic/-/ai-traffic-0.1.0.tgz","fileCount":51,"integrity":"sha512-tdjmTPwCGpCmyaOHsHUl/JGmehBna+ZZmeACkGVUDEQNxxTFDzOvjVywHonW0nsK4L+dE8xfRgiVKcM5r5SUnA==","signatures":[{"sig":"MEUCIDkAKqfwqMXdrVaEpcZfBgHY0EMWKOZxzQj2Ido/DOa+AiEA515iKx3GHGaO0kh0Ipvj6qW31WvdCbM6g4aSD8A/a6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@armature-tech%2fai-traffic@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82659},"main":"./dist/cjs/index.js","type":"module","_from":"file:/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.0.tgz","types":"./dist/cjs/index.d.ts","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./hono":{"import":{"types":"./dist/esm/hono.d.ts","default":"./dist/esm/hono.js"},"require":{"types":"./dist/cjs/hono.d.ts","default":"./dist/cjs/hono.js"}},"./vercel":{"import":{"types":"./dist/esm/vercel.d.ts","default":"./dist/esm/vercel.js"},"require":{"types":"./dist/cjs/vercel.d.ts","default":"./dist/cjs/vercel.js"}},"./express":{"import":{"types":"./dist/esm/express.d.ts","default":"./dist/esm/express.js"},"require":{"types":"./dist/cjs/express.d.ts","default":"./dist/cjs/express.js"}},"./cloudflare":{"import":{"types":"./dist/esm/cloudflare.d.ts","default":"./dist/esm/cloudflare.js"},"require":{"types":"./dist/cjs/cloudflare.d.ts","default":"./dist/cjs/cloudflare.js"}}},"scripts":{"test":"npm run build && node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:markers && node scripts/stamp-version.mjs","check":"npm run typecheck && npm test && npm run check:examples","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit -p tsconfig.test.json","build:markers":"node -e \"require('fs').writeFileSync('dist/esm/package.json', '{\\\"type\\\":\\\"module\\\"}\\n'); require('fs').writeFileSync('dist/cjs/package.json', '{\\\"type\\\":\\\"commonjs\\\"}\\n')\"","check:examples":"tsc --noEmit -p examples/tsconfig.json","prepublishOnly":"npm run check && npm run build && node scripts/check-pack.mjs","test:frameworks":"npm run build && node scripts/test-frameworks.mjs","test:release-canary":"npm run build && node scripts/run-release-dry-run.mjs","test:artifact-canary":"npm run build && node scripts/check-pack.mjs && node scripts/run-publish-canary.mjs"},"_npmUser":{"name":"theotzen","email":"theodore@armature.tech"},"_resolved":"/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.0.tgz","_integrity":"sha512-tdjmTPwCGpCmyaOHsHUl/JGmehBna+ZZmeACkGVUDEQNxxTFDzOvjVywHonW0nsK4L+dE8xfRgiVKcM5r5SUnA==","repository":{"url":"git+https://github.com/armature-tech/ai-traffic.git","type":"git"},"_npmVersion":"10.9.8","description":"Server and edge request analytics for AI crawler traffic.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"hono":"4.13.5","next":"16.3.3","react":"19.2.8","express":"5.2.1","react-dom":"19.2.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"5.0.6","@cloudflare/workers-types":"5.20260826.1"},"_npmOperationalInternal":{"tmp":"tmp/ai-traffic_0.1.0_1787829644829_0.767932162656451","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@armature-tech/ai-traffic","version":"0.1.1","keywords":["ai","crawler","bot","analytics","vercel","cloudflare","armature"],"author":{"name":"Armature","email":"support@armature.tech"},"license":"Apache-2.0","_id":"@armature-tech/ai-traffic@0.1.1","maintainers":[{"name":"benjamarmature","email":"benjamin@armature.tech"},{"name":"theotzen","email":"theodore@armature.tech"},{"name":"louis.scremin","email":"louis@armature.tech"}],"homepage":"https://github.com/armature-tech/ai-traffic#readme","bugs":{"url":"https://github.com/armature-tech/ai-traffic/issues"},"dist":{"shasum":"6a37ea82e6854109158310726e2d451a18ef5aba","tarball":"https://registry.npmjs.org/@armature-tech/ai-traffic/-/ai-traffic-0.1.1.tgz","fileCount":51,"integrity":"sha512-fYiOLDo7VNka740jQgOSs0R3NeC/5XPaNDO58yuIRA42Zm5QqnHsP/hst70n1BBLcVersZurNh+5iEUWtYbraw==","signatures":[{"sig":"MEYCIQC1XMiiHblkxnPT4Xha+07RT12UYHg/TBXJ5CB/iyvdcgIhAI0bKGk91mxDdhBLTDBnRPcLaybNFwsUrxvKesm4gEjy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICor+c8bjzRDQvF8jjKgyllmIFMIoxY9+uCMMR1wPESaAiEAortjUNxmk7hYz/F+2+w3E71qTBRUUrFHNF4AOo3maZ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@armature-tech%2fai-traffic@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82737},"main":"./dist/cjs/index.js","type":"module","_from":"file:/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.1.tgz","types":"./dist/cjs/index.d.ts","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./hono":{"import":{"types":"./dist/esm/hono.d.ts","default":"./dist/esm/hono.js"},"require":{"types":"./dist/cjs/hono.d.ts","default":"./dist/cjs/hono.js"}},"./vercel":{"import":{"types":"./dist/esm/vercel.d.ts","default":"./dist/esm/vercel.js"},"require":{"types":"./dist/cjs/vercel.d.ts","default":"./dist/cjs/vercel.js"}},"./express":{"import":{"types":"./dist/esm/express.d.ts","default":"./dist/esm/express.js"},"require":{"types":"./dist/cjs/express.d.ts","default":"./dist/cjs/express.js"}},"./cloudflare":{"import":{"types":"./dist/esm/cloudflare.d.ts","default":"./dist/esm/cloudflare.js"},"require":{"types":"./dist/cjs/cloudflare.d.ts","default":"./dist/cjs/cloudflare.js"}}},"scripts":{"test":"npm run build && node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:markers && node scripts/stamp-version.mjs","check":"npm run typecheck && npm test && npm run check:examples","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit -p tsconfig.test.json","build:markers":"node -e \"require('fs').writeFileSync('dist/esm/package.json', '{\\\"type\\\":\\\"module\\\"}\\n'); require('fs').writeFileSync('dist/cjs/package.json', '{\\\"type\\\":\\\"commonjs\\\"}\\n')\"","check:examples":"tsc --noEmit -p examples/tsconfig.json","prepublishOnly":"npm run check && npm run build && node scripts/check-pack.mjs","test:frameworks":"npm run build && node scripts/test-frameworks.mjs","test:release-canary":"npm run build && node scripts/run-release-dry-run.mjs","test:artifact-canary":"npm run build && node scripts/check-pack.mjs && node scripts/run-publish-canary.mjs"},"_npmUser":{"name":"theotzen","email":"theodore@armature.tech"},"_resolved":"/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.1.tgz","_integrity":"sha512-fYiOLDo7VNka740jQgOSs0R3NeC/5XPaNDO58yuIRA42Zm5QqnHsP/hst70n1BBLcVersZurNh+5iEUWtYbraw==","repository":{"url":"git+https://github.com/armature-tech/ai-traffic.git","type":"git"},"_npmVersion":"10.9.8","description":"Server and edge request analytics for AI crawler traffic.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"hono":"4.13.5","next":"16.3.3","react":"19.2.8","express":"5.2.1","react-dom":"19.2.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"5.0.6","@cloudflare/workers-types":"5.20260826.1"},"_npmOperationalInternal":{"tmp":"tmp/ai-traffic_0.1.1_1790001267782_0.7718682598821449","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"_id":"@armature-tech/ai-traffic@0.1.2","bugs":{"url":"https://github.com/armature-tech/ai-traffic/issues"},"dist":{"shasum":"db07e6722807008b68e3b3f6cf9430111e385dd6","tarball":"https://registry.npmjs.org/@armature-tech/ai-traffic/-/ai-traffic-0.1.2.tgz","fileCount":51,"integrity":"sha512-VJ3vxfoGUxJr/8OoYhcdMJppA1Glkxsl32snQR72KnOenuiwuqkNM/iLIwctrczoKmRkZ6aVCJTFjh3E7ylZ3A==","signatures":[{"sig":"MEYCIQDt1IuccN6COUpiH7TBAi8x+LH5PhSMmracS+5NrESjXgIhAM8YWHC0Lx/MPGpyqjUwPyqN/WdzmPwjcIyfGFClMUwS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAX5XHYG8byiEBGr6y2/l88V2mHJMJkstDaiSzGq24HLAiEAnXb95VgL7uxAxrQC41RFwAHrA8YoQA59tt5roY4Bmk0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@armature-tech%2fai-traffic@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82759},"main":"./dist/cjs/index.js","name":"@armature-tech/ai-traffic","type":"module","_from":"file:/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.2.tgz","types":"./dist/cjs/index.d.ts","author":{"name":"Armature","email":"support@armature.tech"},"engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./hono":{"import":{"types":"./dist/esm/hono.d.ts","default":"./dist/esm/hono.js"},"require":{"types":"./dist/cjs/hono.d.ts","default":"./dist/cjs/hono.js"}},"./vercel":{"import":{"types":"./dist/esm/vercel.d.ts","default":"./dist/esm/vercel.js"},"require":{"types":"./dist/cjs/vercel.d.ts","default":"./dist/cjs/vercel.js"}},"./express":{"import":{"types":"./dist/esm/express.d.ts","default":"./dist/esm/express.js"},"require":{"types":"./dist/cjs/express.d.ts","default":"./dist/cjs/express.js"}},"./cloudflare":{"import":{"types":"./dist/esm/cloudflare.d.ts","default":"./dist/esm/cloudflare.js"},"require":{"types":"./dist/cjs/cloudflare.d.ts","default":"./dist/cjs/cloudflare.js"}}},"license":"Apache-2.0","scripts":{"test":"npm run build && node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:markers && node scripts/stamp-version.mjs","check":"npm run typecheck && npm test && npm run check:examples","clean":"rm -rf dist","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit -p tsconfig.test.json","build:markers":"node -e \"require('fs').writeFileSync('dist/esm/package.json', '{\\\"type\\\":\\\"module\\\"}\\n'); require('fs').writeFileSync('dist/cjs/package.json', '{\\\"type\\\":\\\"commonjs\\\"}\\n')\"","check:examples":"tsc --noEmit -p examples/tsconfig.json","prepublishOnly":"npm run check && npm run build && node scripts/check-pack.mjs","test:frameworks":"npm run build && node scripts/test-frameworks.mjs","test:release-canary":"npm run build && node scripts/run-release-dry-run.mjs","test:artifact-canary":"npm run build && node scripts/check-pack.mjs && node scripts/run-publish-canary.mjs"},"version":"0.1.2","_npmUser":{"name":"theotzen","email":"theodore@armature.tech"},"homepage":"https://github.com/armature-tech/ai-traffic#readme","keywords":["ai","crawler","bot","analytics","vercel","cloudflare","armature"],"_resolved":"/home/runner/work/ai-traffic/ai-traffic/armature-tech-ai-traffic-0.1.2.tgz","_integrity":"sha512-VJ3vxfoGUxJr/8OoYhcdMJppA1Glkxsl32snQR72KnOenuiwuqkNM/iLIwctrczoKmRkZ6aVCJTFjh3E7ylZ3A==","repository":{"url":"git+https://github.com/armature-tech/ai-traffic.git","type":"git"},"_npmVersion":"10.9.9","description":"Server and edge request analytics for AI crawler traffic.","directories":{},"maintainers":[{"name":"benjamarmature","email":"benjamin@armature.tech"},{"name":"theotzen","email":"theodore@armature.tech"},{"name":"louis.scremin","email":"louis@armature.tech"}],"sideEffects":false,"_nodeVersion":"22.23.3","publishConfig":{"access":"public","registry":"https://registry.npmjs.org","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"hono":"4.13.5","next":"16.3.3","react":"19.2.8","express":"5.2.1","react-dom":"19.2.8","typescript":"^5.7.2","@types/node":"^22.10.2","@types/express":"5.0.6","@cloudflare/workers-types":"5.20260826.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-traffic_0.1.2_1791057682918_0.15010146475401553"}}},"time":{"created":"2026-08-27T11:20:44.512Z","modified":"2026-10-03T20:01:23.425Z","0.1.0":"2026-08-27T11:20:44.978Z","0.1.1":"2026-09-21T14:34:27.869Z","0.1.2":"2026-10-03T20:01:23.058Z"},"bugs":{"url":"https://github.com/armature-tech/ai-traffic/issues"},"author":{"name":"Armature","email":"support@armature.tech"},"license":"Apache-2.0","homepage":"https://github.com/armature-tech/ai-traffic#readme","keywords":["ai","crawler","bot","analytics","vercel","cloudflare","armature"],"repository":{"url":"git+https://github.com/armature-tech/ai-traffic.git","type":"git"},"description":"Server and edge request analytics for AI crawler traffic.","maintainers":[{"name":"benjamarmature","email":"benjamin@armature.tech"},{"name":"theotzen","email":"theodore@armature.tech"},{"name":"louis.scremin","email":"louis@armature.tech"}],"readme":"# @armature-tech/ai-traffic\n\nThis package records AI crawler requests on your server or edge. Browser analytics cannot do this because many crawlers do not run page JavaScript.\n\n## Install with an AI agent\n\nCopy this prompt into your coding agent:\n\n```text\nInstall Armature AI Traffic in this project. Use @armature-tech/ai-traffic and follow https://docs.armature.tech/ai-traffic/agent-install. Complete the code, secret, DNS, deployment, and production test. Ask me only for values or access that you cannot get. Do not expose the write key or add client-side tracking.\n```\n\n## Next.js 16 quickstart\n\nInstall the package:\n\n```bash\nnpm install @armature-tech/ai-traffic\n```\n\nSave the key that Armature generated:\n\n```bash\nARMATURE_AI_TRAFFIC_API_KEY=ait_us_...\n```\n\nAdd `proxy.ts` beside your `app` or `pages` directory:\n\n```ts\nimport { createVercelAiTraffic, trackVercelRequest } from \"@armature-tech/ai-traffic/vercel\";\nimport { NextResponse, type NextFetchEvent, type NextRequest } from \"next/server\";\n\nconst traffic = createVercelAiTraffic();\n\nexport function proxy(request: NextRequest, event: NextFetchEvent) {\n  void trackVercelRequest(traffic, request, event);\n  return NextResponse.next();\n}\n\nexport const config = {\n  matcher: [\"/((?!_next/static|_next/image|favicon.ico).*)\"],\n};\n```\n\nThe matcher keeps `robots.txt`, `llms.txt`, Markdown, and sitemaps visible to the adapter.\n\nThe tracking call does not change the page response. `event.waitUntil()` keeps delivery alive after the response.\n\n## Before you deploy\n\nAI Traffic is in private beta. Ask Armature to create the site and write key. Add the DNS TXT record that Armature gives you. Then tell Armature to verify the host. `example.com` and `docs.example.com` are separate hosts. Wildcards are not supported.\n\nKeep the TXT record. The check job runs each hour. A host becomes due 24 hours after its last check. One missing answer does not stop ingestion. Armature needs at least three negative checks and 48 hours before it returns the host to `pending`. A DNS timeout does not change the host state.\n\nA new owner can verify the same host when DNS has the new proof. The valid proof transfers the host at once.\n\nUse a US key with `app.armature.tech`. Use an EU key with `eu.armature.tech`. The package selects the correct endpoint from the key.\n\nHosted sites such as Mintlify, GitBook, and ReadMe cannot install this package. You need a programmable proxy in front of that site. See [hosted sites](./docs/hosted-sites.md).\n\n## More guides\n\n- [Next.js and Vercel](./docs/vercel-nextjs.md)\n- [Cloudflare Workers and Pages](./docs/cloudflare.md)\n- [Express, Hono, and generic Fetch](./docs/node-and-fetch.md)\n- [Direct HTTPS contract](./docs/direct-api.md)\n- [Data and security](./docs/data-and-security.md)\n- [Troubleshooting](./docs/troubleshooting.md)\n\n## Public API\n\n`createAiTraffic(config)` returns `track()`, `flush()`, and `pending()`.\n\n`track()` does not throw synchronously. Delivery errors do not reject the customer request. Use `onError` to send SDK errors to your logs.\n\nThe queue holds at most 1,000 events. A short window combines concurrent requests into batches of up to 20. It drops the oldest event on overflow.\n\nUse `waitUntil` or `schedule` when the runtime has a background lifecycle. Use `delivery: \"await\"` or call `flush()` before a serverless Node function ends. Without a scheduler, the package reports one warning and uses a best-effort timer for long-running Node servers.\n\nThe package retries network and server failures. It does not retry `429`. Use `onError` to read the server code and retry delay.\n\nUse `captureOtherBots: true` to send every generic bot candidate. The default samples generic bot candidates at 1%. Known AI crawlers are always sent.\n\nThis package has no runtime dependencies. It supports Node.js 20 or later, Vercel edge runtimes, and Cloudflare Workers.\n","readmeFilename":"README.md"}