Funnel Summary
Return funnel step performance over the selected date range.
curl -X GET "https://api.beacon.hard.al/v1/funnels/123e4567-e89b-12d3-a456-426614174000/summary?tenantId=123e4567-e89b-12d3-a456-426614174000&timeframe=today&startDate=example_string&endDate=example_string&timezone=example_string" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://api.beacon.hard.al/v1/funnels/123e4567-e89b-12d3-a456-426614174000/summary?tenantId=123e4567-e89b-12d3-a456-426614174000&timeframe=today&startDate=example_string&endDate=example_string&timezone=example_string"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://api.beacon.hard.al/v1/funnels/123e4567-e89b-12d3-a456-426614174000/summary?tenantId=123e4567-e89b-12d3-a456-426614174000&timeframe=today&startDate=example_string&endDate=example_string&timezone=example_string", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.beacon.hard.al/v1/funnels/123e4567-e89b-12d3-a456-426614174000/summary?tenantId=123e4567-e89b-12d3-a456-426614174000&timeframe=today&startDate=example_string&endDate=example_string&timezone=example_string", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.beacon.hard.al/v1/funnels/123e4567-e89b-12d3-a456-426614174000/summary?tenantId=123e4567-e89b-12d3-a456-426614174000&timeframe=today&startDate=example_string&endDate=example_string&timezone=example_string')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"range": {
"startDate": "2026-10-01",
"endDate": "2026-10-07",
"timezone": "Europe/Istanbul"
},
"funnelSummary": {
"entryCount": 940,
"completedCount": 113,
"conversionRate": 12.02,
"steps": [
{
"stepOrder": 1,
"stepType": "page",
"stepValue": "/pricing",
"stepName": "/pricing",
"count": 940,
"share": 100
},
{
"stepOrder": 2,
"stepType": "event",
"stepValue": "add_to_cart",
"stepName": "add_to_cart",
"count": 235,
"share": 25
},
{
"stepOrder": 3,
"stepType": "event",
"stepValue": "purchase",
"stepName": "purchase",
"count": 113,
"share": 12.02
}
]
},
"stepPerformance": [
{
"stepOrder": 1,
"stepType": "page",
"stepValue": "/pricing",
"stepName": "/pricing",
"count": 940,
"percentage": 100
},
{
"stepOrder": 2,
"stepType": "event",
"stepValue": "add_to_cart",
"stepName": "add_to_cart",
"count": 235,
"percentage": 25
},
{
"stepOrder": 3,
"stepType": "event",
"stepValue": "purchase",
"stepName": "purchase",
"count": 113,
"percentage": 12.02
}
],
"dropOffs": [
{
"type": "entry",
"fromStep": null,
"toStep": 1,
"entryCount": 940,
"dropOffCount": 0,
"dropOffRate": null
},
{
"type": "dropOff",
"fromStep": 1,
"toStep": 2,
"dropOffCount": 705,
"dropOffRate": 75
},
{
"type": "dropOff",
"fromStep": 2,
"toStep": 3,
"dropOffCount": 122,
"dropOffRate": 51.91
}
]
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "tenant-required",
"message": "tenant-required"
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "validation-error",
"message": "Validation failed for 'timeframe': timeframe must be one of: today, yesterday, last7days, last30days, custom",
"details": {
"field": "timeframe",
"message": "timeframe must be one of: today, yesterday, last7days, last30days, custom"
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "bearer-required",
"message": "bearer-required"
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "invalid-credential",
"message": "invalid-credential"
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "credential-revoked",
"message": "credential-revoked"
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "credential-expired",
"message": "credential-expired"
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "tenant-not-granted",
"message": "tenant-not-granted",
"details": {
"tenantId": "2f1c7c3e-6c1a-4f1e-9b7a-2d8e4c1a9f10"
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "insufficient-scope",
"message": "insufficient-scope",
"details": {
"required": "reports:read"
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "tenant-not-found",
"message": "tenant-not-found",
"details": {
"tenantId": "2f1c7c3e-6c1a-4f1e-9b7a-2d8e4c1a9f10"
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "funnel-not-found",
"message": "funnel-not-found",
"details": {
"funnelId": "c41d9f0a-3b76-4e21-a5c8-9e2f7d1b6a34"
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
{
"success": false,
"error": {
"code": "rate-limited",
"message": "rate-limited",
"details": {
"retryAfterSeconds": 30
}
},
"timestamp": "2026-11-01T09:30:00.000Z",
"path": "/v1/funnels/{funnelId}/summary",
"requestId": "req_01JD2V8Q9Z6R4XK7T3M5N8P2WA"
}
/v1/funnels/{funnelId}/summaryTarget server for requests. Edit to use your own host.
OAuth access token (token exchange) or organization API key.
UUID of a saved funnel, as returned by GET /v1/funnels.
UUID of the tenant to report on. Send it exactly once. GET /v1/workspace/access lists the tenants this credential can read.
Reporting period. The presets today, yesterday, last7days and last30days cover whole calendar days ending today in the request timezone; last7days is today and the six days before it. Use custom together with startDate and endDate. Defaults to the last 30 days.
First day of a custom period, YYYY-MM-DD, inclusive. Send it only with timeframe=custom, together with endDate.
Last day of a custom period, YYYY-MM-DD, inclusive. Send it only with timeframe=custom; it must not be before startDate.
IANA time zone name such as Europe/Istanbul or America/New_York. It sets the calendar-day boundaries of the period and of the time buckets. Defaults to Europe/Istanbul.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. OAuth access token (token exchange) or organization API key.
Path Parameters
UUID of a saved funnel, as returned by GET /v1/funnels.
Query Parameters
UUID of the tenant to report on. Send it exactly once. GET /v1/workspace/access lists the tenants this credential can read.
Reporting period. The presets today, yesterday, last7days and last30days cover whole calendar days ending today in the request timezone; last7days is today and the six days before it. Use custom together with startDate and endDate. Defaults to the last 30 days.
First day of a custom period, YYYY-MM-DD, inclusive. Send it only with timeframe=custom, together with endDate.
Last day of a custom period, YYYY-MM-DD, inclusive. Send it only with timeframe=custom; it must not be before startDate.
IANA time zone name such as Europe/Istanbul or America/New_York. It sets the calendar-day boundaries of the period and of the time buckets. Defaults to Europe/Istanbul.
Responses
true