Skip to main content

The Bright Analytics Reporting API

How to authenticate, build requests, and interpret responses from the Bright Analytics Reporting API.

Reporting API Reference

This article covers everything you need to build and run requests against the BA Reporting API: authentication, request structure, filters, and response format.

Endpoint

The endpoint for requesting report data is:

https://engine.brightanalytics.io/reporting-api/run

Request Type

The Reporting API expects a POST request.

Headers

Header

Value

Notes

Authorization

Bearer <token>

Support will assist in generation of API tokens.

x-tenant-id

Your tenant ID (uppercase alphanumeric string)

Uniquely identifies your BA instance. Support will confirm the Tenant ID for your instance(s).

Accept

application/json

Required

Request body

All requests must be a JSON object with the following top-level fields:

Field

Required

Type

Description

metrics

Yes

array

At least one metric to return. Each item is { "ref": "..." }.

dimensions

No

array

Dimensions to break the data down by. Each item is { "ref": "..." }.

filters

No

array

Filters applied to dimensions (see below).

date_range

Yes

object

{ "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }.

response_data_key

No

string

Controls the key used to label each field in the returned rows. One of id, ref, or name. See "Response format" below.

What is a "ref"?

When requesting a metric or dimension you must specify one of 2 values as the 'ref'.

  • ID
    This is the numeric ID associated with a given metric or dimension

  • The BA Ref value
    This is a short, meaningful, human-readable code (e.g. cost_per_click) label that is defined per metric or dimensions the Semantic Layer interface.

    This is configured in the settings tab of your Metric or Dimension:

When building metrics, dimensions, or filters, the ref field in your request can be either the numeric ID or the BA ref - both are accepted.

Filters

Filters apply only to dimensions. Each filter object requires a ref and a type, plus either values or search depending on the type:

Type

Requires

Behavior

in

values (array)

Include rows where the dimension value matches one of the given values.

not_in

values (array)

Exclude rows where the dimension value matches one of the given values.

contains

search (string)

Include rows where the dimension value contains the given substring.

not_contains

search (string)

Exclude rows where the dimension value contains the given substring.

regex

search (string)

Include rows where the dimension value matches the given regular expression.

not_regex

search (string)

Exclude rows where the dimension value matches the given regular expression.

not_empty

neither

Exclude rows where the dimension value is an empty string.

Date range

Dates are specified as YYYY-MM-DD and represent the calendar dates you want data for, regardless of your local timezone — timezone normalization is handled upstream in our data pipeline, so no timezone conversion is needed on your end.

Response Data Key

The response_data_key field in your request controls which identifier is used as the key for each value inside a row object:

  • id — keys are numeric metric/dimension IDs

  • ref — keys are the BA ref values

  • name — keys are the display names

The default behaviour - if response_data_key is not defined - is to return the 'BA ref' for a metric or dimension.

Response

A successful response includes:

  • rows — the actual data, one object per row

  • report_specification — an echo of the request you sent

  • metrics / dimensions — metadata for each metric/dimension used in the request (id, ref, name, formatting info)

  • row_count, run_duration, generated_at — metadata about the run

Example request

{
"metrics":[
{
"ref":"56"
}
],
"dimensions":[
{
"ref":"1"
},
{
"ref":"33"
}
],
"filters":[
{
"ref":"33",
"type":"in",
"values":[
"Paid Search",
"Paid Social",
"Display"
]
}
],
"date_range":{
"start":"2026-06-15",
"end":"2026-06-15"
}
}

Example response

{
"rows":[
{
"date":"2026-06-15 (Mon)",
"channel":"Display",
"media_cost":46427.07
},
{
"date":"2026-06-15 (Mon)",
"channel":"Paid Search",
"media_cost":18251
},
{
"date":"2026-06-15 (Mon)",
"channel":"Paid Social",
"media_cost":3152.5487000000003
}
],
"report_specification":{
"metrics":[
{
"ref":"56"
}
],
"dimensions":[
{
"ref":"1"
},
{
"ref":"33"
}
],
"filters":[
{
"ref":"33",
"type":"in",
"values":[
"Paid Search",
"Paid Social",
"Display"
]
}
],
"date_range":{
"start":"2026-06-15",
"end":"2026-06-15"
}
},
"metrics":[
{
"id":56,
"ref":"media_cost",
"name":"Media Cost",
"info":"Media Cost : CM360 + DV360 + SA360 + Meta Ads + Twitter Ads ",
"context":null,
"prefix":"£",
"suffix":"",
"decimals":2
}
],
"dimensions":[
{
"id":1,
"ref":"date",
"name":"Date",
"info":"",
"context":null
},
{
"id":33,
"ref":"channel",
"name":"Channel",
"info":"Channel name from all sources ",
"context":null
}
],
"row_count":3,
"run_duration":0.28710198402404785,
"generated_at":"2026-07-15T10:41:38.135107Z"
}

The full response also includes report_specification, and metrics/dimensions metadata arrays at the end o the response. The meta data for metrics and dimensions is for adding additional context - particularly when it comes to metrics - such as rounding, prefix, suffix, as well as additional information and context fields.

Errors

The API validates your request and returns a descriptive error message when something is wrong (e.g. a missing required field, an invalid filter combination, or an unrecognized ref). A typical error response looks like:

{
"message": "The required properties (metrics, date_range) are missing",
"errors": {
"": [
"The required properties (metrics, date_range) are missing"]
}
}

Rate limits & pagination

There are currently no rate limits or pagination on this endpoint.

Pagination support is planned for a future release.

Coming Soon

Features updates we have planned include:

  • Pagination - for especially large reports we will paginate results

  • Copy report specification from an existing report. This will make it easy to create a valid report specification to use as an API request start-point.

  • Metric and Dimension 'list' endpoints.

Did this answer your question?