Search traffic campaign placements
Searches real campaign placements by campaign name for a named reporting
period. Matching is case-insensitive and treats pattern characters as
literal text. Rows are ranked by distinct visitors, then campaign,
source, and medium. The bounded response never contains a synthetic
“(other)” row; truncated tells the client to request a narrower query.
Results are served only for companies cut over to campaign serving facts.
Companies not yet cut over receive a normal 200 response with an empty
rows array and truncated set to false.
curl --request GET \
--url https://api.fluid.app/api/analytics/traffic/campaign-placements \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/analytics/traffic/campaign-placements"
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/analytics/traffic/campaign-placements', 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/analytics/traffic/campaign-placements",
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/analytics/traffic/campaign-placements"
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/analytics/traffic/campaign-placements")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/analytics/traffic/campaign-placements")
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{
"period": {
"name": "last_30_days",
"starts_on": "2026-09-01",
"ends_on": "2026-09-30",
"bucket": "day"
},
"rows": [
{
"name": "fall-paper-sale",
"source": "newsletter",
"medium": "email",
"visitors": 1840,
"page_views": 4210,
"orders": 27,
"revenue": "1484.73",
"conversion_rate": 0.0147
},
{
"name": "fall-paper-sale",
"source": "facebook",
"medium": "paid_social",
"visitors": 926,
"page_views": 1985,
"orders": 9,
"revenue": "494.91",
"conversion_rate": 0.0097
},
{
"name": "paper-restock-reminder",
"source": "newsletter",
"medium": "email",
"visitors": 412,
"page_views": 730,
"orders": 6,
"revenue": "329.94",
"conversion_rate": 0.0146
},
{
"name": "Paper Airplane Contest",
"source": null,
"medium": null,
"visitors": 38,
"page_views": 52,
"orders": 0,
"revenue": "0.00",
"conversion_rate": null
}
],
"truncated": false,
"status": 200,
"meta": {
"request_uuid": "7c1f4e2a-93b5-4d0e-b8a6-2f5d91c3e047",
"timestamp": "2026-09-30T14:05:12Z"
}
}{
"message": "<string>"
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Query Parameters
Named reporting period (default last_30_days). Supported names: today, last_7_days, last_30_days, last_90_days, last_12_months, this_month, last_month. An unsupported name returns 422.
Literal campaign-name fragment, matched case-insensitively.
2 - 100Response
Bounded campaign placement search results
Bounded real campaign placements matching one literal name query.
Resolved UTC reporting window shared by traffic reads.
Show child attributes
Show child attributes
Real campaign placements ranked by distinct visitors with deterministic tuple tie-breaks.
25Show child attributes
Show child attributes
True when more real placements matched than this bounded response returned.
200 Standard response metadata.
Show child attributes
Show child attributes
curl --request GET \
--url https://api.fluid.app/api/analytics/traffic/campaign-placements \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/analytics/traffic/campaign-placements"
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/analytics/traffic/campaign-placements', 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/analytics/traffic/campaign-placements",
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/analytics/traffic/campaign-placements"
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/analytics/traffic/campaign-placements")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/analytics/traffic/campaign-placements")
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{
"period": {
"name": "last_30_days",
"starts_on": "2026-09-01",
"ends_on": "2026-09-30",
"bucket": "day"
},
"rows": [
{
"name": "fall-paper-sale",
"source": "newsletter",
"medium": "email",
"visitors": 1840,
"page_views": 4210,
"orders": 27,
"revenue": "1484.73",
"conversion_rate": 0.0147
},
{
"name": "fall-paper-sale",
"source": "facebook",
"medium": "paid_social",
"visitors": 926,
"page_views": 1985,
"orders": 9,
"revenue": "494.91",
"conversion_rate": 0.0097
},
{
"name": "paper-restock-reminder",
"source": "newsletter",
"medium": "email",
"visitors": 412,
"page_views": 730,
"orders": 6,
"revenue": "329.94",
"conversion_rate": 0.0146
},
{
"name": "Paper Airplane Contest",
"source": null,
"medium": null,
"visitors": 38,
"page_views": 52,
"orders": 0,
"revenue": "0.00",
"conversion_rate": null
}
],
"truncated": false,
"status": 200,
"meta": {
"request_uuid": "7c1f4e2a-93b5-4d0e-b8a6-2f5d91c3e047",
"timestamp": "2026-09-30T14:05:12Z"
}
}{
"message": "<string>"
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}