# Agent Analytics timeseries Source: https://docs.siteline.ai/api-reference/agent-analytics/agent-analytics-timeseries /reporting-api.openapi.json get /v1/products/{productId}/analytics/timeseries Returns paginated AI agent / bot and referred human traffic timeseries. Use this endpoint for operational analytics, agent traffic dashboards, and data warehouse syncs. Response rows include only the requested metrics and dimensions. # Citations Source: https://docs.siteline.ai/api-reference/citations/citations /reporting-api.openapi.json get /v1/products/{productId}/citations Returns citations from AI answers for a selected product by property, page or associated products. When `groupBy` targets a single dimension (`property`, `page`, or `product`), the response includes only that top-level field. The aliases `byProperty`, `byPage`, and `byProduct` also work. # List products Source: https://docs.siteline.ai/api-reference/products/list-products /reporting-api.openapi.json get /v1/products Lists primary products authorized for the API key's team. Start here when you need product IDs for downstream calls. Competitor products linked through comparison data are excluded. # List tracked websites Source: https://docs.siteline.ai/api-reference/products/list-tracked-websites /reporting-api.openapi.json get /v1/products/{productId}/websites Lists website domains and IDs actively tracked in Agent Analytics for a product. # AI visibility by product Source: https://docs.siteline.ai/api-reference/prompts/ai-visibility-by-product /reporting-api.openapi.json get /v1/products/{productId}/prompts/summary Returns aggregate AI visibility by product across all prompts for the selected filters. # AI visibility by prompt Source: https://docs.siteline.ai/api-reference/prompts/ai-visibility-by-prompt /reporting-api.openapi.json get /v1/products/{productId}/prompts Returns one row with AI visibility metrics per tracked prompt, platform, and domain for the selected filters. `position`, `visibility`, `rank`, and `runCount` can be `null` when no value is available for that prompt row. # AI visibility timeseries Source: https://docs.siteline.ai/api-reference/prompts/ai-visibility-timeseries /reporting-api.openapi.json get /v1/products/{productId}/prompts/dates Returns daily trend rows for prompt visibility, position, and rank for a product. Use this endpoint for timeseries charts and trends monitoring. # Authorization Source: https://docs.siteline.ai/authorization Learn how to generate a Siteline website key All Agent Analytics integrations and the direct HTTP endpoint use a "website key" bearer token authentication scheme for secure access to endpoints. Each website key is unique to the website you are tracking. If you configure multiple website domains, you will have to manage multiple API keys. You can create, view, and manage your websites and associated keys in the configuration section of the Agent Analytics feature within your workspace. All API requests must be made over HTTPS to ensure secure transmission of your credentials. ## Get Your Website Key Before setting up any integration, you'll need to obtain your Siteline website key: Create a free [Siteline](https://siteline.ai) account if you haven't already. Navigate to **Agent Analytics** and click **Generate Website Key**. Save this key securely - you'll need it for the integration setup. # Azure CDN Source: https://docs.siteline.ai/integrations/azure-cdn Integrate Siteline with Azure CDN or Front Door diagnostic logs Use the Siteline Azure CDN Log Processor to track Azure CDN or Front Door traffic with Siteline. This integration processes CDN diagnostic logs from Blob Storage, triggers on blob-created events via Event Grid, and forwards pageview events to the Siteline API — no application code changes required. ## Prerequisites * A [Siteline website key](/authorization) * An existing Azure CDN or Front Door profile * Azure CLI configured for the target subscription * Node.js 18+ and npm Azure CDN diagnostic logs are batched hourly. Expect a **5–60 minute delay** between a CDN request and the pageview appearing in Siteline. ## Setup ```bash theme={null} git clone https://github.com/siteline-ai/siteline-azure-cdn.git cd siteline-azure-cdn npm install ``` ```bash theme={null} az login ``` ```bash theme={null} npm run setup ``` The interactive wizard will: * Prompt for your Siteline website key * List available CDN / Front Door profiles in your subscription * Provision all required Azure resources via Bicep (storage account, Function App, Event Grid subscription, diagnostic settings) ## How it works This integration uses Diagnostic Settings, Blob Storage, Event Grid, and Azure Functions: ```text theme={null} Azure CDN / Front Door (diagnostic logs) -> Blob Storage (cdn-logs container) -> Event Grid (BlobCreated) -> Azure Function (processor) -> Siteline intake API ``` Processing flow: 1. Azure CDN or Front Door writes hourly log batches to Blob Storage via Diagnostic Settings. 2. Blob Storage emits `BlobCreated` events to Event Grid. 3. Event Grid triggers the Azure Function processor. 4. The Function downloads and decompresses the log blob. 5. The Function parses records, normalizes fields across all CDN SKUs (Standard Microsoft, Standard/Premium Verizon, Front Door Standard/Premium), and sends pageview events to Siteline with 10 concurrent requests and 3 retries. Failed events are routed to a dead-letter queue (`dlq` container) for inspection. ## Configuration All settings are defined in `infra/main.bicepparam` and can be edited directly before running setup. Your Siteline website key. Used to authenticate requests to the Siteline API. The full Azure resource ID of the target CDN or Front Door profile. Azure deployment region. Defaults to `eastus`. Storage account name. Defaults to `sitelineazurecdnlogs`. Must be globally unique. Function App name. Defaults to `siteline-azure-cdn-processor`. Blob container name for CDN logs. Defaults to `cdn-logs`. Siteline intake endpoint. Defaults to `https://api.siteline.ai/v1/intake/pageview`. Enables verbose logging in the Function App. Defaults to `false`. ## Deploying updates After initial setup, redeploy function code with: ```bash theme={null} npm run deploy ``` This rebuilds, packages, and deploys the Function App interactively, prompting for resource group and function app with saved defaults. ## Troubleshooting Install the [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) and ensure it is available on your `PATH`. Verify you are logged into the correct Azure subscription. You can also enter the CDN profile resource ID manually when prompted. Storage account names are globally unique. Edit `storageAccountName` in `infra/main.bicepparam` with a unique name and rerun setup. Role assignments can take 1–2 minutes to propagate. Wait briefly and rerun `npm run setup` — Bicep deployments are idempotent. The setup wizard auto-resolves this. If it persists, specify a concrete region like `eastus` in the `location` parameter. Diagnostic logs are batched hourly — wait up to 60 minutes after initial setup. If pageviews still don't appear, check the `dlq` blob container for failed events. Edit parameters directly in `infra/main.bicepparam` and rerun `npm run setup`. The Bicep deployment is idempotent and will update resources in place. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Cloudflare Source: https://docs.siteline.ai/integrations/cloudflare Integrate Siteline with Cloudflare Workers Use [Cloudflare Workers](https://developers.cloudflare.com/workers/) to intercept requests at the edge and forward server logs containing AI bot & agent visit data to Siteline. The worker runs outside your application's request path, so there's no impact on site performance and no Cloudflare data is modified in any way. On a hosted website builder like Webflow, Framer, or HubSpot? See [Website Builders](/integrations/website-builders) for the full DNS-and-Worker setup. ## Prerequisites * A [Siteline website key](/authorization) * A Cloudflare account with your domain configured * [Node.js](https://nodejs.org/) installed locally ## Setup Both Cloudflare's DNS proxy and Workers run on Cloudflare's **free tier** (100K Worker requests/day), which covers most sites. If you have higher traffic and wish to stay on the free tier you can [scope your Worker routes](https://developers.cloudflare.com/workers/configuration/routing/routes/) to only the subdomains or paths that matter (e.g. your marketing site and blog, not your app dashboard). See [Cloudflare Workers pricing](https://developers.cloudflare.com/workers/platform/pricing/) for details. ```bash theme={null} git clone https://github.com/siteline-ai/siteline-cloudflare-worker.git cd siteline-cloudflare-worker npm install ``` * Trigger the login page ```bash theme={null} npx wrangler login ``` * Allow Wrangler (Cloudflare's official command-line tool) to access your account * Create an encrypted secret for your Siteline website key ```bash theme={null} npx wrangler secret put SITELINE_WEBSITE_KEY ``` * Paste your key when prompted and press Enter * Enter `Y` when prompted if you want to create a new Worker with name `siteline-cloudflare-worker` ```bash theme={null} npm run deploy ``` * In the [Cloudflare Dashboard](https://dash.cloudflare.com/), navigate to **Compute & AI** > **Workers & Pages** * Select **siteline-cloudflare-worker** > **Settings** > **Domain & Routes** > **Add** > **Route** * Select your project as the Zone and enter a route for the domains you'd like to track: * `example.com/*` — tracks all *pages* for your domain * `*example.com/*` — tracks all *pages & subdomains* We recommend tracking all *content* pages. If your blog is configured as a subdomain, use `*example.com/*` to capture both subdomains and root pages. * Set **Failure Mode** to **Fail Open** * Save ## How it works The worker runs as middleware on your domain: 1. Receives an incoming request 2. Forwards the request immediately to your origin (zero added latency) 3. Sends tracking data to Siteline in the background via `ctx.waitUntil` 4. Returns the response to the visitor unmodified Static assets (images, CSS, JS, fonts) are automatically excluded. View the full source on [GitHub](https://github.com/siteline-ai/siteline-cloudflare-worker). ## Environment variables Your Siteline website key. Set via `npx wrangler secret put SITELINE_WEBSITE_KEY`. ## Troubleshooting Verify that routes are configured in the Cloudflare Dashboard under **Compute & AI** > **Workers & Pages**. Select **siteline-cloudflare-worker** > **Settings** > **Domain** > **Routes.** You should see either `exampledomain.com/*` or `*exampledomain.com/*` configured as routes. Run `npx wrangler secret list` to confirm `SITELINE_WEBSITE_KEY` is present. Run `npx wrangler tail` to stream logs from your deployed worker. Run `npx wrangler secret put SITELINE_WEBSITE_KEY` and paste your new key when prompted. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # AWS CloudFront Source: https://docs.siteline.ai/integrations/cloudfront Integrate Siteline with CloudFront standard logs in S3 Use the Siteline AWS CloudFront S3 Log Processor to track CloudFront traffic with Siteline. This advanced/self-hosted integration processes CloudFront standard access logs from S3, triggers on S3 object-created events via EventBridge, and forwards pageview events to the Siteline API. If you use Fastly, the recommended setup is the direct [Fastly HTTPS logging integration](/integrations/fastly). It avoids the AWS S3/EventBridge/Lambda path. ## Prerequisites * A [Siteline website key](/authorization) * An existing CloudFront distribution configured to write **standard access logs** to S3 * AWS CLI v2 configured for the target account * `jq` and `zip` installed locally * Node.js 18+ and npm * IAM permissions for `s3`, `lambda`, `iam`, and `events` CloudFront standard logs are delayed by design. Typical availability is **5-15 minutes** after requests occur. ## Setup ```bash theme={null} git clone https://github.com/siteline-ai/siteline-cloudfront.git cd siteline-cloudfront npm install ``` ```bash theme={null} cp .env.example .env ``` Set at minimum: * `SITELINE_WEBSITE_KEY` * `LOG_BUCKET_NAME` * `AWS_REGION` * `AWS_PROFILE` (if using SSO or non-default profile) ```bash theme={null} npm run package ``` ```bash theme={null} npm run setup:all ``` This runs: * `npm run setup:s3` * `npm run setup:lambda` * `npm run setup:eventbridge` In your CloudFront distribution settings, enable **standard access logs** and confirm logs are written to `LOG_BUCKET_NAME`. ## How it works This integration uses S3 log delivery, EventBridge, and Lambda: ```text theme={null} CloudFront (standard logs) -> S3 log bucket -> EventBridge (Object Created) -> Lambda s3-log-processor -> Siteline intake API ``` Processing flow: 1. CloudFront writes gzipped log files to S3. 2. S3 sends `Object Created` events to EventBridge. 3. EventBridge invokes the Lambda processor. 4. Lambda downloads and gunzips the log file. 5. Lambda parses the `#Fields` header dynamically, maps each valid row, and sends events to Siteline. Rows with invalid status codes or missing URI are skipped. Malformed rows are skipped without stopping the rest of the file. ## Configuration Your Siteline website key. If missing, the Lambda exits without processing logs. S3 bucket used for CloudFront standard logs. Lambda only reads objects from this bucket. AWS region used by setup scripts and Lambda operations. Region override for S3 bucket operations. Defaults to `AWS_REGION`. Siteline intake endpoint. Defaults to `https://api.siteline.ai/v1/intake/pageview`. Enables debug mode in the Siteline SDK. Lambda function name. Default is `siteline-cloudfront-s3-processor`. EventBridge rule name for S3 object-created events. ## Required IAM policies Lambda trust policy: ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": ["lambda.amazonaws.com"] }, "Action": "sts:AssumeRole" } ] } ``` Lambda execution policy (bucket name is injected during setup): ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudWatchLogs", "Effect": "Allow", "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"], "Resource": "arn:aws:logs:*:*:*" }, { "Sid": "AllowReadCloudFrontLogsFromS3", "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::/*" } ] } ``` ## Troubleshooting Confirm CloudFront is writing standard logs to `LOG_BUCKET_NAME`, then verify S3 EventBridge notifications are enabled on that bucket. Check targets with: ```bash theme={null} aws events list-targets-by-rule --name "${EVENT_RULE_NAME}" --region "${AWS_REGION}" ``` Ensure deployer permissions include S3, IAM, Lambda, and EventBridge management. Also confirm Lambda execution role has `s3:GetObject` on the log bucket. Stream CloudWatch logs with: ```bash theme={null} aws logs tail "/aws/lambda/${LAMBDA_FUNCTION_NAME}" --follow --region "${AWS_REGION}" ``` **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Fastly Source: https://docs.siteline.ai/integrations/fastly Forward Fastly HTTPS logs to Siteline Use Fastly HTTPS logging to stream CDN request logs directly to Siteline Agent Analytics. This setup is manual: you create the Fastly logging endpoint in your Fastly account and use your Siteline website secret key to identify the incoming traffic. No AWS, S3, EventBridge, Lambda, IAM setup, zip files, CLI scripts, or Fastly API token in Siteline is required. ## Prerequisites * A Siteline website in **Settings** > **Connected Websites** * The website secret key for that Siteline website * Admin or engineer access to the Fastly service that serves your website * Permission to clone, edit, validate, and activate a Fastly service version Treat the website secret key like a password. Anyone with this key can submit analytics events for that website. ## Setup In Siteline, go to **Settings** > **Connected Websites**, find the website you want to connect, and copy its **Website Secret Key**. In the Fastly dashboard, open the service that serves the same website. Open **Service configuration**, select the active version, and clone it so you can edit a draft version. In the draft service version, open **Logging** and add an **HTTPS** logging endpoint. Use the settings in the table below. Replace `YOUR_SITELINE_WEBSITE_KEY` with the website secret key you copied from Siteline. Validate the draft Fastly version. When you are ready for the production service to send logs to Siteline, activate the version. ## Fastly HTTPS logging settings | Setting | Value | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name | `siteline-traffic` | | URL | `https://api.siteline.ai/v1/intake/fastly` | | Method | `POST` | | Content type | `application/json` | | Header name | `Authorization` | | Header value | `Bearer YOUR_SITELINE_WEBSITE_KEY` | | Period | `5` | | Request max bytes | `1900000` | | Log processing region | `none` | | Log format | `{"timestamp":"%{begin:%Y-%m-%dT%H:%M:%SZ}t","host":"%{json.escape(req.http.host)}V","url":"%{json.escape(req.url)}V","request_method":"%m","response_status":%s,"time_elapsed_usec":%{time.elapsed.usec}V,"request_user_agent":"%{json.escape(req.http.User-Agent)}V","request_referer":"%{json.escape(req.http.Referer)}V","client_ip":"%h","service_id":"%{req.service_id}V","version":"%{req.vcl.version}V"}` | The Fastly HTTPS logging API documents these fields, including `header_name`, `header_value`, `request_max_bytes`, and `period`: [Fastly HTTPS logging reference](https://www.fastly.com/documentation/reference/api/logging/https/). ## How it works Fastly sends batches of JSON request records to Siteline: ```text theme={null} Fastly HTTPS logging -> https://api.siteline.ai/v1/intake/fastly -> Siteline analytics pipeline ``` When you validate the Fastly HTTPS logging endpoint, Siteline automatically answers Fastly's domain-control challenge for the shared `api.siteline.ai` endpoint. Siteline reads the `Authorization: Bearer ` header, parses each row, skips malformed rows, and maps valid records to Agent Analytics pageviews for the matching website. ## Verify the setup After you activate the Fastly version, visit your website and wait a short time for Fastly to deliver its next batch. Then refresh Siteline Agent Analytics. You should see the website integration type become **Fastly** after Siteline receives valid events. ## Disconnect To stop sending Fastly logs to Siteline, remove or disable the `siteline-traffic` HTTPS logging endpoint in Fastly and activate the updated service version. If the website secret key may have been exposed, regenerate it in **Settings** > **Connected Websites**. After regenerating the key, update the Fastly HTTPS logging header value to use the new key. ## Troubleshooting Confirm the URL is `https://api.siteline.ai/v1/intake/fastly`, the method is `POST`, and the content type is `application/json`. Fastly HTTPS logging destinations must use HTTPS. Confirm the `Authorization` header value is `Bearer YOUR_SITELINE_WEBSITE_KEY`, not your Fastly API token. Visit the website after activation and allow time for Fastly's next log batch. Check that the Fastly header uses the website secret key for the Siteline website you intended to connect. Update the Fastly HTTPS logging endpoint header value to use `Bearer `, then validate and activate the Fastly version. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Direct HTTP API Source: https://docs.siteline.ai/integrations/http-api Integrate Siteline via HTTP API Send bot visit data to Siteline from any backend using a JSON POST request. Use this integration when you need full control over tracking or your stack isn't covered by one of the platform-specific integrations. ## Prerequisites * A [Siteline website key](/authorization) * A backend capable of making outbound HTTP requests ## Endpoint ```shellscript theme={null} POST https://api.siteline.ai/v1/intake/pageview ``` Only POST requests with a JSON body are supported. Requests must be made over HTTPS. ## Body parameters The full URL of the page being accessed (e.g. `https://yoursite.com/blog/post`). The `User-Agent` header from the incoming request. The `Referer` header from the incoming request. The visitor's IP address. Your Siteline website key. ## Example ```bash theme={null} curl --request POST \ "https://api.siteline.ai/v1/intake/pageview" \ --header "Content-Type: application/json" \ --data '{ "url": "https://yoursite.com/blog/post", "userAgent": "Mozilla/5.0 (compatible; ChatGPT-User/1.0)", "ref": "https://referrer.example", "ip": "1.2.3.4", "websiteKey": "secret_key_..." }' ``` ## Best practices * **Track key pages only** — blogs, landing pages, product pages, `robots.txt`, `sitemap.xml` * **Skip static assets** — images, CSS, JS, fonts don't need to be tracked * **Fire-and-forget** — don't await the response; send tracking calls asynchronously for zero impact on site speed * **Keep sensitive fields out of URLs** — send `websiteKey` and IP data only in the JSON body ## Troubleshooting Verify that all required body fields are present. Check that your `websiteKey` is correct and that the request includes `Content-Type: application/json`. Navigate to **Agent Analytics** in your Siteline workspace and click **Manage Configuration** to view or regenerate your key. No. Focus on content pages that AI bots are likely to crawl. Exclude static assets and internal API routes. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Netlify Source: https://docs.siteline.ai/integrations/netlify Integrate Siteline with Netlify Edge Functions Use a [Netlify Edge Function](https://docs.netlify.com/edge-functions/overview/) to intercept requests at the edge and forward tracking data to Siteline using the `@siteline/core` SDK. The edge function proxies the request transparently, so there is zero impact on site performance. ## Prerequisites * A [Siteline website key](/authorization) * A Netlify site with [Edge Functions](https://docs.netlify.com/edge-functions/overview/) enabled Netlify Edge Functions are available on all plans, including the **free tier**. See [Netlify Edge Functions](https://docs.netlify.com/edge-functions/overview/) for details. ## Setup Create an `edge-functions` directory in the root of your Netlify project and copy [`siteline.ts`](https://github.com/siteline-ai/siteline-js-sdk/blob/main/examples/netlify/edge-functions/siteline.ts) into it: ``` your-project/ ├── edge-functions/ │ └── siteline.ts └── netlify.toml ``` The function imports `@siteline/core` via an ESM URL (`https://esm.sh/@siteline/core@1.0.9`) — no `npm install` is needed since Netlify Edge Functions run on Deno. Open `edge-functions/siteline.ts` and set the `SITELINE_WEBSITE_KEY` constant at the top of the file: ```typescript theme={null} const SITELINE_WEBSITE_KEY = 'secret_key_...'; ``` Optionally configure `SITELINE_ENDPOINT` and `SITELINE_DEBUG`. Create or update `netlify.toml` in your project root: ```toml netlify.toml theme={null} [build] edge_functions = "edge-functions" [[edge_functions]] path = "/*" function = "siteline" ``` This routes every incoming request through the Siteline edge function. Deploy your site as usual. The edge function will begin tracking requests immediately. ## How it works The edge function runs as middleware on every matched request: 1. A visitor (or AI bot) makes a request to your Netlify site 2. The edge function calls `context.next()` to forward the request to your origin 3. Tracking data (`url`, `method`, `status`, `duration`, `userAgent`, `ref`, `ip`, `acceptHeader`) is sent to Siteline asynchronously via fire-and-forget 4. The response is returned to the visitor unmodified If the downstream request fails, the function still tracks the request with status `500` before re-throwing the error. The SDK initializes lazily on the first request and reuses the instance for subsequent calls. View the full source on [GitHub](https://github.com/siteline-ai/siteline-js-sdk/blob/main/examples/netlify/edge-functions/siteline.ts). ## Configuration Your Siteline website key. If empty, tracking is disabled and a warning is logged to the console. Siteline intake endpoint. Defaults to `https://api.siteline.ai/v1/intake/pageview`. Enables debug logging. When `true`, errors in the edge function are logged to the console. ## Troubleshooting Verify `SITELINE_WEBSITE_KEY` is set to a valid key in `edge-functions/siteline.ts`. Confirm `netlify.toml` routes `/*` to `function = "siteline"`. Ensure `[build] edge_functions = "edge-functions"` is present in `netlify.toml` and that the file exists at `edge-functions/siteline.ts`. No. Tracking is fire-and-forget — the tracking call is not awaited and never blocks the response. No. The edge function imports `@siteline/core` via an ESM URL, which Netlify's Deno-based runtime resolves automatically. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Next.js Source: https://docs.siteline.ai/integrations/nextjs Integrate Siteline with Next.js Use the [`@siteline/nextjs`](https://www.npmjs.com/package/@siteline/nextjs) package to track AI bot visits on your Next.js site. The tracker runs in a fire-and-forget pattern inside Next.js proxy code — requests are not awaited, so there is zero impact on page load times. ## Prerequisites * A [Siteline website key](/authorization) * A Next.js project using the [App Router](https://nextjs.org/docs/app) or [Pages Router](https://nextjs.org/docs/pages) ## Setup ```bash theme={null} npm install @siteline/nextjs ``` Create or update your `proxy.ts` file in the root of your project: ```typescript proxy.ts theme={null} import { withSiteline } from "@siteline/nextjs"; export default withSiteline({ websiteKey: process.env.SITELINE_WEBSITE_KEY!, }); export const config = { matcher: [ "/robots.txt", "/sitemap.xml", "/((?!api|_next/static|_next/image|favicon.ico).*)", ], }; ``` Deploy your application as usual. The proxy will begin tracking AI bot visits immediately. ## How it works The package hooks into [Next.js proxy](https://nextjs.org/docs/app/api-reference/file-conventions/proxy), which runs on every matched request before the page renders: 1. A visitor (or AI bot) makes a request to your Next.js site 2. The proxy extracts bot-relevant metadata (URL, user agent, IP, referrer) 3. Tracking data is sent to Siteline asynchronously — the request is not awaited 4. The page response is returned to the visitor unmodified Static assets (`_next/static`, `_next/image`, `favicon.ico`) are excluded via the route matcher. ## Custom Proxy Logic If you already have proxy logic, pass it as the second argument to `withSiteline`: ```typescript proxy.ts theme={null} import { type SitelineConfig, withSiteline } from '@siteline/nextjs'; import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; const sitelineConfig: SitelineConfig = { websiteKey: process.env.SITELINE_WEBSITE_KEY!, debug: process.env.NODE_ENV === 'development', }; export default withSiteline(sitelineConfig, (request: NextRequest) => { const response = NextResponse.next(); response.headers.set('x-custom-header', 'value'); return response; }); export const config = { matcher: ['/robots.txt', '/sitemap.xml', '/((?!api|_next/static|_next/image|favicon.ico).*)'], }; ``` ## Configuration Your Siteline website key. Found under **Agent Analytics** > **Manage Configuration** in your Siteline workspace. You can pass it directly or set it with the `SITELINE_WEBSITE_KEY` environment variable. Custom Siteline intake endpoint. Most sites can omit this. Enables debug logging. Use this only while developing or troubleshooting. Next.js route matcher config. The example pattern excludes API routes and static assets. Adjust to match the routes you want to track. ## Troubleshooting Ensure `proxy.ts` is in the root of your project (next to `package.json`), not inside `src/` or `app/`. Next.js picks up proxy files from the project root. Navigate to **Agent Analytics** in your Siteline workspace and click **Manage Configuration** to view or regenerate your key. No. Pass your existing logic as the second argument to `withSiteline`. It runs asynchronously and returns your response unchanged. No. The tracking call is fire-and-forget — it is not awaited and never blocks the response. All errors are silently caught. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Vercel Source: https://docs.siteline.ai/integrations/vercel Integrate Siteline with Vercel Log Drains Use [Vercel Log Drains](https://vercel.com/docs/observability/log-drains) to forward server-side request logs directly to Siteline. No code changes required — configuration is done entirely through the Vercel dashboard. Log drains run outside your application's request path, so there is zero impact on site performance. ## Prerequisites * A [Siteline website key](/authorization) * A Vercel account with your project deployed Log Drains are available on Vercel's **Pro** and **Enterprise** plans. See [Vercel Drains pricing](https://vercel.com/docs/drains#usage-and-pricing) for details. ## Setup In the [Vercel Dashboard](https://vercel.com/dashboard), navigate to your project's **Settings** > **Log Drains** and click **Add Log Drain**. Choose **Custom HTTP Endpoint** as the drain type. Add drain Select **Logs** as the data to drain. Select logs Fill in the following fields: * **Drain Name**: `Siteline Agent Analytics` * **Projects**: Select your website project * **Sources**: Select all except `Builds` * **Environment**: `Production` * **Sampling Rate**: `100%` Enter the following URL, replacing the placeholder with your Siteline website key: ``` https://api.siteline.ai/v1/intake/vercel-log-drain?websiteKey=YOUR_WEBSITE_KEY ``` Click **Create Drain** to activate. Vercel will begin forwarding logs immediately. ## How it works Vercel Log Drains stream server-side request logs to an external HTTP endpoint in real time: 1. AI agents, bots or humans make requests to your Vercel-hosted site 2. Vercel processes the request and generates a log entry 3. The log entry is forwarded to the Siteline intake endpoint in the background 4. Siteline identifies AI agent visits and human referral traffic and surfaces it in your Agent Analytics dashboard Your website's response time is unaffected — log drains operate asynchronously after the response is sent. ## Endpoint parameters Your Siteline website key, passed as a query parameter in the endpoint URL. ## Troubleshooting Verify the drain is active in **Settings** > **Log Drains**. Check that the endpoint URL includes your website key and that the drain status shows **Active**. Ensure **Sampling Rate** is set to `100%` and that `Builds` is the only source excluded. Navigate to **Agent Analytics** in your Siteline workspace and click **Manage Configuration** to view or regenerate your key. In **Settings** > **Log Drains**, delete the existing drain and create a new one with the updated URL. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Website Builders Source: https://docs.siteline.ai/integrations/website-builders Track AI bot & agent traffic on Webflow, Framer, HubSpot and other hosted website builders Run Siteline on closed website builders — including [Webflow](#webflow), [Framer](#framer), [HubSpot](#hubspot) and similar hosted platforms — by routing traffic through [Cloudflare](https://cloudflare.com) and deploying the Siteline Cloudflare Worker on the edge. ## Why this approach? Hosted website builders don't expose server logs or let you deploy custom middleware. A frontend JavaScript snippet won't capture AI traffic because most AI bots and agents don't execute JavaScript, measurement has to happen **server-side**. Putting Cloudflare in front of your builder inserts a server-side measurement layer that these platforms don't natively provide. The Worker runs at the edge, forwards every request to your builder's origin with zero added latency, and asynchronously logs request metadata to Siteline. You also get bot management, WAF rules, and easy subdomain hosting as bonus benefits. ## How it works ```mermaid actions={false} theme={null} flowchart LR A[Visitor / AI bot] <--> CF[Cloudflare] <--> O[Your site
Webflow, Framer, etc.] CF -. Worker .-> S[Siteline Agent Analytics] classDef cf fill:#F6821F,stroke:#C45A12,color:#fff; classDef sl fill:#0D9373,stroke:#0A6F58,color:#fff; class CF cf; class S sl; ``` Visitors and AI bots & agents now pass through Cloudflare before reaching your site, exactly as before. On the side, the Siteline Worker logs each request to Siteline asynchronously, your site's response is never delayed or modified. ## Prerequisites * A [Siteline website key](/authorization) * A Cloudflare account (free tier is sufficient) * Admin access to your website builder and to your domain's DNS ## Setup ### 1. Add your domain to Cloudflare In the [Cloudflare Dashboard](https://dash.cloudflare.com/), click **Add a domain** and enter your domain (e.g. `example.com`). Choose the **Free** plan. Cloudflare will display two nameservers (e.g. `ari.ns.cloudflare.com`). Replace your domain's existing nameservers with these at your registrar (GoDaddy, Namecheap, Google Domains, etc.). Propagation typically takes a few minutes to a few hours. In Cloudflare go to **SSL/TLS** > **Overview** and set the encryption mode to **Full** (or **Full (strict)**). This ensures the connection from Cloudflare to your builder's origin uses HTTPS, which is required by Webflow, Framer, and HubSpot. ### 2. Configure your website builder Add your custom domain inside your website builder's dashboard, then create matching DNS records in Cloudflare with the **proxy enabled** (orange cloud). In Webflow, open your project and go to **Site settings** > **Publishing** > **Production**. Click **Add a custom domain** and enter your domain. Webflow will display the exact A record IP(s) and CNAME target you need. In Cloudflare go to **DNS** > **Records** and add the records Webflow gave you: * **A** record on `@` pointing to Webflow's published IP * **CNAME** record on `www` pointing to `cdn.webflow.com` * Set **Proxy status** to **Proxied** (orange cloud) on both Back in Webflow, click **Check status** next to your domain, then publish your site. SSL is provisioned automatically. Always copy the IP and CNAME values directly from Webflow's dashboard — Webflow updates these periodically (most recently in 2026 as part of their Cloudflare migration). Hard-coded values from older guides may be stale. Reference: [Webflow — Manually connect a custom domain](https://help.webflow.com/hc/en-us/articles/33961239562387-Manually-connect-a-custom-domain). In Framer, open your project and go to **Site Settings** > **Domains** > **Connect Custom Domain**. Enter your domain. Framer will display the A record IPs and CNAME target you need. In Cloudflare go to **DNS** > **Records** and add the records Framer gave you: * **A** records on `@` pointing to each Framer IP * **CNAME** record on `www` pointing to `sites.framer.app` * Set **Proxy status** to **Proxied** (orange cloud) on all Back in Framer, click **Check** next to your domain. Once verified, Framer provisions SSL automatically and your site is live. Framer occasionally rotates their published IP addresses. Always copy values directly from Framer's dashboard rather than relying on cached values from guides. Reference: [Framer — Connect to hosting](https://www.framer.com/help/articles/connect-to-our-new-and-improved-hosting/). In HubSpot, navigate to **Settings** > **Content** > **Domains & URLs** > **Connect a domain**. Choose the content type (Website Pages, Landing Pages, Blog) and follow the prompts. HubSpot will display a **Required Data** value — typically a CNAME target like `[id].sites.hubspot.com`. In Cloudflare go to **DNS** > **Records** > **Add record**: * **Type**: `CNAME` * **Name**: the subdomain you're connecting (e.g. `www` or `@` for the root) * **Target**: the value HubSpot provided * **Proxy status**: **Proxied** (orange cloud) Click **Verify** in HubSpot. DNS propagation typically completes in 15–80 minutes. HubSpot will provision SSL automatically once verified. Cloudflare's [CNAME flattening](https://developers.cloudflare.com/dns/cname-flattening/) automatically handles CNAMEs at the apex (root) domain — no special configuration required. Reference: [HubSpot — Connect your domain](https://knowledge.hubspot.com/domains-and-urls/connect-a-domain-to-hubspot). The same pattern works for any builder that supports a custom domain via DNS: 1. In your builder, add the custom domain and copy the DNS records it requires (A records, CNAME, or both). 2. In Cloudflare, create matching records under **DNS** > **Records**. 3. Set **Proxy status** to **Proxied** (orange cloud) on each. 4. Verify the domain in your builder. If you're not sure whether your builder is compatible, [book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll confirm. ### 3. Deploy the Siteline Worker in Cloudflare Both Cloudflare's DNS proxy and Workers run on Cloudflare's **free tier** (100K Worker requests/day), which covers most sites. If you have higher traffic and wish to stay on the free tier you can [scope your Worker routes](https://developers.cloudflare.com/workers/configuration/routing/routes/) to only the subdomains or paths that matter (e.g. your marketing site and blog, not your app dashboard). See [Cloudflare Workers pricing](https://developers.cloudflare.com/workers/platform/pricing/) for details. ```bash theme={null} git clone https://github.com/siteline-ai/siteline-cloudflare-worker.git cd siteline-cloudflare-worker npm install ``` * Trigger the login page ```bash theme={null} npx wrangler login ``` * Allow Wrangler (Cloudflare's official command-line tool) to access your account * Create an encrypted secret for your Siteline website key ```bash theme={null} npx wrangler secret put SITELINE_WEBSITE_KEY ``` * Paste your key when prompted and press Enter * Enter `Y` when prompted if you want to create a new Worker with name `siteline-cloudflare-worker` ```bash theme={null} npm run deploy ``` * In the [Cloudflare Dashboard](https://dash.cloudflare.com/), navigate to **Compute & AI** > **Workers & Pages** * Select **siteline-cloudflare-worker** > **Settings** > **Domain & Routes** > **Add** > **Route** * Select your project as the Zone and enter a route for the domains you'd like to track: * `example.com/*` — tracks all *pages* for your domain * `*example.com/*` — tracks all *pages & subdomains* We recommend tracking all *content* pages. If your blog is configured as a subdomain, use `*example.com/*` to capture both subdomains and root pages. * Set **Failure Mode** to **Fail Open** * Save ### 4. Verify After the Worker is deployed and routes are configured, visit your site (or `curl` it) and check **Agent Analytics** in your [Siteline workspace](https://siteline.ai/app). You should see traffic appear within a few seconds. AI bot visits will be classified automatically. ## Bonus benefits Putting Cloudflare in front of your builder unlocks several useful capabilities: * **Bot management & WAF rules** — block or rate-limit unwanted crawlers without changing your builder configuration * **Subdomain hosting** — route `blog.example.com`, `docs.example.com`, etc. to different origins via Cloudflare * **Edge caching** — cache static assets at Cloudflare's edge for faster page loads * **Analytics** — see request volume, cache hit rate, and threat data in the Cloudflare dashboard ## Troubleshooting Set Cloudflare's SSL/TLS mode to **Full** under **SSL/TLS** > **Overview**. The default ("Flexible") doesn't work with Webflow, Framer, or HubSpot because they require HTTPS on the origin connection. Double-check that the DNS record values in Cloudflare exactly match what your builder asked for. Then wait 15–80 minutes for propagation. You can verify propagation at [dnschecker.org](https://dnschecker.org). In Cloudflare, go to **Workers & Pages** > **siteline-cloudflare-worker** > **Settings** > **Domain & Routes** and confirm a route like `example.com/*` or `*example.com/*` is configured. Then run `npx wrangler tail` from the cloned repo to stream real-time logs from the Worker. This usually means Cloudflare's SSL mode is set to **Flexible** while your builder is forcing HTTPS. Switch to **Full** in **SSL/TLS** > **Overview**. Run `npx wrangler secret put SITELINE_WEBSITE_KEY` from the cloned repo and paste the new key when prompted. No redeploy required. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it for your specific builder. # WordPress Source: https://docs.siteline.ai/integrations/wordpress Integrate Siteline with WordPress Install the [Siteline Agent Analytics](https://wordpress.org/plugins/siteline-agent-analytics/) plugin to track AI bot visits on your WordPress site. No code required — the plugin runs in fire-and-forget mode inside WordPress hooks, so there is zero impact on page load times. ## Prerequisites * A [Siteline website key](/authorization) * Administrator access to your WordPress site * Ability to install plugins on your WordPress installation ## Setup Navigate to your WordPress admin panel at `https://yoursite.com/wp-admin` and click **Plugins** in the left sidebar. Search for [Siteline Agent Analytics](https://wordpress.org/plugins/siteline-agent-analytics/) in the Plugins search bar, then click **Install Now**. Back in the Plugins list, click **Activate** under the Siteline Agent Analytics plugin. Go to **Settings** > **Siteline** in the left sidebar and configure: * **Enable Tracking**: Leave checked (uncheck to pause tracking) * **Website ID**: Paste your Siteline website key from [siteline.ai](https://siteline.ai) Click **Save Changes** to apply. On the Plugins page, enable auto-updates for Siteline to stay up to date automatically. ## How it works The plugin hooks into WordPress request processing: 1. A visitor (or AI bot) makes a request to your WordPress site 2. The plugin detects the request and extracts bot-relevant metadata (URL, user agent, IP, referrer) 3. Tracking data is sent to Siteline asynchronously in a fire-and-forget pattern 4. The page response is returned to the visitor unmodified Errors are silently caught and discarded — the plugin never interferes with your site's normal operation. ## Plugin settings Toggle AI bot tracking on or off. Checked by default. Your Siteline website key. Found under **Agent Analytics** > **Manage Configuration** in your Siteline workspace. ## Troubleshooting Verify that **Enable Tracking** is checked in **Settings** > **Siteline** and that your Website ID is entered correctly. Navigate to **Agent Analytics** in your Siteline workspace and click **Manage Configuration** to view or regenerate your website key, then paste it into the plugin's **Website ID** field. If auto-updates are enabled, the plugin updates automatically. Otherwise, go to **Plugins**, find Siteline, and click **Update Now** when available. No. The plugin sends tracking data asynchronously and never blocks page rendering. All errors are silently caught. **Need help?** [Book a setup call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Introduction Source: https://docs.siteline.ai/introduction Growth analytics for the agentic web [Siteline](https://siteline.ai/app) turns AI bot and agent traffic into actionable insights to improve AI search visibility and drive organic growth. ## Why track AI bot & agent traffic? AI bots and agents from OpenAI, Google, Anthropic and others regularly crawl your website to reasearch your products, verify information and report back to humans. Understanding their intentions, actions and potential blockers is essential for improving AI visbility and preparing for the future of organic growth where humans are not the only customer. ## Key features Siteline has two core parts: * [**Agent Analytics**](/integrations/vercel) - Monitor AI agents, bots and crawlers ingesting your content in real-time. Understand where they're getting stuck, identify trending topics and optimize their experience to boost your AI visibility. * [**Visibility Tracking**](/metrics-glossary) - Track your brand or product's visibility against competitors, check the sources AI cites and identify top areas of opportunity. ## Get started with Agent Analytics Most AI bots bypass JavaScript, so they don't show up in tools like Google Analytics - they need to be tracked server-side. We offer nine easy to integrate and secure options: } href="/integrations/cloudflare"> Edge worker with zero latency impact } href="/integrations/vercel"> No-code log drain integration } href="/integrations/azure-cdn"> Azure Function for CDN & Front Door logs } href="/integrations/cloudfront"> S3 log processor for CloudFront access logs } href="/integrations/wordpress"> No-code plugin from the WP directory } href="/integrations/website-builders"> Webflow, Framer, HubSpot & other hosted builders } href="/integrations/nextjs"> Lightweight middleware package }> Coming soon } href="/integrations/http-api"> Send events from any backend ## Security & privacy Our integrations are designed with security and privacy in mind: * No personal identifying information (PII) is stored or logged * All integrations run asynchronously and never interfere with page responses * Errors are silently caught and discarded. Your site runs exactly as before **Need help getting set up?** [Book a call](https://cal.com/team/siteline/tech-set-up) and we'll walk you through it. # Mentions Building Source: https://docs.siteline.ai/mentions-building Get your brand mentioned on real publications to drive AI agent citations and product mentions. ## Why Mentions Building matters AI search engines like ChatGPT, Perplexity, Gemini, and Google AI Overviews generate answers by pulling from sources they consider authoritative. When your brand is mentioned on sites that AI agents frequently cite, you're more likely to appear in those answers. According to [research by Ahrefs](https://ahrefs.com/blog/ai-overview-brand-correlation/), branded web mentions are the strongest correlated factor for appearing in AI-generated answers — ahead of domain rating, branded search volume, and number of referring domains. Mentions Building helps you close the gap by getting your brand placed on the same types of publications your competitors are already mentioned on. ## How it works 1. **You submit an order** — choose the page you want to promote, a content type, and how many placements you'd like across different publisher quality tiers. 2. **We match you with publishers** — we find topically relevant publications in your category that meet the quality tier you selected (based on Domain Rating and organic traffic). 3. **Content is created and published** — a relevant article is written that naturally mentions your brand and links to your page. Content types include contextual mentions, listicles, product reviews, and comparison guides. 4. **You track the results** — once a placement goes live, you can monitor it in the Orders and Placements tabs. Over time, you can cross-reference placements with changes in your [AI Visibility](/metrics-glossary) metrics to measure impact. ## Placing an order Navigate to **Mentions Building** → **New Order** in the left sidebar. ### Page to promote Enter the URL of the page you want publishers to link to. This is typically your homepage, a key product page, or a landing page you want to drive authority to. You can optionally specify a preferred anchor text — the clickable text used for the link. If you don't specify one, we'll choose something natural and contextually relevant. ### Content type request Choose the type of article you'd like your brand placed in: | Content Type | Description | Pricing | | ------------------------ | ---------------------------------------------------------------------------------- | ---------------------- | | **Contextual placement** | A natural brand mention within a relevant article | Included in base price | | **Listicle** | "Top X tools for Y" style article — a format frequently cited by AI search engines | +20% | | **Product review** | A dedicated review or feature walkthrough of your product | +20% | | **Comparison guide** | A side-by-side comparison with competitors | +20% | Listicles and comparison guides tend to perform well for AI visibility because AI search engines frequently cite these formats when answering product discovery queries like "What are the best tools for X?" ### Content guidelines You can provide optional guidance on what should be included in the content. This is not guaranteed but helps our publishers understand what angles matter to you. **Examples:** * "Write a listicle on the best analytics tools for the agentic web and include Siteline as one of the top options." * "Focus on our real-time AI agent traffic monitoring capabilities." * "Position us as the best option for companies concerned about AI crawler impact on their infrastructure." ### Publisher quality tiers Each placement targets a publisher within a specific quality range, measured by [Ahrefs Domain Rating (DR)](https://ahrefs.com/blog/domain-rating/) and monthly organic traffic: | Tier | Domain Rating | Organic Traffic | Price per placement | | ------------- | ------------- | --------------- | ------------------- | | **Starter** | 20+ | 100–5k | \$100 | | **Standard** | 30+ | 100–10k | \$160 | | **Authority** | 40+ | 500–20k | \$240 | | **Power** | 50+ | 1k–30k | \$400 | | **Elite** | 60+ | 1k–100k | \$500 | You can customize the number of placements at each tier using the quantity controls in the **Customize your publisher mix** section. ### Volume discounts Larger orders receive automatic discounts: | Order total | Discount | | ----------- | -------- | | \$500+ | 5% off | | \$1,000+ | 10% off | The discount nudge below the order summary shows how close you are to the next discount tier. ### Add-ons **Publisher domain approval** — by default, we handle publisher selection end-to-end (auto-approval). If you'd like to review and approve each publisher domain before content is placed, you can enable "Require approval + specifications" for an additional 20%. **Express delivery** — standard turnaround is 28 days. If you need placements faster, express delivery (14 days) is available for an additional 20%. ## Submitting your order Once your order is configured, review the **Order summary** sidebar on the right which shows your line items, any content type add-ons, discounts, and the total price. Click **Submit Order** to place your request. We'll send you a confirmation email with payment instructions and order details. ## Tracking your orders ### Orders tab The **Orders** tab shows all your submitted orders with their current status: | Status | Meaning | | --------------- | --------------------------------------------------------------- | | **In Progress** | Your order has been received and placements are being fulfilled | | **Completed** | All placements in the order have been published | | **Cancelled** | The order was cancelled | ### Placements tab The **Placements** tab shows individual placements that have gone live, including the publisher domain, article URL, and publication date. As placements are indexed, you can cross-reference this data with your AI Visibility tracking to measure impact over time. ## Frequently asked questions Real publications with genuine organic traffic, commercially valuable search rankings, and topical relevance to your category. We don't use spammy networks, private blog networks (PBNs), or low-quality content farms. We match you with publishers that meet the quality tier you selected. While we can't guarantee a specific domain, we guarantee that every placement will meet the minimum Domain Rating and traffic thresholds for your chosen tier. Not directly — we handle publisher matching to ensure relevance and quality. If you enable Publisher domain approval (+20%), you can review and approve each domain before content is placed. Standard turnaround is approximately 28 days from order submission to published placement. Express delivery (14 days) is available as an add-on. Each placement includes publisher outreach, content creation, and publishing. You control the target URL, preferred anchor text, and content guidelines. AI search engines generate answers by referencing sources they consider authoritative. When your brand is mentioned on publications that AI agents cite, you're more likely to be included in AI-generated answers for relevant queries. You can track this impact directly in Siteline's [AI Visibility](/metrics-glossary) feature. Currently, each order targets a single page URL. If you'd like placements pointing to different pages, submit separate orders. Not yet — Mentions Building is currently pay-per-order. We're exploring subscription options based on beta feedback. # Metrics Glossary Source: https://docs.siteline.ai/metrics-glossary Definitions for the key visibility metrics used in the application *Last updated February 7th, 2026* ## Overview The Siteline platform provides precise data about your brand and product’s visibility across AI and traditional search platforms. Here you will find definitions of key terms with examples. Please feel free to reach out directly to the team at [team@siteline.ai](mailto:team@siteline.ai) if you need additional help. ## Tracking Metrics Definitions **Definition:** The percentage of responses in which your (or a competitor’s) product appears. If the product is not present, the visibility is shown as “No”. *Example:* If your product appears in 6 of 10 responses from ChatGPT, then the visibility is 60% **Definition:** Your product’s ranking by *visibility* compared to all products that appear in the prompt results. *Example:* If your competitor has a visibility of 28% and your product 25% for a given set of prompts or tag, then your rank is 2. **Definition:** The position of your brand or product within response text. This is most often shown as an average across multiple responses. *Example:* In the sentence “Top project management tools include Asana, Trello, and Monday.com…” * Asana has a position of 1 * Trello has a position of 2 * Monday.com has a position of 3 **Definition:** When AI chatbots conduct a web search they provide citations in the form of links in addition to the text response. A citation is *associated* with a product means that the citation was placed near the product or brand name within the text. Often, but not always, this implies that the product or brand is mentioned in the text of cited page. Note: With the exception of Perplexity, AI chat apps do not always conduct a web search when providing an answer. This determination is made automatically based on whether the prompt requires niche or recent information. ## Prompt Tracking Configuration Definitions **Definition:** Schedule determines the frequency at which your prompts will run: daily, biweekly (2x per week), weekly, or bimonthly (2x per month). The schedule be adjusted by clicking ‘Edit Tracking’ from the Track section. **Definition**: One execution of all active prompts against the configured platforms. A run main contain multiple repetitions **Definition:** The number of times each prompt executes per scheduled run. Repetitions can be adjusted by clicking ‘Edit Tracking’ from the Track section. *Note:* Unlike traditional SEO, LLM responses can different output for the same input. As such we recommend configuring multiple repetitions to collect robust data. # Prompt Generation Best Practices Source: https://docs.siteline.ai/prompt-generation-best-practices Tips for how to select representative custom prompts to use for visibility tracking. ## Getting Started In addition to pre-generated and expanded prompts based on your competitors, Siteline allows you to enter a list of custom prompts during the tracking configuration process. You can set up tracking for the first time or edit existing tracking by clicking the “Start Tracking” or "Edit Prompts" buttons in the Track section. Enter Prompt Tracking Select Prompts * You can then add custom prompts one by one or paste in a comma-separated list * Once added an "estimated volume" field will be shown as a proxy for the amount of AI search conversation based on traditional search and other factors ## Keywords vs. Prompts When selecting prompts the overall goal should be to pick a well distributed set that covers your key customer and product segments. * Compared to keyword searches in Google, which consist of 2-5 words, prompts entered into ChatGPT tend to be longer and more customized to specific needs and uses e.g. “top CRMs” vs. “What are the top CRMs for small businesses with a rich integrations capabilities, particularly with Twilio.” * Additionally, two prompts may have different text, but very similar semantic meaning and will likely lead to the same output e.g. “Best CRM for SMBs with Twilio integration.” Given the above dynamics, we recommend crafting custom prompts that **cover your key segments** and **are semantically different** to ensure that your visibility results are **representative of your target audience** and **unbiased** ## Suggested Prompt Selection Approach ### Step 1: Identify key segments Note down some key segments or categories you use when thinking about targeting and analyzing your marketing efforts. Here are some common ones: * Product category / features * Ideal customer profile (ICP) * Customer vertical * Customer stage * Purchaser role function * Pain-point solved ### Step 2: Create tags within segments For each of the categories above list out the segments, these can be used as Tags once within Siteline. Continuing with a CRM offering example: * Product features: * Activity Tracking * Reporting * Integrations * Customer Vertical * B2B SaaS * Marketing Agencies ### Step 3: Generate prompts by segment and segment cross-section Generate a 4-8 word phrase or question with ***high product discovery*** intent for a single segment or a cross section of segments. **What do you mean by high product discovery intent?** The prompt should lead the AI Search platform to respond with specific product or brands names, not with only a definition or informational response. ❌ ”CRM integration capabilities” ✅ ”Top CRMs with integration capabilities” ### For a single segment Sticking with the segment examples above, construct your prompts with the following structure: > **"Best" / "Top" / "Recommend" + \[Your product category] + \[Segment]** For example: | Segment Category | Segment (Tags) | Example Prompt | | :---------------- | :----------------- | :----------------------------------------------- | | Product features | Activity Tracking | Top CRMs with *activity tracking* | | Product features | Reporting | Top CRMs with *robust reporting* | | Product features | Integrations | Top CRMs with *large integration* library | | Customer Vertical | B2B SaaS | What are the best CRMs for *B2B Saas*? | | Customer Vertical | Marketing Agencies | What are the best CRMs for *marketing agencies*? | ### For segment cross-sections After you have prompts that are one-to-one with segments you can create prompts that represent the cross-section of multiple segments. Note: Use as needed, not all cross-sections may make sense. | | Activity tracking | Reporting | Integrations | | :--------------------- | :---------------------------------------------------------------- | :-------------------------------------------------------- | :----------------------------------------------------------------- | | **B2B SaaS** | Top CRMs for *B2B SaaS* with strong *activity tracking* | Top CRMs for *B2B SaaS* with *robust reporting* | Top CRMs for *B2B SaaS* with a *large integration library* | | **Marketing Agencies** | Top CRMs for *marketing agencies* with strong *activity tracking* | Top CRMs for *marketing agencies* with *robust reporting* | Top CRMs for *marketing agencies* with *large integration library* | ### Step 4: Compile, comma-separate and paste into Siteline Once your prompts are generated you can paste them into comma separated list of prompts in to the configuration step ## Prompt Weighting When you enter prompts on Siteline the platform will automatically pull in a volume estimate based on the equivalent keywords on traditional search engines Google + Bing. To further weight your prompts for offline analysis we recommend using the following as proxies: * Visitor traffic from to your website or blog * More traffic on a topic —> more interest —> higher weight * Support tickets or demo requests by topic * Hashtags or terms on social media * Volume of **AI search requests from crawler or user bots** to various content pages of your website * For example, if you see lots of bots crawling your page about "Integrations", it's a good indication that there is user interest in that aspect of your poduct and related prompts should be strongly weighted. * Gain access to bot activity data directly in Siteline for free by setting up [Agent Analytics](/introduction). # MCP server Source: https://docs.siteline.ai/reporting/mcp Connect your AI tools to Siteline using MCP The Model Context Protocol (MCP) is a standard for connecting Large Language Models (LLMs) to platforms like Siteline. Once connected, your AI assistants can query Siteline Agent Analytics and AI Visibility data on your behalf. ## MCP Setup Choose your MCP client and add Siteline using the instructions below. In Claude or Claude Desktop, open **Settings** > **Connectors**, then add a custom connector: ```text theme={null} Name: Siteline URL: https://mcp.siteline.ai/mcp ``` After saving the connector, use Claude's connector authentication flow to log in to Siteline and approve read-only analytics access for your team. Add the MCP server with: ```bash theme={null} claude mcp add --transport http siteline https://mcp.siteline.ai/mcp ``` Then authenticate from Claude Code: ```text theme={null} /mcp ``` Add the MCP server with: ```bash theme={null} codex mcp add siteline --url https://mcp.siteline.ai/mcp ``` In Cursor, add Siteline as a remote MCP server from **Settings** > **Tools & Integrations** > **MCP**, or add this project configuration to `.cursor/mcp.json`: ```json theme={null} { "mcpServers": { "siteline": { "url": "https://mcp.siteline.ai/mcp" } } } ``` Cursor will open the OAuth flow when it first connects or when you run a Siteline tool. Alternatively, add this configuration to `.mcp.json`: ```json theme={null} { "mcpServers": { "siteline": { "type": "http", "url": "https://mcp.siteline.ai/mcp" } } } ``` After configuring the MCP server, authenticate using your MCP client's authentication flow. ### Authentication Some MCP clients automatically prompt you to log in during setup, while others require manual authentication steps. Authentication opens a browser window where you log in to Siteline and grant read-only analytics access for the selected team. **Siteline MCP does not require you to generate or paste a public API key into the MCP client.** ### Next steps After you log in, check that the MCP server is connected. Depending on the client, you may need to restart it to connect and detect all tools after authorization. To verify the client has access to the MCP server tools, ask it to query Siteline using natural language. For example: "Summarize prompt performance for my product using Siteline MCP." ## What you can ask Once connected, ask your AI tool in plain language. It picks the right tools and handles the details. Try prompts like these: * How has OpenAI bot traffic to my site changed over the last 3 months? * Compare AI-referred human visits week over week. * Which pages do AI crawlers hit most often? * Summarize my prompt performance on ChatGPT over the last 30 days. * Which tracked prompts am I ranking worst on, and which competitors are beating me? * Show how my Gemini visibility trended last month. * What are the top pages citing my product in the last 30 days? * Which source domains mention my competitors but not me? * List the products most often mentioned alongside mine. ## Available tools The server exposes seven read-only tools. Your AI tool selects these automatically, you don't need to call them by name. Each maps directly to an endpoint in the [Reporting API](/reporting/reporting-api-introduction), where you can find exact parameters and response fields. | Tool | Use it to | | -------------------------------------- | -------------------------------------------------------------------------------------------------- | | `list_products` | List authorized primary products, product IDs, and domains for the MCP connection. | | `list_product_websites` | List active website domains and website IDs for a product. | | `list_product_tracked_prompts` | List tracked prompt rows with platform, domain, position, visibility, rank, run count, and labels. | | `summarize_product_prompt_performance` | Summarize aggregate prompt visibility, position, rank, and competitor count. | | `analyze_product_prompt_trends` | Analyze daily prompt visibility, position, and rank trends. | | `list_product_citations` | List citation source pages, source domains, or mentioned products. | | `analyze_product_analytics_timeseries` | Analyze AI crawler and referred human traffic timeseries. | ## Security risks Connecting any data source to an LLM carries inherent risks. Siteline MCP is read-only, but AI tools can still retrieve and summarize analytics data that your team has access to. Prompt injection can trick an AI assistant into treating untrusted content as instructions. Review MCP tool calls before allowing them, especially in clients that can run tools automatically. ### Recommendations * Review tool calls before approving them * Connect only MCP clients you trust * Use a Siteline team with the minimum data access needed * Remove the MCP server from clients that no longer need access * Revoke or reconnect the MCP client if you suspect a client token was exposed # Reporting API Source: https://docs.siteline.ai/reporting/reporting-api-introduction Query Siteline product analytics from production systems over HTTP The Siteline Reporting API gives production systems read-only access to product analytics, prompt performance, citations, and agent analytics traffic. Use it when you need to power internal dashboards, data pipelines, customer reporting, or agent workflows directly from Siteline data. This page documents the Reporting API for reading analytics data. If you want to send pageview tracking events to Siteline, use the [Direct HTTP API](/integrations/http-api) instead. ## Base URL ```text theme={null} https://api.siteline.ai ``` All production requests must use HTTPS and return JSON. ## Authentication Create a public API key in your Siteline workspace under **Team settings** > **Public API Key**. Only team admins can view, create, copy, or regenerate the key. Pass the key as a bearer token: ```http theme={null} Authorization: Bearer ``` Example: ```bash theme={null} curl \ -H "Authorization: Bearer $SITELINE_PUBLIC_API_KEY" \ "https://api.siteline.ai/v1/products" ``` Treat the public API key as a production secret. Store it in a secret manager, never ship it to a browser or mobile client, and rotate it if it is exposed. ## Authorization model The API key scopes every request to the Siteline team that owns the key and its managed teams. * `GET /v1/products` returns primary products owned by that team or its managed teams * Product-specific routes only return data for products owned by that team or its managed teams * Competitor products linked through comparison data are not authorized as primary products * Missing keys, invalid keys, revoked keys, malformed product IDs, and unauthorized products all return the same `401` response ```json theme={null} { "message": "Unauthorized." } ``` ## Production client checklist * Keep requests server-side; never expose the API key to end users * Cache low-churn discovery calls like `GET /v1/products` * Use RFC3339 timestamps for all date ranges, for example `2026-05-01T00:00:00Z` * Keep date windows bounded to the reporting period your workflow needs * Retry transient `5xx` failures with exponential backoff and jitter * Do not retry `400` or `401` responses until inputs or credentials are fixed * Log request path, status code, and a correlation ID, but never log the full API key * Prefer `labelIds[]`, `platforms[]`, and `groupBy` filters over downloading broad datasets and filtering later ## Query conventions Repeated filters use bracket notation: ```text theme={null} platforms[]=openai&platforms[]=gemini&labelIds[]=7&labelIds[]=12 ``` Prompt and citation endpoints share these query parameters: | Name | Required | Type | Description | | ------------- | -------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------ | | `domain` | Yes | string | Product domain to report metrics for, such as `example.com`. | | `dateFrom` | Yes | RFC3339 timestamp | Inclusive start timestamp. | | `dateTo` | Yes | RFC3339 timestamp | Inclusive end timestamp. | | `platforms[]` | No | repeated string | Platform filters. Common values include `openai`, `gemini`, `google`, `perplexity`, `google_ai_overviews`, and `claude`. | | `labelIds[]` | No | repeated integer | Prompt label IDs to filter on. Invalid IDs return `400`. | Invalid or missing query parameters return: ```json theme={null} { "message": "Invalid request parameters." } ``` ## Error behavior | Status | Response | Meaning | | ------ | ---------------------------------------------- | ------------------------------------------------------ | | `200` | Endpoint response body | Request succeeded. | | `400` | `{ "message": "Invalid request parameters." }` | Required query parameters are missing or malformed. | | `401` | `{ "message": "Unauthorized." }` | API key validation or product authorization failed. | | `500` | `{ "message": "Internal server error." }` | Unexpected server-side or upstream dependency failure. | ## Recommended sync pattern For production ingestion jobs: 1. Call `GET /v1/products` and cache product IDs. 2. Call `GET /v1/products/{productId}/websites` and cache authorized domains. 3. Use `websiteId` on analytics timeseries requests when you need one website instead of all product websites combined. 4. Run narrow date-window requests for each product and domain. 5. Store the exact `dateFrom`, `dateTo`, endpoint path, and filters used for every sync batch. 6. On retries, re-run the same idempotent `GET` request with the same filters. Use the MCP server when an AI assistant should ask follow-up questions and choose tools interactively. Use the Reporting API when your own backend or data pipeline needs direct, repeatable access to Siteline analytics. # Teams & Roles Source: https://docs.siteline.ai/teams-and-roles Manage team members and linked teams ## Overview Every Siteline user belongs to a team. Within a team, users are assigned a **role** that determines what they can access and manage You can invite new users and manage your team from **Settings → Team**. ## Roles | Capability | Admin | Member | | :--------------------------------------------- | :---: | :----: | | View products, tracking data & recommendations | ✅ | ✅ | | Start or edit prompt tracking | ✅ | ✅ | | Add or remove products & websites | ✅ | ✅ | | Invite or remove team members | ✅ | ❌ | | Change member roles | ✅ | ❌ | | Manage subscription & billing | ✅ | ❌ | | Create or manage linked teams | ✅ | ❌ | ## Inviting Team Members Navigate to **Settings → Team → Members** and click **Invite member**. Add one or more email addresses and select a role (Admin or Member) for each. Invited users will receive an email with a link to create an account as a part of your team. Pending invitations can be resent or cancelled from the Members table. **Note** At the moment only users without existing Siteline accounts can be invited to join a team through the invitation flow. If you'd like to add an existing Siteline user to your team please email [team@siteline.ai](mailto:team@siteline.ai) ## Linked Teams Linked teams let you create and manage separate teams under your account. Each linked team has its own members and can view its own products, websites, tracking data, and analytics, while your team owns the products, websites, tracking configuration, and billing on their behalf. This is useful for agencies or consultants managing tracking for multiple clients. ### Setting Up a Linked Team Navigate to **Settings → Team → Linked Teams** and click **Add linked team**. Enter the admin email for the team you want to link. They will receive an invitation to create an account. Once accepted, the client team appears in your Linked Teams table with an **Active** status. **Notes** * Only users without existing Siteline accounts can be invited to manage a linked team through the invitation flow. If you'd like to link an existing user or team please contact [team@siteline.ai](mailto:team@siteline.ai) * If the link from your team is removed, then the admin of the linked team will be able to fully manage billing and other settings. ### What Linked Team Users Can Do | Capability | Linked team admin | Linked team member | | :------------------------------------------------------- | :---------------: | :----------------: | | View products, websites, tracking data & recommendations | ✅ | ✅ | | Add or remove products & websites | ❌ | ❌ | | Start, edit, pause or resume prompt tracking | ❌ | ❌ | | Invite or remove their own team members | ✅ | ❌ | | Manage subscription & billing | ❌ | ❌ | | Create their own linked teams | ❌ | ❌ | Billing and subscription settings for linked teams are controlled by the parent team. Linked team users will see a message directing them to contact the parent team for plan changes.