Mist apps
Visitors and page views for a Mist app
Returns daily visitors and page views for the Mist’s app, with its
top routes (as route patterns, in top_paths) and referring hosts,
read from Vercel Web Analytics. The range ends today in UTC and has one row for every
day.
Only companies with Mist growth tools turned on can read traffic.
For any other company this endpoint returns 404 and reads
nothing from Vercel.
A failed read names its reason in error.code:
422invalid_rangewhenrangeis not7d,28d, or90d.409not_provisionedwhen the Mist has no Vercel project yet.409web_analytics_offwhen Web Analytics is off for the app.402web_analytics_plan_requiredwhen the Vercel plan does not include the Web Analytics API.502web_analytics_forbiddenwhen Web Analytics is on but Mist’s Vercel credential cannot read it.502vendor_errorfor any other Vercel failure.
Returns 409 without error.code while the Mist is
pending_destroy.
Requires a company admin token with the mist.code permission.
GET
/
api
/
v202604
/
mists
/
{mist_id}
/
traffic
Visitors and page views for a Mist app
curl --request GET \
--url https://api.fluid.app/api/v202604/mists/{mist_id}/traffic \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/mists/{mist_id}/traffic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/mists/{mist_id}/traffic")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/mists/{mist_id}/traffic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"traffic": {
"range": "7d",
"since": "2026-10-08",
"until": "2026-10-14",
"totals": {
"visitors": 140,
"page_views": 431
},
"days": [
{
"date": "2026-10-08",
"visitors": 21,
"page_views": 48
},
{
"date": "2026-10-09",
"visitors": 25,
"page_views": 61
},
{
"date": "2026-10-10",
"visitors": 0,
"page_views": 0
},
{
"date": "2026-10-11",
"visitors": 33,
"page_views": 80
},
{
"date": "2026-10-12",
"visitors": 38,
"page_views": 92
},
{
"date": "2026-10-13",
"visitors": 30,
"page_views": 71
},
{
"date": "2026-10-14",
"visitors": 35,
"page_views": 79
}
],
"top_paths": [
{
"path": "/",
"visitors": 120,
"page_views": 190
},
{
"path": "/products/[slug]",
"visitors": 44,
"page_views": 87
}
],
"top_referrers": [
{
"host": "www.google.com",
"visitors": 61,
"page_views": 140
},
{
"host": "t.co",
"visitors": 12,
"page_views": 19
}
]
},
"status": 200,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"message": "<string>"
}{
"error": {
"code": "web_analytics_plan_required",
"message": "Web Analytics needs a paid Vercel plan"
},
"status": 402,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": "<string>"
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "web_analytics_off",
"message": "Web Analytics is off for this app"
},
"status": 409,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": {
"code": "invalid_range",
"message": "range must be one of 7d, 28d, 90d"
},
"status": 422,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": {
"code": "vendor_error",
"message": "vercel answered 500"
},
"status": 502,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}Authorizations
Bearer token authentication. Accepts company admin tokens with
the matching mist.* permission:
mist.viewto list and show Mistsmist.createto create and rename Mistsmist.destroyto delete and restore Mistsmist.codefor deployments, logs, and trafficmist.env_varsto read and manage environment variables Droplet installation tokens are refused.
Path Parameters
UUID of the company-owned Mist app.
Query Parameters
Number of days to read, ending today. Defaults to 28d.
Available options:
7d, 28d, 90d ⌘I
Visitors and page views for a Mist app
curl --request GET \
--url https://api.fluid.app/api/v202604/mists/{mist_id}/traffic \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/mists/{mist_id}/traffic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/mists/{mist_id}/traffic"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/mists/{mist_id}/traffic")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/mists/{mist_id}/traffic")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"traffic": {
"range": "7d",
"since": "2026-10-08",
"until": "2026-10-14",
"totals": {
"visitors": 140,
"page_views": 431
},
"days": [
{
"date": "2026-10-08",
"visitors": 21,
"page_views": 48
},
{
"date": "2026-10-09",
"visitors": 25,
"page_views": 61
},
{
"date": "2026-10-10",
"visitors": 0,
"page_views": 0
},
{
"date": "2026-10-11",
"visitors": 33,
"page_views": 80
},
{
"date": "2026-10-12",
"visitors": 38,
"page_views": 92
},
{
"date": "2026-10-13",
"visitors": 30,
"page_views": 71
},
{
"date": "2026-10-14",
"visitors": 35,
"page_views": 79
}
],
"top_paths": [
{
"path": "/",
"visitors": 120,
"page_views": 190
},
{
"path": "/products/[slug]",
"visitors": 44,
"page_views": 87
}
],
"top_referrers": [
{
"host": "www.google.com",
"visitors": 61,
"page_views": 140
},
{
"host": "t.co",
"visitors": 12,
"page_views": 19
}
]
},
"status": 200,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"message": "<string>"
}{
"error": {
"code": "web_analytics_plan_required",
"message": "Web Analytics needs a paid Vercel plan"
},
"status": 402,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": "<string>"
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "web_analytics_off",
"message": "Web Analytics is off for this app"
},
"status": 409,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": {
"code": "invalid_range",
"message": "range must be one of 7d, 28d, 90d"
},
"status": 422,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}{
"error": {
"code": "vendor_error",
"message": "vercel answered 500"
},
"status": 502,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-10-14T15:02:11Z"
}
}