@apitap/core 1.6.3 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +166 -69
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,29 +1,31 @@
1
1
  # ApiTap
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@apitap/core)](https://www.npmjs.com/package/@apitap/core)
4
- [![tests](https://img.shields.io/badge/tests-1195%20passing-brightgreen)](https://github.com/n1byn1kt/apitap)
4
+ [![tests](https://img.shields.io/badge/tests-1299%20passing-brightgreen)](https://github.com/n1byn1kt/apitap)
5
5
  [![license](https://img.shields.io/badge/license-BSL--1.1-blue)](./LICENSE)
6
6
 
7
7
  **The MCP server that turns any website into an API — no docs, no SDK, no browser.**
8
8
 
9
- ApiTap is an MCP server that lets AI agents browse the web through APIs instead of browsers. When an agent needs data from a website, ApiTap automatically detects the site's framework (WordPress, Next.js, Shopify, etc.), discovers its internal API endpoints, and calls them directly returning clean JSON instead of forcing the agent to render and parse HTML. For sites that need authentication, it opens a browser window for a human to log in, captures the session tokens, and hands control back to the agent. Every site visited generates a reusable "skill file" that maps the site's APIs, so the first visit is a discovery step and every subsequent visit is a direct, instant API call. It works with any MCP-compatible LLM client and reduces token costs by 20-100x compared to browser automation.
9
+ ApiTap is an MCP server that lets AI agents browse the web through APIs instead of browsers. It ships with **6,400+ pre-mapped endpoints** across 280+ APIs (Stripe, GitHub, Twilio, Slack, Spotify, and more)ready to query on install. For sites not in the database, it captures API traffic from any website, generates reusable "skill files," and replays them directly with `fetch()`. No DOM, no selectors, no flaky waits. Token costs drop 20-100x compared to browser automation.
10
10
 
11
11
  The web was built for human eyes; ApiTap makes it native to machines.
12
12
 
13
13
  ```bash
14
- # One tool call: discover the API + replay it
15
- apitap browse https://techcrunch.com
16
- ✓ Discovery: WordPress detected (medium confidence)
17
- Replay: GET /wp-json/wp/v2/posts 200 (10 articles)
14
+ # Import 280+ APIs instantly no browser needed
15
+ apitap import --from apis-guru --limit 100
16
+ Done: 87 imported, 3 failed, 10 skipped
17
+ 1,847 endpoints added across 87 APIs
18
18
 
19
- # Or read content directly — no browser needed
19
+ # Replay any imported endpoint immediately
20
+ apitap replay api.stripe.com get-listcharges limit=5
21
+
22
+ # Or capture a site's private API
23
+ apitap capture https://polymarket.com
24
+ apitap replay gamma-api.polymarket.com get-events
25
+
26
+ # Or read content directly
20
27
  apitap read https://en.wikipedia.org/wiki/Node.js
21
28
  ✓ Wikipedia decoder: ~127 tokens (vs ~4,900 raw HTML)
22
-
23
- # Or step by step:
24
- apitap capture https://polymarket.com # Watch API traffic
25
- apitap show gamma-api.polymarket.com # See what was captured
26
- apitap replay gamma-api.polymarket.com get-events # Call the API directly
27
29
  ```
28
30
 
29
31
  No scraping. No browser. Just the API.
@@ -34,17 +36,35 @@ No scraping. No browser. Just the API.
34
36
 
35
37
  ## How It Works
36
38
 
37
- 1. **Capture** — Launch a Playwright browser, visit a site, browse normally. ApiTap intercepts all network traffic via CDP. Or use `apitap attach` to capture from your already-running Chrome.
38
- 2. **Filter** — Scoring engine separates signal from noise. Analytics, tracking pixels, and framework internals are filtered out. Only real API endpoints survive.
39
- 3. **Generate** — Captured endpoints are grouped by domain, URLs are parameterized (`/users/123` `/users/:id` with context-aware semantic names), and a JSON skill file is written to `~/.apitap/skills/`.
40
- 4. **Replay** — Read the skill file, substitute parameters, call the API with `fetch()`. Zero dependencies in the replay path.
39
+ ApiTap has three ways to build its API knowledge:
40
+
41
+ 1. **Import** (instant) Import OpenAPI/Swagger specs from the [APIs.guru](https://apis.guru) directory of 2,500+ public APIs, or from any spec URL/file. Endpoints get a confidence score based on spec quality. No browser needed.
42
+ 2. **Capture** (30 seconds) Launch a browser, visit a site, browse normally. ApiTap intercepts all network traffic via CDP, filters noise, and generates a skill file. Or use `apitap attach` to capture from your already-running Chrome.
43
+ 3. **Discover** (automatic) — ApiTap auto-detects frameworks (WordPress, Next.js, Shopify) and probes for OpenAPI specs at common paths. Works without a browser.
44
+
45
+ All three paths produce the same artifact: a **skill file** — a portable JSON map of an API's endpoints, stored at `~/.apitap/skills/`.
41
46
 
42
47
  ```
43
- Capture: Browser Playwright/CDP listener FilterSkill Generator → skill.json
44
- Attach: Running Chrome → CDP attach → Filter → Skill Generator → skill.json
48
+ Import: OpenAPI specConverterMerge → skill.json (confidence 0.6-0.85)
49
+ Capture: Browser → CDP listener → Filter → Skill Generator → skill.json (confidence 1.0)
50
+ Attach: Running Chrome → CDP attach → Filter → skill.json (confidence 0.8-1.0)
45
51
  Replay: Agent → Replay Engine (skill.json) → fetch() → API → JSON response
52
+ ↑ no browser in this path
46
53
  ```
47
54
 
55
+ ### Confidence Model
56
+
57
+ Every endpoint tracks how it was discovered:
58
+
59
+ | Source | Confidence | Meaning |
60
+ |--------|-----------|---------|
61
+ | Captured with response body | 1.0 | Full capture — response shape verified |
62
+ | OpenAPI import, high quality | 0.85 | Spec has response examples |
63
+ | CDP skeleton (real traffic, no body) | 0.8 | Endpoint exists, body was evicted from Chrome buffer |
64
+ | OpenAPI import, base | 0.6 | Thin spec, no examples |
65
+
66
+ Imported endpoints auto-upgrade to confidence 1.0 on first successful replay. The merge is additive — captured data is never overwritten by imports, imports fill gaps that capture missed.
67
+
48
68
  ## Install
49
69
 
50
70
  ```bash
@@ -63,10 +83,50 @@ That's it. 12 MCP tools, ready to go. Requires Node.js 20+.
63
83
  > ```bash
64
84
  > npx playwright install chromium
65
85
  > ```
66
- > The `read`, `peek`, and `discover` tools work without it.
86
+ > The `read`, `peek`, `discover`, and `import` tools work without it.
67
87
 
68
88
  ## Quick Start
69
89
 
90
+ ### Import APIs instantly
91
+
92
+ ```bash
93
+ # Import from the APIs.guru directory (2,500+ public APIs)
94
+ apitap import --from apis-guru --limit 100
95
+
96
+ # Import a specific API by name
97
+ apitap import --from apis-guru --search stripe
98
+
99
+ # Import a single OpenAPI spec from URL
100
+ apitap import https://api.apis.guru/v2/specs/stripe.com/2022-11-15/openapi.json
101
+
102
+ # Import a local spec file (JSON or YAML)
103
+ apitap import ./my-api-spec.json
104
+
105
+ # Skip auth-required APIs (open endpoints only)
106
+ apitap import --from apis-guru --limit 500 --no-auth-only
107
+
108
+ # Preview what would be imported
109
+ apitap import --from apis-guru --search twilio --dry-run
110
+
111
+ # Update previously imported APIs (skip unchanged)
112
+ apitap import --from apis-guru --update
113
+ ```
114
+
115
+ Import produces a diff showing what changed:
116
+
117
+ ```
118
+ Importing api.stripe.com from OpenAPI 3.0 spec...
119
+
120
+ ✓ 12 existing captured endpoints preserved
121
+ + 34 new endpoints added from OpenAPI spec
122
+ ~ 8 endpoints enriched with spec metadata
123
+ · 0 skipped (already imported)
124
+
125
+ Skill file: ~/.apitap/skills/api.stripe.com.json (54 endpoints)
126
+ ```
127
+
128
+ Captured endpoints are never overwritten. Import fills gaps and adds metadata (descriptions, response schemas, query param enums) from the spec.
129
+
70
130
  ### Capture API traffic
71
131
 
72
132
  ```bash
@@ -88,7 +148,8 @@ ApiTap opens a browser window. Browse the site normally — click around, scroll
88
148
  ### Attach to a running Chrome
89
149
 
90
150
  ```bash
91
- # Enable remote debugging in Chrome: Settings Remote debugging → toggle on
151
+ # Launch Chrome with remote debugging enabled
152
+ google-chrome --remote-debugging-port=9222
92
153
 
93
154
  # Attach to your signed-in Chrome — captures all tabs
94
155
  apitap attach --port 9222
@@ -99,23 +160,25 @@ apitap attach --port 9222 --domain *.github.com
99
160
  # Ctrl+C to stop — generates signed skill files for each captured domain
100
161
  ```
101
162
 
102
- No separate browser, no re-login. Captures from your real Chrome sessions with all your cookies and auth tokens.
163
+ No separate browser, no re-login. Captures from your real Chrome sessions with all your cookies and auth tokens. When response bodies are evicted from Chrome's buffer (common on high-traffic pages), skeleton endpoints are written at confidence 0.8 instead of being dropped.
103
164
 
104
- ### List and explore captured APIs
165
+ ### List and explore APIs
105
166
 
106
167
  ```bash
107
168
  # List all skill files
108
169
  apitap list
109
- gamma-api.polymarket.com 3 endpoints 2m ago
110
- www.reddit.com 2 endpoints 1h ago
170
+ ✓ api.stripe.com 446 endpoints 5m ago [imported-signed]
171
+ gamma-api.polymarket.com 3 endpoints 2h ago [signed]
172
+ ✓ api.github.com 499 endpoints 1h ago [imported-signed]
111
173
 
112
174
  # Show endpoints for a domain
113
- apitap show gamma-api.polymarket.com
114
- [green] GET /events object (3 fields)
115
- [green] GET /teams array (12 fields)
175
+ apitap show api.stripe.com
176
+ [ ] GET /v1/account object (22 fields)
177
+ [ ] GET /v1/charges object (4 fields)
178
+ [ ] GET /v1/customers/:customer object (30 fields)
116
179
 
117
180
  # Search across all skill files
118
- apitap search polymarket
181
+ apitap search stripe
119
182
  ```
120
183
 
121
184
  ### Replay an endpoint
@@ -141,7 +204,7 @@ ApiTap includes a text-mode browsing pipeline — `peek` and `read` — that let
141
204
  | YouTube | `youtube` | ~36 | 99% smaller |
142
205
  | Wikipedia | `wikipedia` | ~127 | 97% smaller |
143
206
  | Hacker News | `hackernews` | ~200 | 90% smaller |
144
- | Grokipedia | `grokipedia` | ~1505000+ | varies by article length |
207
+ | Grokipedia | `grokipedia` | ~150-5000+ | varies by article length |
145
208
  | Twitter/X | `twitter` | ~80 | 95% smaller |
146
209
  | Any other site | `generic` | varies | ~74% avg |
147
210
 
@@ -162,21 +225,35 @@ apitap read https://example.com/blog/post
162
225
 
163
226
  For MCP agents, `apitap_peek` and `apitap_read` are the fastest way to consume web content — use them before reaching for `apitap_browse` or `apitap_capture`.
164
227
 
165
- ## Tested Sites
228
+ ## Pre-Loaded APIs
166
229
 
167
- ApiTap has been tested against real-world sites:
230
+ ApiTap can instantly import from the [APIs.guru](https://apis.guru) directory of 2,500+ public API specs. A single command populates your local pattern database:
168
231
 
169
- | Site | Endpoints | Tier | Replay |
170
- |------|-----------|------|--------|
171
- | Polymarket | 3 | Green | 200 |
172
- | Reddit | 2 | Green | 200 |
173
- | Discord | 4 | Green | 200 |
174
- | GitHub | 1 | Green | 200 |
175
- | HN (Algolia) | 1 | Yellow | 200 |
176
- | dev.to | 2 | Green | 200 |
177
- | CoinGecko | 6 | Green | 200 |
232
+ ```bash
233
+ apitap import --from apis-guru --limit 500
234
+ ```
178
235
 
179
- 78% overall replay success rate across 9 tested sites (green tier: 100%).
236
+ Some of the APIs available out of the box:
237
+
238
+ | API | Endpoints | Auth |
239
+ |-----|-----------|------|
240
+ | Stripe | 446 | API Key |
241
+ | GitHub | 499 | OAuth |
242
+ | Jira/Atlassian | 487 | API Key |
243
+ | Twilio | 199+ | API Key |
244
+ | Slack | 175 | OAuth |
245
+ | DigitalOcean | 290 | Bearer |
246
+ | Linode | 350 | Bearer |
247
+ | SendGrid | 334 | API Key |
248
+ | Spotify | 90 | OAuth |
249
+ | Square | 200 | OAuth |
250
+ | Plaid | 198 | API Key |
251
+ | Asana | 167 | Bearer |
252
+ | Twitter | 163 | OAuth |
253
+ | Vimeo | 326 | OAuth |
254
+ | OpenAI | 28 | API Key |
255
+
256
+ Auth-required APIs import as endpoint maps with response schemas — you can explore what's available and see response shapes before setting up credentials. First successful replay with real auth auto-upgrades the endpoint to full captured status.
180
257
 
181
258
  ## Why ApiTap?
182
259
 
@@ -186,6 +263,8 @@ ApiTap has been tested against real-world sites:
186
263
 
187
264
  **Why not reverse-engineer the API manually?** You could open DevTools and copy headers by hand. ApiTap does it in 30 seconds and gives you a portable file any agent can use.
188
265
 
266
+ **Why not just use an OpenAPI spec?** You can! `apitap import` converts OpenAPI/Swagger specs directly into skill files. But many sites don't publish specs — ApiTap captures their APIs from live traffic.
267
+
189
268
  **Isn't this just a MITM proxy?** No. ApiTap is read-only — it uses Chrome DevTools Protocol to observe responses. No certificate setup, no request modification, no code injection.
190
269
 
191
270
  ## Replayability Tiers
@@ -316,33 +395,23 @@ apitap index discord.com
316
395
 
317
396
  The index lives at `~/.apitap/index.json` and is automatically read by the `apitap_discover` MCP tool — so your agents can ask "what do you know about Discord's API?" and get a useful answer without triggering a full capture.
318
397
 
319
- Agents see something like:
320
-
321
- ```
322
- discord.com — 8 endpoints mapped, Bearer auth, last seen 2h ago
323
- GET /api/v10/channels/:id (hits: 47, JSON, paginated)
324
- GET /api/v10/guilds/:id/members (hits: 12, JSON)
325
- POST /api/v10/channels/:id/messages (hits: 8, JSON)
326
- ...
327
- ```
328
-
329
398
  ### Promoting to a Full Skill File
330
399
 
331
400
  The index is a map — it knows what endpoints exist but not their response shapes. To get a full replayable skill file, promote a domain:
332
401
 
333
- **From the popup:** Click the ApiTap icon find the domain **Generate skill file**
402
+ **From the popup:** Click the ApiTap icon -> find the domain -> **Generate skill file**
334
403
 
335
404
  **Via agent:** Your agent can request a capture automatically. You'll get a notification to approve, the extension briefly attaches CDP, captures response shapes, then detaches. The full skill file saves to `~/.apitap/skills/`.
336
405
 
337
- **Auto-learn (opt-in):** In the extension popup Settings enable **Auto-learn**. The extension will automatically promote domains you visit frequently. Off by default.
406
+ **Auto-learn (opt-in):** In the extension popup -> Settings -> enable **Auto-learn**. The extension will automatically promote domains you visit frequently. Off by default.
338
407
 
339
408
  ### Manual Capture
340
409
 
341
410
  For one-off captures without the passive index:
342
411
 
343
- 1. Click the ApiTap icon **Start Capture**
412
+ 1. Click the ApiTap icon -> **Start Capture**
344
413
  2. Browse the site — extension records API traffic
345
- 3. Click **Stop** skill file auto-saves to `~/.apitap/skills/`
414
+ 3. Click **Stop** -> skill file auto-saves to `~/.apitap/skills/`
346
415
 
347
416
  The popup shows CLI connection status and live capture stats. Auth tokens are encrypted with AES-256-GCM in session storage and automatically persisted to `~/.apitap/auth.enc` via the native host, with `[stored]` placeholders in the exported skill files.
348
417
 
@@ -377,7 +446,7 @@ Skill files are JSON documents stored at `~/.apitap/skills/<domain>.json`. They
377
446
 
378
447
  ```json
379
448
  {
380
- "version": 2,
449
+ "version": "1.2",
381
450
  "domain": "gamma-api.polymarket.com",
382
451
  "baseUrl": "https://gamma-api.polymarket.com",
383
452
  "endpoints": [
@@ -387,7 +456,9 @@ Skill files are JSON documents stored at `~/.apitap/skills/<domain>.json`. They
387
456
  "path": "/events",
388
457
  "queryParams": { "limit": { "type": "string", "example": "10" } },
389
458
  "headers": {},
390
- "responseShape": { "type": "object", "fields": ["id", "title", "slug"] }
459
+ "responseShape": { "type": "object", "fields": ["id", "title", "slug"] },
460
+ "confidence": 1.0,
461
+ "endpointProvenance": "captured"
391
462
  }
392
463
  ]
393
464
  }
@@ -401,10 +472,14 @@ Skill files are portable and shareable. Auth credentials are stored separately i
401
472
  # Import a skill file from someone else
402
473
  apitap import ./reddit-skills.json
403
474
 
404
- # Import validates: signature check SSRF scan → confirmation
475
+ # Import an OpenAPI spec (JSON or YAML)
476
+ apitap import ./stripe-openapi.json
477
+ apitap import https://api.apis.guru/v2/specs/stripe.com/2022-11-15/openapi.json
478
+
479
+ # Import validates: signature check / SSRF scan / format detection / confirmation
405
480
  ```
406
481
 
407
- Imported files are re-signed with your local key and marked with `imported` provenance.
482
+ Imported files are re-signed with your local key. OpenAPI specs are automatically detected and converted using the same merge logic — captured endpoints are preserved, imports fill gaps.
408
483
 
409
484
  ## Security
410
485
 
@@ -418,7 +493,11 @@ ApiTap handles untrusted skill files from the internet and replays HTTP requests
418
493
  - **Header injection protection** — Allowlist prevents skill files from injecting dangerous HTTP headers (`Host`, `X-Forwarded-For`, `Cookie`, `Authorization`)
419
494
  - **Redirect validation** — Manual redirect handling with SSRF re-check prevents redirect-to-internal-IP attacks
420
495
  - **DNS rebinding prevention** — Resolved IPs are pinned to prevent TOCTOU attacks where DNS returns different IPs on second lookup
421
- - **Skill signing** — HMAC-SHA256 signatures detect tampering; three-state provenance tracking (self/imported/unsigned)
496
+ - **Skill signing** — HMAC-SHA256 signatures detect tampering; four-state provenance tracking (self/imported/imported-signed/unsigned)
497
+ - **Atomic writes** — Skill files are written to a temp file then renamed, preventing corruption from mid-write crashes
498
+ - **Safe JSON parsing** — Server responses parsed with `safeParseJson()` that returns raw text on malformed JSON instead of crashing
499
+ - **Spec fetch hardening** — OpenAPI spec imports are SSRF-validated, size-limited (10MB), timeout-limited (30s), and reject redirects
500
+ - **External $ref rejection** — Only local document `#/` references are resolved; `file://` and remote `$ref` pointers are blocked
422
501
  - **No phone-home** — Everything runs locally. No external services, no telemetry
423
502
  - **Read-only capture** — Playwright intercepts responses only. No request modification or code injection
424
503
 
@@ -432,14 +511,19 @@ Since skill files can come from anywhere — shared by colleagues, downloaded fr
432
511
 
433
512
  ```
434
513
  Skill file imported
435
- validateUrl(): block private IPs, internal hostnames, non-HTTP schemes
436
- validateSkillFileUrls(): scan baseUrl + all endpoint example URLs
514
+ -> validateUrl(): block private IPs, internal hostnames, non-HTTP schemes
515
+ -> validateSkillFileUrls(): scan baseUrl + all endpoint example URLs
516
+
517
+ OpenAPI spec imported
518
+ -> resolveAndValidateUrl(): SSRF check on spec URL before fetching
519
+ -> resolveAndValidateUrl(): SSRF check on extracted API domain
520
+ -> validateSkillFile(): validate merged skill file before writing
437
521
 
438
522
  Endpoint replayed
439
- resolveAndValidateUrl(): DNS lookup + verify resolved IP isn't private
440
- IP pinning: fetch uses resolved IP directly (prevents DNS rebinding)
441
- Header filtering: strip dangerous headers from skill file
442
- Redirect check: if server redirects, validate new target before following
523
+ -> resolveAndValidateUrl(): DNS lookup + verify resolved IP isn't private
524
+ -> IP pinning: fetch uses resolved IP directly (prevents DNS rebinding)
525
+ -> Header filtering: strip dangerous headers from skill file
526
+ -> Redirect check: if server redirects, validate new target before following
443
527
  ```
444
528
 
445
529
  **Blocked ranges:** `127.0.0.0/8`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `169.254.0.0/16` (cloud metadata), `100.64.0.0/10` (CGNAT/Tailscale), `198.18.0.0/15` (benchmarking), `240.0.0.0/4` (reserved), `0.0.0.0`, IPv6 equivalents (`::1`, `fe80::/10`, `fc00::/7`, `::ffff:` mapped addresses), `localhost`, `.local`, `.internal`, `file://`, `javascript:` schemes. Alternative IP representations (decimal integer, octal, hex) are normalized before checking.
@@ -460,11 +544,12 @@ All commands support `--json` for machine-readable output.
460
544
  | `apitap discover <url>` | Detect APIs without launching a browser |
461
545
  | `apitap capture <url>` | Capture API traffic from a website |
462
546
  | `apitap attach --port <port>` | Attach to running Chrome and capture API traffic |
547
+ | `apitap import <url-or-file>` | Import OpenAPI spec or skill file |
548
+ | `apitap import --from apis-guru` | Bulk import from APIs.guru directory |
463
549
  | `apitap list` | List available skill files |
464
550
  | `apitap show <domain>` | Show endpoints for a domain |
465
551
  | `apitap search <query>` | Search skill files by domain or endpoint |
466
552
  | `apitap replay <domain> <id> [key=val...]` | Replay an API endpoint |
467
- | `apitap import <file>` | Import a skill file with safety validation |
468
553
  | `apitap refresh <domain>` | Refresh auth tokens via browser |
469
554
  | `apitap auth [domain]` | View or manage stored auth |
470
555
  | `apitap serve <domain>` | Serve a skill file as an MCP server |
@@ -475,6 +560,18 @@ All commands support `--json` for machine-readable output.
475
560
  | `apitap forget <domain>` | Remove skill file and credentials for a domain |
476
561
  | `apitap --version` | Print version |
477
562
 
563
+ ### Import flags
564
+
565
+ | Flag | Description |
566
+ |------|-------------|
567
+ | `--from apis-guru` | Bulk import from APIs.guru directory |
568
+ | `--search <query>` | Filter APIs.guru by provider or title |
569
+ | `--limit <N>` | Max APIs to import (default: 100) |
570
+ | `--no-auth-only` | Skip APIs requiring authentication |
571
+ | `--dry-run` | Show what would be imported without writing |
572
+ | `--update` | Skip APIs unchanged since last import |
573
+ | `--force` | Always reimport regardless of history |
574
+
478
575
  ### Capture flags
479
576
 
480
577
  | Flag | Description |
@@ -495,7 +592,7 @@ All commands support `--json` for machine-readable output.
495
592
  git clone https://github.com/n1byn1kt/apitap.git
496
593
  cd apitap
497
594
  npm install
498
- npm test # ~1195 tests, Node built-in test runner
595
+ npm test # ~1299 tests, Node built-in test runner
499
596
  npm run typecheck # Type checking
500
597
  npm run build # Compile to dist/
501
598
  npx tsx src/cli.ts capture <url> # Run from source
@@ -503,7 +600,7 @@ npx tsx src/cli.ts capture <url> # Run from source
503
600
 
504
601
  ## Contact
505
602
 
506
- Questions, feedback, or issues? **[hello@apitap.io](mailto:hello@apitap.io)**
603
+ Questions, feedback, or issues? -> **[hello@apitap.io](mailto:hello@apitap.io)**
507
604
 
508
605
  ## License
509
606
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apitap/core",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "description": "Intercept web API traffic during browsing. Generate portable skill files so AI agents can call APIs directly instead of scraping.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",