import os
from profound import Profound
client = Profound(
api_key=os.environ.get("PROFOUND_API_KEY"),
)
report = client.reports.get_bots_report(
date_interval="day",
dimensions=[],
metrics=["count"],
order_by={},
domain="",
start_date="2024-01-01T00:00:00.000Z",
)
print(report)import Profound from '@profoundai/client';
const client = new Profound({
apiKey: process.env['PROFOUND_API_KEY'], // defaults to the PROFOUND_API_KEY env var
environment: 'production',
});
const report = await client.reports.getBotsReport({
date_interval: 'day',
dimensions: [],
metrics: ['count'],
order_by: {},
domain: '',
start_date: '2024-01-01T00:00:00.000Z',
});
console.log(report);use profound::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = ProfoundClient::builder()
.api_key(std::env::var("PROFOUND_API_KEY")?)
.build()?;
let response = client
.reports()
.get_bots_report(BotsReportQuery {
date_interval: None,
dimensions: None,
metrics: vec![BotsReportQueryMetric::Count],
order_by: None,
pagination: None,
domain: "".to_string(),
start_date: chrono::Utc::now().fixed_offset(),
end_date: None,
organization_id: None,
metric_filters: None,
filters: None,
})
.send()
.await?;
println!("{:?}", response);
Ok(())
}curl --request POST \
--url https://api.tryprofound.com/v1/reports/bots \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"metrics": [],
"domain": "<string>",
"start_date": "2023-11-07T05:31:56Z",
"date_interval": "day",
"dimensions": [],
"order_by": {
"date": "asc"
},
"pagination": {
"limit": 10000,
"offset": 0
},
"end_date": "2023-11-07T05:31:56Z",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metric_filters": [
{
"field": "<string>",
"value": 123
}
],
"filters": [
{
"field": "path",
"value": "<string>"
}
]
}
'const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
metrics: [],
domain: '<string>',
start_date: '2023-11-07T05:31:56Z',
date_interval: 'day',
dimensions: [],
order_by: {date: 'asc'},
pagination: {limit: 10000, offset: 0},
end_date: '2023-11-07T05:31:56Z',
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
metric_filters: [{field: '<string>', value: 123}],
filters: [{field: 'path', value: '<string>'}]
})
};
fetch('https://api.tryprofound.com/v1/reports/bots', 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.tryprofound.com/v1/reports/bots",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'metrics' => [
],
'domain' => '<string>',
'start_date' => '2023-11-07T05:31:56Z',
'date_interval' => 'day',
'dimensions' => [
],
'order_by' => [
'date' => 'asc'
],
'pagination' => [
'limit' => 10000,
'offset' => 0
],
'end_date' => '2023-11-07T05:31:56Z',
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'metric_filters' => [
[
'field' => '<string>',
'value' => 123
]
],
'filters' => [
[
'field' => 'path',
'value' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tryprofound.com/v1/reports/bots"
payload := strings.NewReader("{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tryprofound.com/v1/reports/bots")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tryprofound.com/v1/reports/bots")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"info": {
"total_rows": 123,
"query": {}
},
"data": [
{
"metrics": [
123
],
"dimensions": [
"<string>"
]
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Bots Report V1
Get bot traffic report from the daily aggregated materialized view.
This endpoint queries pre-aggregated daily bot data, making it efficient for large date ranges and high-traffic sites.
Metrics:
- count: unique bot visits
- citations: unique citation events
- indexing: unique indexing events
- training: unique training events
- last_visit: most recent visit timestamp
import os
from profound import Profound
client = Profound(
api_key=os.environ.get("PROFOUND_API_KEY"),
)
report = client.reports.get_bots_report(
date_interval="day",
dimensions=[],
metrics=["count"],
order_by={},
domain="",
start_date="2024-01-01T00:00:00.000Z",
)
print(report)import Profound from '@profoundai/client';
const client = new Profound({
apiKey: process.env['PROFOUND_API_KEY'], // defaults to the PROFOUND_API_KEY env var
environment: 'production',
});
const report = await client.reports.getBotsReport({
date_interval: 'day',
dimensions: [],
metrics: ['count'],
order_by: {},
domain: '',
start_date: '2024-01-01T00:00:00.000Z',
});
console.log(report);use profound::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = ProfoundClient::builder()
.api_key(std::env::var("PROFOUND_API_KEY")?)
.build()?;
let response = client
.reports()
.get_bots_report(BotsReportQuery {
date_interval: None,
dimensions: None,
metrics: vec![BotsReportQueryMetric::Count],
order_by: None,
pagination: None,
domain: "".to_string(),
start_date: chrono::Utc::now().fixed_offset(),
end_date: None,
organization_id: None,
metric_filters: None,
filters: None,
})
.send()
.await?;
println!("{:?}", response);
Ok(())
}curl --request POST \
--url https://api.tryprofound.com/v1/reports/bots \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"metrics": [],
"domain": "<string>",
"start_date": "2023-11-07T05:31:56Z",
"date_interval": "day",
"dimensions": [],
"order_by": {
"date": "asc"
},
"pagination": {
"limit": 10000,
"offset": 0
},
"end_date": "2023-11-07T05:31:56Z",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metric_filters": [
{
"field": "<string>",
"value": 123
}
],
"filters": [
{
"field": "path",
"value": "<string>"
}
]
}
'const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
metrics: [],
domain: '<string>',
start_date: '2023-11-07T05:31:56Z',
date_interval: 'day',
dimensions: [],
order_by: {date: 'asc'},
pagination: {limit: 10000, offset: 0},
end_date: '2023-11-07T05:31:56Z',
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
metric_filters: [{field: '<string>', value: 123}],
filters: [{field: 'path', value: '<string>'}]
})
};
fetch('https://api.tryprofound.com/v1/reports/bots', 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.tryprofound.com/v1/reports/bots",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'metrics' => [
],
'domain' => '<string>',
'start_date' => '2023-11-07T05:31:56Z',
'date_interval' => 'day',
'dimensions' => [
],
'order_by' => [
'date' => 'asc'
],
'pagination' => [
'limit' => 10000,
'offset' => 0
],
'end_date' => '2023-11-07T05:31:56Z',
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'metric_filters' => [
[
'field' => '<string>',
'value' => 123
]
],
'filters' => [
[
'field' => 'path',
'value' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tryprofound.com/v1/reports/bots"
payload := strings.NewReader("{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tryprofound.com/v1/reports/bots")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tryprofound.com/v1/reports/bots")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metrics\": [],\n \"domain\": \"<string>\",\n \"start_date\": \"2023-11-07T05:31:56Z\",\n \"date_interval\": \"day\",\n \"dimensions\": [],\n \"order_by\": {\n \"date\": \"asc\"\n },\n \"pagination\": {\n \"limit\": 10000,\n \"offset\": 0\n },\n \"end_date\": \"2023-11-07T05:31:56Z\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metric_filters\": [\n {\n \"field\": \"<string>\",\n \"value\": 123\n }\n ],\n \"filters\": [\n {\n \"field\": \"path\",\n \"value\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"info": {
"total_rows": 123,
"query": {}
},
"data": [
{
"metrics": [
123
],
"dimensions": [
"<string>"
]
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Body
count, citations, indexing, training, last_visit Domain to query logs for.
Start date for logs. Accepts: YYYY-MM-DD, YYYY-MM-DD HH:MM, YYYY-MM-DD HH:MM:SS, or full ISO timestamp.
Date interval for the report. (only used with date dimension)
hour, day, week, month, year, relative_week Dimensions to group the report by.
date, host, path, bot_name, bot_provider Custom ordering of the report results.
The order is a record of key-value pairs where:
- key is the field to order by, which can be a metric or dimension
- value is the direction of the order, either 'asc' for ascending or 'desc' for descending.
When not specified, the default order is the first metric in the query descending.
Show child attributes
Show child attributes
{ "date": "asc" }
Pagination settings for the report results.
Show child attributes
Show child attributes
End date for logs. Accepts same formats as start_date. Defaults to now if omitted.
Numeric filters applied after report metrics are calculated.
Show child attributes
Show child attributes
Filters for bots report.
Filter by request path
- PathFilter
- BotNameFilter
- BotProviderFilter
Show child attributes
Show child attributes
Was this page helpful?