The Reporting API is currently in beta and available on paid plans only. To activate it for
your team, contact us at [email protected].
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 instead.
Base URL
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:Authorization model
The API key scopes every request to the Siteline team that owns the key.GET /v1/productsreturns only primary products owned by that team- Product-specific routes only return data for products owned by that team
- 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
401response
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
5xxfailures with exponential backoff and jitter - Do not retry
400or401responses 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[], andgroupByfilters over downloading broad datasets and filtering later
Query conventions
Repeated filters use bracket notation:| 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. |
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:- Call
GET /v1/productsand cache product IDs. - Call
GET /v1/products/{productId}/websitesand cache authorized domains. - Use
websiteIdon analytics timeseries requests when you need one website instead of all product websites combined. - Run narrow date-window requests for each product and domain.
- Store the exact
dateFrom,dateTo, endpoint path, and filters used for every sync batch. - On retries, re-run the same idempotent
GETrequest with the same filters.