MCP Tools Reference
This page documents all 77 MCP tools available through the Zenovay analytics server. Each tool includes its parameters, an example JSON-RPC request, and an example response.
Server URL: https://api.zenovay.com/mcp
Transport: Streamable HTTP (JSON-RPC 2.0)
Auth Header: Authorization: Bearer zv_YOUR_API_KEY
All tools require a valid API key with MCP enabled. Write tools (marked with requires read_write) return an error in Read Only mode. See Permissions & Limits for the full list.
Quick Reference for AI Assistants
Use this section to quickly understand the Zenovay MCP server. Every request uses this JSON-RPC envelope:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "TOOL_NAME",
"arguments": { ... }
}
}First step in every session: Call list_websites (no arguments) to discover website IDs. Almost every tool requires a website_id parameter.
All 77 tools at a glance:
| # | Tool | Category | Cost | Description |
|---|---|---|---|---|
| 1 | query_analytics | analytics | 3 | Natural language analytics query |
| 2 | get_visitors | analytics | 1 | Visitor stats with optional period comparison |
| 3 | get_top_pages | analytics | 1 | Most visited pages ranked by visitor count |
| 4 | get_traffic_sources | analytics | 1 | Traffic sources / referrers breakdown |
| 5 | get_geographic_data | analytics | 1 | Country + optional city breakdown |
| 6 | get_technology_breakdown | analytics | 1 | Devices, browsers, operating systems |
| 7 | get_realtime_visitors | analytics | 1 | Currently active visitors (last 5 min) |
| 8 | compare_periods | analytics | 1 | Compare metrics between two time periods |
| 9 | get_funnel_analysis | advanced | 1 | Funnel step-by-step conversion data |
| 10 | get_goals | advanced | 1 | Active goals with completion rates |
| 11 | get_session_replays | advanced | 1 | Session replay recordings list (Pro+) |
| 12 | get_heatmap_data | advanced | 1 | Heatmap interaction data per page (Pro+) |
| 13 | get_errors | advanced | 1 | JavaScript error tracking |
| 14 | get_b2b_companies | advanced | 1 | B2B company identification via reverse IP |
| 15 | get_revenue | advanced | 1 | Revenue totals + breakdowns (Pro+) |
| 16 | get_performance_metrics | advanced | 1 | Core Web Vitals (LCP, CLS, INP, FCP, TTFB) |
| 17 | get_insights | ai_insights | 1 | AI-generated actionable insights |
| 18 | get_anomalies | ai_insights | 1 | Detected metric anomalies |
| 19 | get_weekly_digest | ai_insights | 1 | Weekly performance digest (this vs last week) |
| 20 | get_recommendations | ai_insights | 1 | AI-powered optimization recommendations |
| 21 | list_websites | management | 1 | List accessible websites (call first!) |
| 22 | create_goal | management | 1 | Create custom goal (requires read_write) |
| 23 | manage_funnel | management | 1 | Create/update funnel (requires read_write) |
| 24 | export_data | management | 1 | Export analytics in JSON or CSV (Scale+) |
| 25 | get_api_usage | management | 1 | Check remaining daily quota |
| 26 | get_website_settings | management | 1 | Get website configuration and settings |
| 27 | update_website_settings | management | 1 | Update website settings (requires read_write) |
| 28 | toggle_public_dashboard | management | 1 | Enable/disable public dashboard (requires read_write) |
| 29 | toggle_cookieless_tracking | management | 1 | Enable/disable cookieless mode (requires read_write, Pro+) |
| 30 | get_tracking_code | management | 1 | Get the tracking code snippet for a website |
| 31 | regenerate_tracking_code | management | 1 | Generate a new tracking code (requires read_write) |
| 32 | list_goals | management | 1 | List all goals for a website |
| 33 | update_goal | management | 1 | Update an existing goal (requires read_write) |
| 34 | delete_goal | management | 1 | Delete a goal (requires read_write) |
| 35 | toggle_goal | management | 1 | Enable or disable a goal (requires read_write) |
| 36 | list_funnels | management | 1 | List all funnels for a website |
| 37 | delete_funnel | management | 1 | Delete a funnel (requires read_write) |
| 38 | delete_website | management | 1 | Permanently delete a website (requires read_write, full_access) |
| 39 | add_ip_exclusion | settings | 1 | Add IP to exclusion list (requires read_write) |
| 40 | remove_ip_exclusion | settings | 1 | Remove IP from exclusion list (requires read_write) |
| 41 | add_path_exclusion | settings | 1 | Add path pattern to exclusions (requires read_write) |
| 42 | remove_path_exclusion | settings | 1 | Remove path from exclusions (requires read_write) |
| 43 | list_exclusions | settings | 1 | List all IP and path exclusions |
| 44 | get_notification_settings | settings | 1 | Get notification preferences |
| 45 | update_notification_settings | settings | 1 | Update notification preferences (requires read_write) |
| 46 | get_team_members | team | 1 | List team members (requires full_access) |
| 47 | invite_team_member | team | 1 | Invite a new team member (requires read_write, full_access, Pro+) |
| 48 | remove_team_member | team | 1 | Remove a team member (requires read_write, full_access) |
| 49 | create_website | management | 1 | Create a new website (requires read_write, full_access) |
| 50 | list_api_keys | api_keys | 1 | List all API keys for the team |
| 51 | create_api_key | api_keys | 1 | Create a new API key (requires read_write) |
| 52 | revoke_api_key | api_keys | 1 | Revoke an API key (requires read_write) |
| 53 | get_api_key_details | api_keys | 1 | Get details for a specific API key |
| 54 | update_api_key_permissions | api_keys | 1 | Update API key permissions (requires read_write) |
| 55 | list_uptime_monitors | uptime | 1 | List all uptime monitors |
| 56 | get_uptime_status | uptime | 1 | Get current status for a monitor |
| 57 | create_uptime_monitor | uptime | 1 | Create a new uptime monitor (requires read_write) |
| 58 | delete_uptime_monitor | uptime | 1 | Delete an uptime monitor (requires read_write) |
| 59 | get_uptime_history | uptime | 1 | Get uptime history and incident log |
| 60 | update_website_name | management | 1 | Update website display name (requires read_write) |
| 61 | update_website_timezone | management | 1 | Update website timezone (requires read_write) |
| 62 | update_website_domain | management | 1 | Update website domain (requires read_write) |
| 63 | pause_tracking | management | 1 | Pause analytics tracking (requires read_write) |
| 64 | resume_tracking | management | 1 | Resume analytics tracking (requires read_write) |
| 65 | schedule_report | management | 1 | Schedule a recurring analytics report (requires read_write) |
| 66 | get_report_schedule | management | 1 | Get scheduled report configuration |
| 67 | cancel_report | management | 1 | Cancel a scheduled report (requires read_write) |
| 68 | get_export_history | management | 1 | Get data export history |
| 69 | get_data_retention | management | 1 | Get data retention policy for the website |
| 70 | set_revenue_currency | settings | 1 | Set revenue currency (requires read_write) |
| 71 | get_revenue_settings | settings | 1 | Get revenue settings (currency, field mappings) |
| 72 | add_allowed_domain | settings | 1 | Add domain to CORS whitelist (requires read_write) |
| 73 | remove_allowed_domain | settings | 1 | Remove domain from CORS whitelist (requires read_write) |
| 74 | list_allowed_domains | settings | 1 | List CORS whitelisted domains |
| 75 | request_data_deletion | settings | 1 | Delete visitor data for GDPR (requires read_write) |
| 76 | get_retention_data | advanced | 1 | Retention cohort analysis (Pro+) |
| 77 | get_user_profiles | analytics | 1 | Visitor profiles with session history |
Common time_range values: 24h, 7d, 30d, 90d, 1y (default: 7d for most tools)
Common Patterns
Before diving into individual tools, here are common multi-tool workflows:
Website discovery + analysis:
list_websites— find your website IDsget_visitors— get traffic overviewget_top_pages— see which pages perform bestget_traffic_sources— understand where traffic comes from
Performance audit:
list_websites— get website IDget_performance_metrics— check Core Web Vitalsget_errors— find JavaScript errorsget_insights— see AI-generated recommendations
Weekly review:
get_weekly_digest— automated week-over-week comparisonget_anomalies— check for unusual patternscompare_periods— deep-dive into specific metrics
Analytics Tools
All analytics tools enforce your plan's data retention window. Queries requesting data beyond your retention limit are automatically clamped, and the response includes a retention_note field. See Plan Enforcement for retention limits by plan.
1. query_analytics
Ask a natural language question about your analytics data. This is the most flexible tool — use it when other specific tools don't fit.
Cost: 3 queries
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The UUID of the website |
question | string | Yes | Natural language question (max 500 characters) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "query_analytics",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"question": "How many visitors did I have this week?"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": {
"intent": "visitor_count",
"confidence": 0.95,
"time_range": "7d",
"results": { "total_visitors": 1250, "unique_visitors": 980 },
"summary": "You had 1,250 total visitors (980 unique) in the last 7 days.",
"suggestions": [
"How many visitors did I have this week?",
"What are my top pages?",
"Where are my visitors from?",
"What devices do visitors use?"
]
}
}]
}
}2. get_visitors
Get visitor statistics for a website with optional period comparison.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
compare_with_previous | boolean | No | false | Include comparison with previous period |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_visitors",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "7d",
"compare_with_previous": true
}
}
}{
"summary": {
"total_visitors": 1250,
"unique_visitors": 980,
"page_views": 3400,
"bounce_rate": 42.5,
"avg_session_duration": 185.3
},
"daily_stats": [
{ "date": "2026-02-27", "visitors": 180, "unique_visitors": 140, "page_views": 490, "bounce_rate": 41.2 },
{ "date": "2026-02-28", "visitors": 195, "unique_visitors": 155, "page_views": 510, "bounce_rate": 43.1 }
],
"comparison": {
"previous_period": { "start": "2026-02-20", "end": "2026-02-26" },
"previous_summary": {
"total_visitors": 1100,
"unique_visitors": 870,
"page_views": 3100,
"bounce_rate": 44.8
},
"changes": {
"visitors_pct": 13.64,
"unique_visitors_pct": 12.64,
"page_views_pct": 9.68,
"bounce_rate_pct": -5.13
}
}
}3. get_top_pages
Get the most visited pages ranked by visitor count.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max pages to return (1-100) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_top_pages",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "30d",
"limit": 5
}
}
}{
"pages": [
{ "url": "/", "visitors": 520, "percentage": 41.6 },
{ "url": "/pricing", "visitors": 180, "percentage": 14.4 },
{ "url": "/features", "visitors": 145, "percentage": 11.6 },
{ "url": "/docs", "visitors": 110, "percentage": 8.8 },
{ "url": "/blog/analytics-guide", "visitors": 95, "percentage": 7.6 }
],
"total_pages": 47
}4. get_traffic_sources
Get traffic sources showing where visitors come from.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max sources to return (1-100) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_traffic_sources",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "30d"
}
}
}{
"sources": [
{ "source": "Direct", "visitors": 450, "percentage": 36.0 },
{ "source": "google.com", "visitors": 320, "percentage": 25.6 },
{ "source": "twitter.com", "visitors": 85, "percentage": 6.8 },
{ "source": "github.com", "visitors": 60, "percentage": 4.8 }
],
"total_sources": 23
}5. get_geographic_data
Get geographic breakdown by country with optional city-level detail.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max entries (1-100) |
include_cities | boolean | No | false | Include city-level breakdown per country |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_geographic_data",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"include_cities": true,
"limit": 3
}
}
}{
"countries": [
{
"country_code": "US",
"country_name": "United States",
"visitors": 520,
"percentage": 41.6,
"cities": [
{ "city": "San Francisco", "visitors": 85 },
{ "city": "New York", "visitors": 72 }
]
},
{
"country_code": "DE",
"country_name": "Germany",
"visitors": 180,
"percentage": 14.4,
"cities": [
{ "city": "Berlin", "visitors": 45 },
{ "city": "Munich", "visitors": 32 }
]
}
],
"total_countries": 28
}6. get_technology_breakdown
Get visitor technology breakdown: devices, browsers, and operating systems.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_technology_breakdown",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"devices": [
{ "name": "desktop", "visitors": 780, "percentage": 62.4 },
{ "name": "mobile", "visitors": 390, "percentage": 31.2 },
{ "name": "tablet", "visitors": 80, "percentage": 6.4 }
],
"browsers": [
{ "name": "Chrome", "visitors": 625, "percentage": 50.0 },
{ "name": "Safari", "visitors": 300, "percentage": 24.0 },
{ "name": "Firefox", "visitors": 150, "percentage": 12.0 }
],
"operating_systems": [
{ "name": "Windows", "visitors": 450, "percentage": 36.0 },
{ "name": "macOS", "visitors": 350, "percentage": 28.0 },
{ "name": "iOS", "visitors": 250, "percentage": 20.0 },
{ "name": "Android", "visitors": 140, "percentage": 11.2 }
],
"total_visitors": 1250
}7. get_realtime_visitors
Get currently active visitors (visited within the last 5 minutes).
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The UUID of the website |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_realtime_visitors",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"active_visitors": 12,
"recent_visitors": [
{
"country_name": "United States",
"page_url": "/pricing",
"device_type": "desktop",
"browser": "Chrome"
},
{
"country_name": "Germany",
"page_url": "/",
"device_type": "mobile",
"browser": "Safari"
}
]
}8. compare_periods
Compare analytics metrics between two time periods.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
current_period | string | No | 7d | Current period: 24h, 7d, 30d, 90d |
comparison_period | string | No | previous | Comparison: previous, same_period_last_month, same_period_last_year |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "compare_periods",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"current_period": "30d",
"comparison_period": "same_period_last_month"
}
}
}{
"current": {
"period": { "start": "2026-02-04", "end": "2026-03-06" },
"visitors": 3800,
"unique_visitors": 2900,
"page_views": 10200,
"bounce_rate": 42.5,
"avg_session_duration": 185.3,
"days": 30
},
"comparison": {
"period": { "start": "2026-01-05", "end": "2026-02-04" },
"type": "same_period_last_month",
"visitors": 3200,
"unique_visitors": 2500,
"page_views": 8800,
"bounce_rate": 45.1,
"avg_session_duration": 170.8,
"days": 30
},
"changes": {
"visitors_pct": 18.75,
"unique_visitors_pct": 16.0,
"pageviews_pct": 15.91,
"bounce_rate_pct": -5.76,
"avg_session_duration_pct": 8.49
}
}Advanced Tools
9. get_funnel_analysis
Get funnel numbers for a period. Funnels are calculated from the recorded data, so every period works, including periods before the funnel was created. Without a funnel_id, returns every funnel of the website with entered, completed and conversion rate for the period and the period before. With a funnel_id, returns the numbers per step.
Steps only count in order. The funnel's conversion_window decides whether all steps must happen in one visit (session, counted per visit) or within 1, 7 or 30 days (counted per visitor).
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | - | The website UUID |
funnel_id | string | No | - | Funnel UUID for detailed step analysis |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
breakdown | string | No | - | With funnel_id: split the funnel by device, country, channel, host or entry_page |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_funnel_analysis",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"period": { "start": "2026-09-11T10:00:00Z", "end": "2026-10-11T10:00:00Z" },
"funnels": [
{
"id": "f1a2b3c4-...",
"name": "Signup Flow",
"is_active": true,
"conversion_window": "session",
"steps": ["Landing Page", "Signup Form", "Welcome"],
"entered": 500,
"completed": 210,
"conversion_rate_percent": 42,
"previous_period": { "entered": 450, "completed": 180, "conversion_rate_percent": 40 },
"created_at": "2026-01-15T10:00:00Z"
}
]
}{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_funnel_analysis",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"funnel_id": "f1a2b3c4-..."
}
}
}{
"funnel": { "id": "f1a2b3c4-...", "name": "Signup Flow", "conversion_window": "session" },
"period": { "start": "2026-09-11T10:00:00Z", "end": "2026-10-11T10:00:00Z" },
"counted_per": "visit",
"summary": {
"entered": 500,
"completed": 210,
"conversion_rate_percent": 42,
"median_seconds_to_complete": 340
},
"steps": [
{ "order": 1, "name": "Landing Page", "visitors": 500, "dropped_after": 180, "conversion_from_previous_percent": 100, "conversion_rate": 100, "median_seconds_from_previous": null },
{ "order": 2, "name": "Signup Form", "visitors": 320, "dropped_after": 110, "conversion_from_previous_percent": 64, "conversion_rate": 64, "median_seconds_from_previous": 95 },
{ "order": 3, "name": "Welcome", "visitors": 210, "dropped_after": 0, "conversion_from_previous_percent": 65.63, "conversion_rate": 42, "median_seconds_from_previous": 245 }
],
"breakdown": null
}Per step, visitors is how many reached the step, dropped_after how many did not reach the next one, conversion_from_previous_percent the conversion from the previous step and conversion_rate the conversion from the start, both in percent. counted_per is visit for the session window and visitor for 1d, 7d and 30d. breakdown is null unless you pass the breakdown parameter.
10. get_goals
Get the active goals of a website with their numbers for the time range: completions, converting visits and the conversion rate in percent. The conversion rate is converting visits divided by all visits, the same number the dashboard shows. visits_in_period is the number of all visits in the period.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | - | The website UUID |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_goals",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"goals": [
{ "id": "g1...", "name": "Newsletter Signup", "goal_type": "url_match", "is_active": true, "completions": 145, "converting_visits": 145, "conversion_rate": 3.82 },
{ "id": "g2...", "name": "Pricing Click", "goal_type": "element_click", "is_active": true, "completions": 89, "converting_visits": 84, "conversion_rate": 2.21 }
],
"visits_in_period": 3800,
"period": { "start": "2026-09-11T10:00:00Z", "end": "2026-10-11T10:00:00Z" }
}11. get_session_replays
List session replay recordings. Filter by device or country.
Cost: 1 query | Requires: Pro+ (sessionReplay feature flag)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Sessions to return (1-50) |
device_type | string | No | — | Filter: desktop, mobile, tablet |
country_code | string | No | — | ISO country code (e.g. US, DE) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_session_replays",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"device_type": "mobile",
"limit": 5
}
}
}{
"sessions": [
{
"id": "sr1...",
"session_id": "sess_abc123",
"visitor_id": "v1...",
"duration_ms": 45200,
"page_count": 4,
"had_interaction": true,
"started_at": "2026-03-05T14:22:00Z"
}
],
"total": 23
}12. get_heatmap_data
Get heatmap interaction data per page.
Cost: 1 query | Requires: Pro+ (heatmaps feature flag)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
page_url | string | No | — | Filter to a specific page URL |
limit | number | No | 20 | Pages to return (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_heatmap_data",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"pages": [
{ "page_url": "/", "total_interactions": 2340, "unique_visitors": 890, "last_updated": "2026-03-05T18:00:00Z" },
{ "page_url": "/pricing", "total_interactions": 1560, "unique_visitors": 620, "last_updated": "2026-03-05T17:45:00Z" }
]
}13. get_errors
Get tracked JavaScript errors for a website.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
status | string | No | open | Filter: open, resolved, ignored |
limit | number | No | 50 | Errors to return (1-100) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_errors",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "open"
}
}
}{
"errors": [
{
"id": "e1...",
"message": "TypeError: Cannot read property 'map' of undefined",
"type": "TypeError",
"occurrence_count": 45,
"first_seen": "2026-02-28T10:15:00Z",
"last_seen": "2026-03-05T22:30:00Z",
"is_resolved": false
}
],
"total": 8
}14. get_b2b_companies
Identify B2B companies visiting your website via reverse IP lookup.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Companies to return (1-100) |
sort_by | string | No | last_seen | Sort: visits, last_seen, confidence |
industry | string | No | — | Filter by industry (e.g. Technology) |
min_visits | number | No | 1 | Minimum visit count |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_b2b_companies",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sort_by": "visits",
"min_visits": 3
}
}
}{
"companies": [
{
"name": "Acme Corp",
"domain": "acme.com",
"industry": "Technology",
"employee_count": 500,
"visit_count": 12,
"last_visit": "2026-03-05T16:00:00Z",
"confidence_score": 0.92
}
]
}15. get_revenue
Get revenue analytics with totals and breakdowns.
Cost: 1 query | Requires: Pro+ (revenueAttribution feature flag)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
group_by | string | No | day | Grouping: day, week, month, source |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_revenue",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"group_by": "source"
}
}
}{
"total_revenue": 12450.00,
"transaction_count": 89,
"avg_order_value": 139.89,
"currency": "USD",
"breakdown": [
{ "source": "google.com", "revenue": 5200.00, "transactions": 38 },
{ "source": "Direct", "revenue": 4100.00, "transactions": 30 },
{ "source": "twitter.com", "revenue": 1850.00, "transactions": 12 }
]
}16. get_performance_metrics
Get Core Web Vitals and performance metrics with percentile breakdowns.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
page_url | string | No | — | Filter to a specific page |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_performance_metrics",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"lcp": { "p50": 1800, "p75": 2200, "p90": 3100, "rating": "good", "sample_count": 450 },
"cls": { "p50": 0.05, "p75": 0.08, "p90": 0.15, "rating": "good", "sample_count": 450 },
"inp": { "p50": 120, "p75": 180, "p90": 280, "rating": "good", "sample_count": 420 },
"fcp": { "p50": 1200, "p75": 1600, "p90": 2400, "rating": "good", "sample_count": 450 },
"ttfb": { "p50": 350, "p75": 600, "p90": 950, "rating": "good", "sample_count": 450 }
}Rating thresholds:
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| LCP | ≤ 2500ms | ≤ 4000ms | > 4000ms |
| CLS | ≤ 0.1 | ≤ 0.25 | > 0.25 |
| INP | ≤ 200ms | ≤ 500ms | > 500ms |
| FCP | ≤ 1800ms | ≤ 3000ms | > 3000ms |
| TTFB | ≤ 800ms | ≤ 1800ms | > 1800ms |
AI Insights Tools
17. get_insights
Retrieve AI-generated actionable insights about website performance.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
severity | string | No | — | Filter: critical, warning, info |
status | string | No | active | Filter: active, acknowledged, resolved |
limit | number | No | 10 | Max insights (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_insights",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"severity": "critical"
}
}
}{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"insights": [
{
"id": "i1...",
"title": "Bounce rate spike on /pricing",
"description": "Bounce rate on the pricing page increased by 35% compared to last week. Consider reviewing recent changes.",
"severity": "critical",
"type": "bounce_rate",
"created_at": "2026-03-05T08:00:00Z"
}
],
"summary": { "total": 3, "critical": 1, "warning": 1, "info": 1 }
}18. get_anomalies
Retrieve detected anomalies — unusual deviations in metrics.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
severity | string | No | — | Filter: critical, warning, info |
metric | string | No | — | Filter by metric (e.g. visitors, bounce_rate) |
limit | number | No | 10 | Max anomalies (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_anomalies",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"anomalies": [
{
"id": "a1...",
"metric_name": "visitors",
"expected_value": 180,
"actual_value": 45,
"deviation_pct": -75.0,
"severity": "critical",
"detected_at": "2026-03-04T00:00:00Z",
"is_resolved": false
}
],
"total": 2
}19. get_weekly_digest
Generate a weekly performance digest comparing this week vs last week.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_weekly_digest",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"this_week": { "visitors": 1250, "pageviews": 3400, "sessions": 980, "bounce_rate": 42.5, "avg_duration": 185 },
"last_week": { "visitors": 1100, "pageviews": 3100, "sessions": 870, "bounce_rate": 44.8, "avg_duration": 170 },
"changes": {
"visitors": 13.64,
"pageviews": 9.68,
"sessions": 12.64,
"bounce_rate": -5.13,
"avg_duration": 8.82
},
"top_pages": [
{ "path": "/", "views": 520 },
{ "path": "/pricing", "views": 180 }
],
"top_countries": [
{ "country": "US", "visitors": 520 },
{ "country": "DE", "visitors": 180 }
]
}20. get_recommendations
Get AI-powered optimization recommendations.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
category | string | No | — | Filter: performance, engagement, conversion, seo |
limit | number | No | 5 | Max recommendations (1-20) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_recommendations",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "performance"
}
}
}{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"recommendations": [
{
"id": "r1...",
"title": "Optimize Largest Contentful Paint",
"description": "Your LCP p75 is 3200ms (needs improvement). Consider lazy-loading below-fold images and preloading critical assets.",
"category": "performance",
"priority": "high",
"impact": "Improving LCP to under 2500ms could reduce bounce rate by ~10%"
}
],
"total": 3
}Management Tools
21. list_websites
List all websites accessible by the current API key.
Cost: 1 query
This tool takes no parameters. Full-access keys see all team websites; site-scoped keys see only their assigned website.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_websites",
"arguments": {}
}
}{
"websites": [
{
"id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "example.com",
"name": "My Website",
"tracking_code": "zv_abc123",
"is_active": true,
"created_at": "2025-06-15T10:00:00Z"
}
],
"total": 1
}22. create_goal
Create a conversion goal. A goal counts once per visit. The same validation as in the dashboard applies. Requires read_write mode.
The new goal is applied to the last 12 months of collected data immediately; the history field in the result reports how that went. Element click goals have no history and count from creation on.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | Goal name (max 100 chars) |
goal_type | string | Yes | url_match (a page visit), link_click (a click on a link), element_click (a click on an element) or custom_event (an event from your code) |
url_pattern | string | For url_match and link_click | Page or link address to match, for example /pricing, /{locale}/signup or docs.example.com/** |
url_match_type | string | No | exact, contains, starts_with, ends_with, pattern, regex (default: contains). pattern supports * (one path segment), ** (anything) and {locale} (an optional language prefix) |
css_selector | string | For element_click | CSS selector of the element |
event_name | string | For custom_event | Custom event name to track |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_goal",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Pricing page visits",
"goal_type": "url_match",
"url_pattern": "/{locale}/pricing",
"url_match_type": "pattern"
}
}
}{
"goal": {
"id": "g1a2b3c4-...",
"name": "Pricing page visits",
"goal_type": "url_match",
"url_pattern": "/{locale}/pricing",
"url_match_type": "pattern",
"is_active": true,
"created_at": "2026-10-11T12:00:00Z"
},
"history": { "status": "done", "inserted": 1240, "archived": 0 }
}history.status is done, running (the history is still being filled in the background), skipped (for example for element click goals) or failed.
23. manage_funnel
Create or update a conversion funnel. A funnel has 2 to 10 steps that must happen in this order. The funnel and its steps are saved together: if one step is invalid, nothing is saved. When you update a funnel, its steps are replaced by the ones you send. Funnels are calculated from the recorded data, so a new or edited funnel shows history immediately. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | Funnel name (max 100 chars) |
steps | array | Yes | 2 to 10 ordered steps (see below) |
funnel_id | string | No | Existing funnel UUID to update (omit to create a new funnel) |
description | string | No | Optional description |
conversion_window | string | No | session (same visit, the default), 1d, 7d or 30d (the same visitor may finish on a later visit) |
Step object:
| Field | Type | Required | Description |
|---|---|---|---|
step_name | string | Yes | Display name |
step_type | string | Yes | url_match (a page), custom_event (an event) or goal (an existing goal) |
url_pattern | string | For url_match | Page address to match |
url_match_type | string | No | exact, contains, starts_with, ends_with, pattern, regex |
event_name | string | For custom_event | Custom event name |
goal_id | string | For goal | UUID of an existing goal |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "manage_funnel",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Checkout Flow",
"conversion_window": "session",
"steps": [
{ "step_name": "Product Page", "step_type": "url_match", "url_pattern": "/products/**", "url_match_type": "pattern" },
{ "step_name": "Add to Cart", "step_type": "custom_event", "event_name": "add_to_cart" },
{ "step_name": "Checkout", "step_type": "url_match", "url_pattern": "/checkout", "url_match_type": "exact" },
{ "step_name": "Purchase Complete", "step_type": "goal", "goal_id": "g1a2b3c4-..." }
]
}
}
}{
"funnel": {
"id": "f1a2b3c4-...",
"name": "Checkout Flow",
"steps_count": 4,
"conversion_window": "session",
"action": "created"
}
}24. export_data
Export analytics data in JSON or CSV format.
Cost: 1 query | Requires: Scale+ (dataExport feature flag)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
format | string | No | json | Output format: csv, json |
metrics | array | No | ["visitors","pageviews","unique_visitors"] | Metrics to include |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
Available metrics: visitors, pageviews, unique_visitors, bounce_rate, avg_session_duration
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "export_data",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"format": "csv",
"metrics": ["visitors", "pageviews", "bounce_rate"],
"time_range": "30d"
}
}
}{
"format": "csv",
"time_range": "30d",
"data": "date,visitors,page_views,bounce_rate\n2026-02-04,120,340,42.5\n2026-02-05,135,380,41.2\n...",
"total_rows": 30
}25. get_api_usage
Check current API key usage and remaining quota.
Cost: 1 query
This tool takes no parameters.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_usage",
"arguments": {}
}
}{
"api_key": {
"id": "key_abc123",
"name": "Production Key",
"permission": "full_access"
},
"usage": {
"monthly_requests": 1250,
"total_requests": 8400
},
"mcp": {
"queries_today": 15,
"queries_limit": 500,
"reset_at": "2026-03-07T00:00:00Z"
},
"subscription": {
"tier": "Scale"
}
}26. get_website_settings
Get configuration and settings for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_website_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website": {
"id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "example.com",
"name": "My Website",
"is_active": true,
"created_at": "2025-06-15T10:00:00Z"
},
"settings": {
"public_dashboard_enabled": false,
"public_dashboard_url": null,
"cookieless_tracking": false,
"tracking_code": "zv_abc123",
"timezone": "America/New_York",
"data_retention_days": 730,
"allowed_domains": ["example.com", "www.example.com"]
}
}27. update_website_settings
Update website configuration settings. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | No | Website display name |
timezone | string | No | IANA timezone (e.g. America/New_York) |
allowed_domains | array | No | List of allowed domains for the tracking script |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "My Updated Website",
"timezone": "Europe/Berlin",
"allowed_domains": ["example.com", "www.example.com", "staging.example.com"]
}
}
}{
"website": {
"id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "My Updated Website",
"timezone": "Europe/Berlin",
"allowed_domains": ["example.com", "www.example.com", "staging.example.com"],
"updated_at": "2026-03-15T10:00:00Z"
}
}28. toggle_public_dashboard
Enable or disable public dashboard sharing for a website. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
enabled | boolean | Yes | true to enable, false to disable |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "toggle_public_dashboard",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"enabled": true
}
}
}{
"public_dashboard": {
"enabled": true,
"url": "https://app.zenovay.com/public/2ea8af07-xxxx",
"globe_url": "https://app.zenovay.com/globe/2ea8af07-xxxx"
}
}29. toggle_cookieless_tracking
Enable or disable cookieless tracking mode. Requires read_write mode. Pro plan or higher.
When enabled, the tracker uses SHA-256(IP_subnet + UA + daily_salt) for visitor identification instead of cookies or localStorage.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
enabled | boolean | Yes | true to enable, false to disable |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "toggle_cookieless_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"enabled": true
}
}
}{
"cookieless_tracking": {
"enabled": true,
"method": "server_side_hashing",
"updated_at": "2026-03-15T10:00:00Z"
}
}Cookieless tracking is privacy-first. No cookies or localStorage are used. Visitor identification is computed server-side using a daily-rotating salt.
30. get_tracking_code
Get the tracking code snippet for a website. Use this to retrieve the script tag to install on your site.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_tracking_code",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"tracking_code": "zv_abc123",
"script_tag": "<script defer data-website-id=\"zv_abc123\" src=\"https://api.zenovay.com/tracker.js\"></script>",
"cookieless_script_tag": "<script defer data-website-id=\"zv_abc123\" data-cookieless=\"true\" src=\"https://api.zenovay.com/tracker.js\"></script>"
}31. regenerate_tracking_code
Generate a new tracking code for a website. Requires read_write mode.
This invalidates the previous tracking code. You must update the script tag on your website after regenerating.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "regenerate_tracking_code",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"tracking_code": "zv_def456",
"previous_code": "zv_abc123",
"script_tag": "<script defer data-website-id=\"zv_def456\" src=\"https://api.zenovay.com/tracker.js\"></script>",
"regenerated_at": "2026-03-15T10:00:00Z"
}32. list_goals
List all goals of a website, active and paused, with their definition, status and numbers for the period: completions, converting visits, conversion rate, total value and the completions of the previous period. Here conversion_rate is a fraction from 0 to 1 (converting visits divided by all visits), not a percentage.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | - | The website UUID |
time_range | string | No | 30d | Period for the numbers: 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_goals",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "30d"
}
}
}{
"goals": [
{
"id": "g1a2b3c4-...",
"name": "Newsletter Signup",
"goal_type": "url_match",
"url_pattern": "/thank-you",
"url_match_type": "exact",
"is_active": true,
"completions": 145,
"converting_visits": 145,
"conversion_rate": 0.0382,
"total_value": 0,
"previous_period_completions": 128,
"created_at": "2026-01-15T10:00:00Z"
},
{
"id": "g5d6e7f8-...",
"name": "Purchases",
"goal_type": "custom_event",
"event_name": "purchase",
"is_active": false,
"completions": 0,
"converting_visits": 0,
"conversion_rate": 0,
"total_value": 0,
"previous_period_completions": 12,
"created_at": "2025-11-01T08:00:00Z"
}
],
"total": 2,
"period": { "start": "2026-09-11T10:00:00Z", "end": "2026-10-11T10:00:00Z" }
}33. update_goal
Update an existing goal. Only the fields you provide change. When the rule that decides what counts changes (address, match type, selector or event), the last 12 months are recounted with the new rule and the result says history_recounted: true. Renaming does not recount. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID |
name | string | No | Updated goal name |
url_pattern | string | No | Updated address pattern |
url_match_type | string | No | exact, contains, starts_with, ends_with, pattern, regex |
css_selector | string | No | Updated CSS selector |
event_name | string | No | Updated event name |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_goal",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal_id": "g1a2b3c4-...",
"name": "Newsletter Signup v2",
"url_pattern": "/signup-complete"
}
}
}{
"message": "Goal updated successfully",
"goal": {
"id": "g1a2b3c4-...",
"name": "Newsletter Signup v2",
"goal_type": "url_match",
"is_active": true,
"updated_fields": ["name", "url_pattern"]
},
"history_recounted": true,
"history": { "status": "done", "inserted": 152, "archived": 145 }
}34. delete_goal
Permanently delete a goal. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_goal",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal_id": "g5d6e7f8-..."
}
}
}{
"deleted": true,
"goal_id": "g5d6e7f8-..."
}35. toggle_goal
Enable or disable a goal without deleting it. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID |
is_active | boolean | Yes | true to enable, false to disable |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "toggle_goal",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal_id": "g1a2b3c4-...",
"is_active": false
}
}
}{
"goal": {
"id": "g1a2b3c4-...",
"name": "Newsletter Signup v2",
"is_active": false,
"updated_at": "2026-03-15T10:00:00Z"
}
}36. list_funnels
List all funnels for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_funnels",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"funnels": [
{
"id": "f1a2b3c4-...",
"name": "Signup Flow",
"steps_count": 4,
"created_at": "2026-01-15T10:00:00Z"
},
{
"id": "f5d6e7f8-...",
"name": "Checkout Flow",
"steps_count": 5,
"created_at": "2026-02-01T14:30:00Z"
}
],
"total": 2
}37. delete_funnel
Permanently delete a funnel. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
funnel_id | string | Yes | The funnel UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_funnel",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"funnel_id": "f5d6e7f8-..."
}
}
}{
"deleted": true,
"funnel_id": "f5d6e7f8-..."
}38. delete_website
Permanently delete a website and all its analytics data. Requires read_write mode and full_access key.
This action is irreversible. All analytics data, goals, funnels, and settings for this website will be permanently deleted.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID to delete |
confirm | boolean | Yes | Must be true to confirm deletion |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_website",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"confirm": true
}
}
}{
"deleted": true,
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "example.com"
}49. create_website
Create a new website to track. Requires read_write mode and full_access key.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The website domain (e.g. docs.example.com) |
name | string | No | Display name (defaults to the domain) |
timezone | string | No | IANA timezone (default: UTC) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_website",
"arguments": {
"domain": "docs.example.com",
"name": "Documentation Site",
"timezone": "America/New_York"
}
}
}{
"website": {
"id": "3fb9bg08-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "docs.example.com",
"name": "Documentation Site",
"tracking_code": "zv_ghi789",
"is_active": true,
"created_at": "2026-03-15T10:00:00Z"
},
"script_tag": "<script defer data-website-id=\"zv_ghi789\" src=\"https://api.zenovay.com/tracker.js\"></script>"
}Settings Tools
39. add_ip_exclusion
Add an IP address or CIDR range to the exclusion list. Visitors from excluded IPs will not be tracked. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
ip_address | string | Yes | IP address or CIDR range (e.g. 192.168.1.0/24) |
label | string | No | Descriptive label (e.g. "Office network") |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "add_ip_exclusion",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ip_address": "203.0.113.0/24",
"label": "Office network"
}
}
}{
"exclusion": {
"id": "exc_ip_1...",
"type": "ip",
"ip_address": "203.0.113.0/24",
"label": "Office network",
"created_at": "2026-03-15T10:00:00Z"
}
}40. remove_ip_exclusion
Remove an IP address from the exclusion list. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
exclusion_id | string | Yes | The exclusion UUID to remove |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "remove_ip_exclusion",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"exclusion_id": "exc_ip_1..."
}
}
}{
"deleted": true,
"exclusion_id": "exc_ip_1..."
}41. add_path_exclusion
Add a URL path pattern to exclude from tracking. Pages matching the pattern will not generate analytics events. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
path_pattern | string | Yes | URL path pattern to exclude (e.g. /admin/*, /internal/health) |
match_type | string | No | exact, starts_with, contains, regex (default: starts_with) |
label | string | No | Descriptive label |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "add_path_exclusion",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"path_pattern": "/admin",
"match_type": "starts_with",
"label": "Admin panel"
}
}
}{
"exclusion": {
"id": "exc_path_1...",
"type": "path",
"path_pattern": "/admin",
"match_type": "starts_with",
"label": "Admin panel",
"created_at": "2026-03-15T10:00:00Z"
}
}42. remove_path_exclusion
Remove a path exclusion. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
exclusion_id | string | Yes | The exclusion UUID to remove |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "remove_path_exclusion",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"exclusion_id": "exc_path_1..."
}
}
}{
"deleted": true,
"exclusion_id": "exc_path_1..."
}43. list_exclusions
List all IP and path exclusions for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_exclusions",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"ip_exclusions": [
{
"id": "exc_ip_1...",
"ip_address": "203.0.113.0/24",
"label": "Office network",
"created_at": "2026-03-15T10:00:00Z"
}
],
"path_exclusions": [
{
"id": "exc_path_1...",
"path_pattern": "/admin",
"match_type": "starts_with",
"label": "Admin panel",
"created_at": "2026-03-15T10:00:00Z"
}
],
"total_ip": 1,
"total_path": 1
}44. get_notification_settings
Get notification preferences for the current team.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_notification_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"notifications": {
"weekly_digest_email": true,
"anomaly_alerts": true,
"anomaly_threshold": "warning",
"goal_completion_alerts": false,
"uptime_alerts": true,
"email_recipients": ["admin@example.com"]
}
}45. update_notification_settings
Update notification preferences. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
weekly_digest_email | boolean | No | Enable/disable weekly digest |
anomaly_alerts | boolean | No | Enable/disable anomaly alerts |
anomaly_threshold | string | No | Minimum severity: info, warning, critical |
goal_completion_alerts | boolean | No | Enable/disable goal completion notifications |
uptime_alerts | boolean | No | Enable/disable uptime monitoring alerts |
email_recipients | array | No | List of email addresses to notify |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_notification_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"anomaly_alerts": true,
"anomaly_threshold": "critical",
"goal_completion_alerts": true,
"email_recipients": ["admin@example.com", "dev@example.com"]
}
}
}{
"notifications": {
"weekly_digest_email": true,
"anomaly_alerts": true,
"anomaly_threshold": "critical",
"goal_completion_alerts": true,
"uptime_alerts": true,
"email_recipients": ["admin@example.com", "dev@example.com"],
"updated_at": "2026-03-15T10:00:00Z"
}
}Team Tools
46. get_team_members
List all members of your team. Requires full_access key.
Cost: 1 query
This tool takes no parameters.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_team_members",
"arguments": {}
}
}{
"team": {
"id": "team_abc123",
"name": "Acme Corp"
},
"members": [
{
"id": "usr_1...",
"email": "admin@example.com",
"name": "Jane Admin",
"role": "owner",
"joined_at": "2025-06-01T10:00:00Z"
},
{
"id": "usr_2...",
"email": "dev@example.com",
"name": "John Dev",
"role": "member",
"joined_at": "2025-08-15T14:00:00Z"
}
],
"total": 2
}47. invite_team_member
Invite a new member to your team by email. Requires read_write mode, full_access key, and Pro plan or higher.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to invite |
role | string | No | Role: member (default) or admin |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "invite_team_member",
"arguments": {
"email": "newdev@example.com",
"role": "member"
}
}
}{
"invitation": {
"id": "inv_1...",
"email": "newdev@example.com",
"role": "member",
"status": "pending",
"invited_at": "2026-03-15T10:00:00Z",
"expires_at": "2026-03-22T10:00:00Z"
}
}48. remove_team_member
Remove a member from your team. Requires read_write mode and full_access key.
You cannot remove the team owner. The member will immediately lose access to all team websites.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
member_id | string | Yes | The user ID of the member to remove |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "remove_team_member",
"arguments": {
"member_id": "usr_2..."
}
}
}{
"removed": true,
"member_id": "usr_2...",
"email": "dev@example.com"
}API Key Tools
50. list_api_keys
List all API keys for the current team. Returns key metadata (not the key values themselves).
Cost: 1 query
This tool takes no parameters.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_api_keys",
"arguments": {}
}
}{
"api_keys": [
{
"id": "key_1...",
"name": "Production Key",
"prefix": "zv_prod_",
"type": "full_access",
"mcp_enabled": true,
"mcp_mode": "read_write",
"created_at": "2026-01-15T10:00:00Z",
"last_used_at": "2026-03-15T09:30:00Z"
}
],
"total": 1
}51. create_api_key
Create a new API key. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the key |
type | string | Yes | full_access or site_access |
website_id | string | No | Required for site_access keys |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_api_key",
"arguments": {
"name": "Staging Key",
"type": "site_access",
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"api_key": {
"id": "key_2...",
"name": "Staging Key",
"key": "zv_stg_xxxxxxxxxxxxxxxx",
"type": "site_access",
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"created_at": "2026-03-15T10:00:00Z"
},
"message": "Save this key — it will not be shown again."
}The full API key value is only returned once at creation time. Store it securely.
52. revoke_api_key
Revoke (delete) an API key. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID to revoke |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "revoke_api_key",
"arguments": {
"key_id": "key_2..."
}
}
}{
"revoked": true,
"key_id": "key_2...",
"name": "Staging Key"
}53. get_api_key_details
Get detailed information about a specific API key.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_key_details",
"arguments": {
"key_id": "key_1..."
}
}
}{
"api_key": {
"id": "key_1...",
"name": "Production Key",
"prefix": "zv_prod_",
"type": "full_access",
"mcp_enabled": true,
"mcp_mode": "read_write",
"mcp_permissions": {
"analytics": true,
"advanced": true,
"ai_insights": true,
"management": true,
"settings": true,
"api_keys": false,
"uptime": true
},
"created_at": "2026-01-15T10:00:00Z",
"last_used_at": "2026-03-15T09:30:00Z",
"total_requests": 1247
}
}54. update_api_key_permissions
Update MCP permissions for an API key. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID |
mcp_enabled | boolean | No | Enable or disable MCP access |
mcp_mode | string | No | read_only or read_write |
permissions | object | No | Feature group toggles (e.g. {"analytics": true, "management": false}) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_api_key_permissions",
"arguments": {
"key_id": "key_1...",
"mcp_mode": "read_write",
"permissions": {
"analytics": true,
"advanced": true,
"ai_insights": true,
"management": true,
"settings": false
}
}
}
}{
"updated": true,
"key_id": "key_1...",
"mcp_mode": "read_write",
"mcp_permissions": {
"analytics": true,
"advanced": true,
"ai_insights": true,
"management": true,
"settings": false
}
}Uptime Tools
55. list_uptime_monitors
List all uptime monitors for the current team.
Cost: 1 query
This tool takes no parameters.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_uptime_monitors",
"arguments": {}
}
}{
"monitors": [
{
"id": "mon_1...",
"url": "https://example.com",
"name": "Production Site",
"interval": 300,
"status": "up",
"uptime_30d": 99.98,
"last_checked_at": "2026-03-15T09:55:00Z"
}
],
"total": 1
}56. get_uptime_status
Get current status and response time for a specific monitor.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_uptime_status",
"arguments": {
"monitor_id": "mon_1..."
}
}
}{
"monitor": {
"id": "mon_1...",
"url": "https://example.com",
"status": "up",
"response_time_ms": 142,
"status_code": 200,
"uptime_24h": 100.0,
"uptime_7d": 99.99,
"uptime_30d": 99.98,
"last_checked_at": "2026-03-15T09:55:00Z",
"last_incident_at": "2026-03-10T03:22:00Z"
}
}57. create_uptime_monitor
Create a new uptime monitor. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to monitor |
name | string | No | Display name (defaults to the URL hostname) |
interval | number | No | Check interval in seconds (default: 300) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_uptime_monitor",
"arguments": {
"url": "https://api.example.com/health",
"name": "API Health",
"interval": 60
}
}
}{
"monitor": {
"id": "mon_2...",
"url": "https://api.example.com/health",
"name": "API Health",
"interval": 60,
"status": "pending",
"created_at": "2026-03-15T10:00:00Z"
}
}58. delete_uptime_monitor
Delete an uptime monitor. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_uptime_monitor",
"arguments": {
"monitor_id": "mon_2..."
}
}
}{
"deleted": true,
"monitor_id": "mon_2..."
}59. get_uptime_history
Get uptime history and incident log for a monitor.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID |
time_range | string | No | Time range: 24h, 7d, 30d, 90d (default: 30d) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_uptime_history",
"arguments": {
"monitor_id": "mon_1...",
"time_range": "7d"
}
}
}{
"monitor_id": "mon_1...",
"uptime_percentage": 99.99,
"total_checks": 2016,
"failed_checks": 1,
"incidents": [
{
"id": "inc_1...",
"started_at": "2026-03-10T03:22:00Z",
"resolved_at": "2026-03-10T03:27:00Z",
"duration_seconds": 300,
"status_code": 503,
"reason": "Service Unavailable"
}
],
"avg_response_time_ms": 156
}Website Management Tools (60-64)
60. update_website_name
Update the display name for a website. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | New display name |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_name",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Production Website"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Production Website",
"updated_at": "2026-03-15T10:00:00Z"
}61. update_website_timezone
Update the timezone for a website. Affects how daily analytics are aggregated. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
timezone | string | Yes | IANA timezone (e.g. America/New_York, Europe/London) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_timezone",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timezone": "Europe/London"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timezone": "Europe/London",
"updated_at": "2026-03-15T10:00:00Z"
}62. update_website_domain
Update the domain for a website. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | New domain (e.g. example.com) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_domain",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "new.example.com"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "new.example.com",
"updated_at": "2026-03-15T10:00:00Z"
}63. pause_tracking
Temporarily pause analytics tracking for a website. No new events will be recorded. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "pause_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tracking_active": false,
"paused_at": "2026-03-15T10:00:00Z"
}64. resume_tracking
Resume analytics tracking for a paused website. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "resume_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tracking_active": true,
"resumed_at": "2026-03-15T10:00:00Z"
}Reporting Tools (65-69)
65. schedule_report
Schedule a recurring analytics report to be sent via email. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
frequency | string | Yes | daily, weekly, or monthly |
recipients | array | Yes | List of email addresses |
metrics | array | No | Specific metrics to include (default: all) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "schedule_report",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"frequency": "weekly",
"recipients": ["marketing@example.com", "ceo@example.com"]
}
}
}{
"report": {
"id": "rpt_1...",
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"frequency": "weekly",
"recipients": ["marketing@example.com", "ceo@example.com"],
"next_send_at": "2026-03-22T08:00:00Z",
"created_at": "2026-03-15T10:00:00Z"
}
}66. get_report_schedule
Get scheduled report configuration for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_report_schedule",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"reports": [
{
"id": "rpt_1...",
"frequency": "weekly",
"recipients": ["marketing@example.com", "ceo@example.com"],
"next_send_at": "2026-03-22T08:00:00Z",
"last_sent_at": "2026-03-15T08:00:00Z"
}
],
"total": 1
}67. cancel_report
Cancel a scheduled report. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
report_id | string | Yes | The report schedule ID to cancel |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "cancel_report",
"arguments": {
"report_id": "rpt_1..."
}
}
}{
"cancelled": true,
"report_id": "rpt_1..."
}68. get_export_history
Get the history of data exports for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
limit | number | No | Max results (default: 20) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_export_history",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"limit": 5
}
}
}{
"exports": [
{
"id": "exp_1...",
"format": "csv",
"time_range": "30d",
"status": "completed",
"file_size_bytes": 245760,
"created_at": "2026-03-14T15:00:00Z"
}
],
"total": 1
}69. get_data_retention
Get the data retention policy for a website based on the current plan.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_data_retention",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"plan": "pro",
"analytics_retention_days": 730,
"heatmap_retention_days": 60,
"session_replay_retention_days": 60,
"oldest_data_at": "2024-03-15T00:00:00Z"
}Revenue & Data Tools (70-75)
70. set_revenue_currency
Set the default revenue display currency for a website. Uses ISO 4217 currency codes. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
currency | string | Yes | ISO 4217 currency code (e.g. USD, EUR, GBP, CHF, JPY) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "set_revenue_currency",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR",
"message": "Revenue currency set to EUR"
}71. get_revenue_settings
Get revenue-related settings for a website, including the configured currency and any field mappings.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_revenue_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR",
"revenue_field_mappings": null
}72. add_allowed_domain
Add a domain to the CORS whitelist. Only whitelisted domains can send tracking data to this website. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | Domain to whitelist (e.g. example.com, staging.example.com) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "add_allowed_domain",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "staging.example.com"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "staging.example.com",
"allowed_domains": ["example.com", "staging.example.com"],
"total": 2
}73. remove_allowed_domain
Remove a domain from the CORS whitelist. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | Domain to remove from the whitelist |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "remove_allowed_domain",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "staging.example.com"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"removed": "staging.example.com",
"allowed_domains": ["example.com"],
"total": 1
}74. list_allowed_domains
List all domains in the CORS whitelist for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_allowed_domains",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"allowed_domains": ["example.com", "staging.example.com"],
"total": 2
}75. request_data_deletion
Delete all data for a specific visitor from a website. Used for GDPR compliance (right to erasure). This action is irreversible. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
visitor_id | string | Yes | The visitor UUID whose data should be deleted |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "request_data_deletion",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"visitor_id": "vis_abc123..."
}
}
}{
"message": "Visitor data deleted successfully",
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"visitor_id": "vis_abc123...",
"records_deleted": 47,
"deleted_at": "2026-03-15T10:00:00Z"
}This permanently deletes all visitor data including page views, sessions, and events. This cannot be undone.
Multi-Step Workflow Examples
These examples show complete request/response chains for common tasks. Each step uses the JSON-RPC format above.
Weekly Traffic Report
A typical reporting workflow: discover websites, then pull visitor stats, top pages, and traffic sources.
Step 1 — Discover your websites:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_websites",
"arguments": {}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": "[{"id": "ws_abc123", "domain": "zenovay.com", "name": "Zenovay"}]"
}]
}
}Step 2 — Get visitor overview:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_visitors",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d"
}
}
}Step 3 — Get top pages:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_top_pages",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d",
"limit": 10
}
}
}Step 4 — Get traffic sources:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_traffic_sources",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d"
}
}
}Total cost: 4 queries (1 + 1 + 1 + 1)
Performance Audit
Identify performance issues, errors, and get AI recommendations.
Step 1 — List websites (same as above, get website_id)
Step 2 — Check Core Web Vitals:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_performance_metrics",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d"
}
}
}Step 3 — Check for errors:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_errors",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d",
"limit": 20
}
}
}Step 4 — Get AI recommendations:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_recommendations",
"arguments": {
"website_id": "ws_abc123"
}
}
}Total cost: 4 queries (1 + 1 + 1 + 1)
Quick Health Check
Fast check of remaining quota and current live visitors — ideal at the start of a session.
Step 1 — Check remaining quota:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_usage",
"arguments": {}
}
}Step 2 — Check real-time visitors:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_realtime_visitors",
"arguments": {
"website_id": "ws_abc123"
}
}
}Total cost: 2 queries (1 + 1)
Week-over-Week Comparison
Compare this week's metrics against last week to identify trends.
Step 1 — List websites (get website_id)
Step 2 — Compare periods:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "compare_periods",
"arguments": {
"website_id": "ws_abc123",
"current_period": "7d",
"previous_period": "7d"
}
}
}Step 3 — Detect anomalies:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_anomalies",
"arguments": {
"website_id": "ws_abc123",
"time_range": "7d"
}
}
}Total cost: 3 queries (1 + 1 + 1)
Website Setup & Configuration
Set up a new website with exclusions and cookieless tracking.
Step 1 — Create the website:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_website",
"arguments": {
"domain": "docs.example.com",
"name": "Documentation"
}
}
}Step 2 — Enable cookieless tracking:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "toggle_cookieless_tracking",
"arguments": {
"website_id": "NEW_WEBSITE_ID",
"enabled": true
}
}
}Step 3 — Exclude office IP:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "add_ip_exclusion",
"arguments": {
"website_id": "NEW_WEBSITE_ID",
"ip_address": "203.0.113.0/24",
"label": "Office network"
}
}
}Step 4 — Get tracking code to install:
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_tracking_code",
"arguments": {
"website_id": "NEW_WEBSITE_ID"
}
}
}Total cost: 4 queries (1 + 1 + 1 + 1)
New Tools
76. get_retention_data
Get retention cohort analysis showing how well your website retains visitors over time. Returns cohort data grouped by the visitor's first-visit period.
Cost: 1 query | Requires: Pro+ (retentionAnalysis feature flag)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
cohort_size | string | No | week | Cohort grouping: day, week, month |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_retention_data",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "30d",
"cohort_size": "week"
}
}
}{
"cohorts": [
{
"period": "2026-02-17",
"visitors": 320,
"retention": [100, 42.5, 28.1, 18.4]
},
{
"period": "2026-02-24",
"visitors": 285,
"retention": [100, 38.9, 25.3]
},
{
"period": "2026-03-03",
"visitors": 310,
"retention": [100, 41.0]
},
{
"period": "2026-03-10",
"visitors": 295,
"retention": [100]
}
],
"cohort_size": "week",
"time_range": "30d",
"summary": {
"avg_week1_retention": 40.8,
"avg_week2_retention": 26.7,
"total_cohort_visitors": 1210
}
}77. get_user_profiles
Get visitor profiles with session history and behavioral data. Returns individual visitor records with their visit history, pages viewed, and engagement metrics.
Cost: 1 query
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Profiles to return (1-50) |
country_code | string | No | — | Filter by ISO country code (e.g. US, DE) |
min_sessions | number | No | — | Minimum number of sessions |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_user_profiles",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"min_sessions": 3,
"limit": 10
}
}
}{
"profiles": [
{
"visitor_id": "v_abc123",
"first_seen": "2026-02-15T09:30:00Z",
"last_seen": "2026-03-14T16:45:00Z",
"total_sessions": 8,
"total_pageviews": 34,
"avg_session_duration_ms": 185000,
"country": "US",
"city": "San Francisco",
"device_type": "desktop",
"browser": "Chrome",
"os": "macOS",
"top_pages": ["/", "/pricing", "/docs"],
"referrer": "google.com"
}
],
"total": 156
}JSON-RPC Protocol Reference
All MCP requests use the JSON-RPC 2.0 format:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool_name",
"arguments": { ... }
}
}Available methods:
| Method | Description |
|---|---|
initialize | Handshake — returns server info and capabilities |
tools/list | List all available tools with schemas |
tools/call | Execute a tool |
ping | Health check |
Error response format:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32003,
"message": "Daily query limit exceeded. Upgrade at https://app.zenovay.com/settings"
}
}See Permissions & Limits for the full error code reference.
On this page