Analytics

Analytics

Analytics Overview

Revelator’s Analytics API provides a complete view of performance and earnings data across your catalog.

Use the V3 Analytics endpoints for:

  • Consumption data (formerly known as Trends)
  • Engagement metrics (listener behavior and interaction)

For revenue analytics, continue using the endpoints described in Comprehensive Analytics.

For a simplified endpoint with pre-calculated, enterprise-level metrics, see Keymetrics.

Comprehensive Analytics

The primary analytics endpoints follow a standardized URL template with interchangeable components.

/analytics/{dataSet}/{aggregationDimension}?dateGranularity={granularity}


Response Structure and Behavior

Each analytics response includes a metadata object and may optionally include date information, depending on your query parameters.

  • metadata varies depending on the aggregationDimension. It can be represented as a generic type with a metadata type parameter: AnalyticsResponseItem<TMetadata>, using a specific TMetadata for each aggregationDimension.
  • date should be excluded or set to null if dateGranularity is null or all.
  • Filter dimensions (such as track, release, etc.) are not included in the response data. These values are only valid as filters applied to the source data before aggregation. The final response always reflects post-aggregation data, where those raw filter dimensions are no longer available.

Analytics Query components

ComponentPassed asDescription
Data Set
required
URL parameterData range to be aggregated.
Currently supports:
  1. revenue
Aggregation Dimension
required
URL parameterData grouping dimension.
Currently supports:
  1. byCountry
  2. byDistributor
  3. byTrack
  4. byDeliveryType
  5. byRelease
  6. byArtist
  7. byLabel
  8. byFormat
  9. byYouTubeChannel
  10. byYouTubeVideo
Date Granularity
optional
Querystring parameter: dateGranularityFilter Level of date grouping.
Options are:
  1. Daily
  2. Monthly
  3. Yearly
  4. All
  5. null to not aggregate by date
FilterMultiple querystring parameters based on the desired filter.Filters to be applied to the dataSet before grouping. You can apply multiple filters simultaneously.
Currently supports:
  1. releaseIds
  2. trackIds
  3. artistIds
  4. labelIds
  5. countryIds
  6. distributorIds
  7. excludeDistributorIds

Important: How to format array filters in the URL
To provide an array of IDs, you must format the query string parameters by encoding the array brackets ([]) and providing an index for each value.

Example: To filter for releaseIds=[1035587, 1628168], your query string would look like this:
?releaseIds%5B0%5D=1035587&releaseIds%5B1%5D=1628168
Page
optional
Querystring parameters:
  1. pageSize
  2. pageNumber
Controls the amount of response data provided.
Order
optional
Querystring parameters:
  1. orderByDescending (boolean)
  2. orderByProperty (any property, such as streamcount)
Controls how the response data is ordered, and by what property.
Date range
optional
Querystring parameters:
  1. fromDate
  2. toDate
Filters the results by date. Both parameters expect an ISO 8601 date format (e.g., YYYY-MM-DD).

Behavior:
- If fromDate and toDate are both provided: The API returns results for the specified date range.
- If only fromDate is provided: The API returns results for a three-month period starting from the fromDate.
- If only toDate is provided: The API returns results for a three-month period ending on the toDate.
- If neither is provided: The API returns results for the last three months by default.
Targer Enterprise
optional
Querystring parameter: targetEnterpriseId (integer)Allows a parent enterprise user to retrieve data specifically for one of their child enterprises.
Important: Currently, this parameter is only effective when the Data Set (URL parameter) is revenue. It will be ignored for other Data Sets.

Examples

Example requests for different combinations of Data Sets and Aggregation Dimensions.

Revenue (revenue) Analytics

Example: Revenue by Country (All Granularity)
Example: Revenue by Distributor
Example: Revenue by Track
Example: Revenue by Delivery Type
Example: Revenue by Release
Example: Revenue by Artist
Example: Revenue by Label
Example: Revenue by Format
Example: Revenue by YouTube Channel
Example: Revenue by YouTube Video

Keymetrics

The following endpoint retrieves aggregated revenue analytics data by date.

GET /analytics/revenue/metricsByDate

Retrieves monthly revenue analytics data. Each object in the response represents one month within the selected date range.

Query Params

ParameterTypeDescription
fromDate
optional
stringThe start date for the date range, in YYYY-MM-DD format. Defaults to the most current date with available data. As Revenue data is segregated monthly, this date should typically be the first of the month.
toDate
optional
stringThe end date for the date range, in YYYY-MM-DD format. Defaults to the most current date with available data. As Revenue data is segregated monthly, this date should typically be the first of the month.
metrics
optional
stringDefaults to all available metrics. To request specific metrics, provide the parameter once for each desired metric.
Example: metrics=monthRevenue
targerEnterpriseId
optional
integerAllows a parent enterprise user to retrieve metrics specifically for one of their child enterprises.
Example: Requesting Multiple Specific Metrics
Example: Requesting All Metrics for a Date Range

V3 Analytics

The Revelator Analytics API (v3) provides a comprehensive set of endpoints for retrieving detailed consumption and engagement metrics. This version replaces the previous Trends API and is now the standard analytics interface.

Currently, V3 includes only the consumption and engagement data endpoints. Additional data types—such as revenue - and expanded metrics will be introduced in future releases.


GET /analytics/{metric}/{aggregation}

Retrieves analytics data - such as consumption or engagement metrics - aggregated by various dimensions.


Available Metrics

  • consumption - formerly known as trends.
  • engagement - engagement-based analytics, including user interaction metrics.

Each metric returns its own set of metrics in the response object.


Available Aggregation Dimensions

AggregationDescription
byArtistGrouped by artist.
byCountryGrouped by listener country.
byDateAggregated by date.
byDeliveryTypeAggregated by delivery type (e.g., streaming, download).
byDiscoveryTypeGrouped by discovery source.
byDistributorGrouped by DSP.
byLabelGrouped by label.
byRecordingVersionAggregated by audio version (e.g., stereo, Dolby Atmos).
byReleaseGrouped by release.
byTrackGrouped by track.
bySourceOfStreamGrouped by stream source.

Usage Notes

  1. The byDate endpoint does not include a metadata object in its response items.
  2. When using dateGranularity, results are nested within a metrics array for each item.
  3. When applying multiple filters of the same type, separate query parameters must be provided. Example:
    releaseIds=2384320&releaseIds=1628168

Query Params

ParameterTypeDescription
fromDate
required
stringStart date for the data range (YYYY-MM-DD).
toDate
required
stringEnd date for the data range (YYYY-MM-DD).
dateGranularity
optional
stringDate granularity for results. Possible values: Daily, Weekly, Monthly, Quarterly, Yearly, All, Null.
pageSize
optional
integerNumber of items per page.
pageNumber
optional
integerPage number for pagination.
orderByProperty
optional
stringProperty to order results by (e.g., streamsCount).
orderByDescending
optional
booleanIf true, orders results in descending order.

Filters (also provided as query params)

FilterTypeDescriptionApplicable Aggregations
releaseIdsarray of integersFilter by one or more release IDs.All
trackIdsarray of integersFilter by one or more track IDs.All
artistIdsarray of integersFilter by one or more artist IDs.All
labelIdsarray of integersFilter by one or more label IDs.All
distributorIdsarray of integersFilter by one or more distributor IDs.All
excludeDistributorIdsarray of integersExclude specific distributor IDs from the results.All
excludeTikTokbooleanIf true, excludes TikTok data from the results. Defaults to false.All
countryIdsarray of integerFilter by one or more country IDs.All
deliveryTypeIdsarray of integersFilter by one or more delivery type IDs.byDeliveryType
discoveryTypeIdsarray of integersFilter by one or more discovery type IDs.byDiscoveryType
recordingVersionTypeIdsarray of integersFilter by one or more recording version type IDs.byRecordingVersion
sourceOfStreamIdsarray of integersFilter by one or more source of stream IDs.bySourceOfStream
isUgcbooleanIf true, filters results to only include User-Generated Content (UGC) metrics. If false or omitted, only includes non-UGC metrics. This affects which metric fields are populated.All
isSkipRatebooleanIf true, this filter will exclude entire items from the results where the skipRate metric is 0. This parameter is only relevant when the {metric} type is engagement.All

Response

ParameterTypeDescription
totalsobjectAggregated totals for the entire request. Values will differ based on the data set (consumption or engagement).
totals.streamsCountinteger[All types] Total count for streams.
totals.trackDownloadCountinteger[consumption] Total count for track downloads.
totals.releaseDownloadCountinteger[consumption] Total count for release downloads.
totals.sub30sCountinteger[enagement] Total count of streams bellow 30 seconds.
totals.savesCountinteger[enagement] Total count of saves.
totals.skipRatefloat[enagement] A float value representing the total skip rate.
totals.completeRatefloat[enagement] A float value representing the total complete rate.
totals.creationsCountinteger[engagement] Total count of creations. (Will be 0 if isUgc is false or omitted).
totals.likesCountinteger[engagement] Total count of likes. (Will be 0 if isUgc is false or omitted).
totals.sharesCountinteger[enagagement] Total count of shares. (Will be 0 if isUgc is false or omitted).
totals.commentsCountinteger[engagement] Total count of comments. (Will be 0 if isUgc is false or omitted).
totals.watchTimefloat[engagement] Total watch time. (Will be 0 if isUgc is false or omitted).
fromDatestringStart date of the data range.
toDatestringEnd date of the data range.
totalItemsCountintegerTotal number of items in the result set.
pageNumberintegerCurrent page number.
pageSizeintegerNumber of items per page.
itemsarrayResulting array of consumption data items.
items.metadataobjectMetadata for the item. This value changes depending on the aggregation dimension (null if byDate aggregation is used).
items.metricsobjectMetrics for the item. TValues will differ between different data set types (consumption or engagement).
items.metrics.streamsCountinteger[All types] Count for streams. (Will be null if isUgc is true).
items.metrics.trackDownloadCountinteger[consumption] Count for track downloads. (Will be null if isUgc is true).
items.metrics.releaseDownloadCountinteger[consumption] Count for release downloads. (Will be null if isUgc is true).
items.metrics.eventDatestring[consumption] Date of the event (null if not applicable)
items.metrics.sub30sCountinteger[enagement] Count of streams bellow 30 seconds. (Will be null if isUgc is true).
items.metrics.savesCountinteger[enagement] Count saves. (Will be null if isUgc is true).
items.metrics.skipRatefloat[enagement] A float value representing the skip rate for the item. (Will be null if isUgc is true).
items.metrics.completeRatefloat[enagement] A float value representing the complete rate for the item. (Will be null if isUgc is true).
items.metrics.viewsCountinteger[consumption] Views count for the item. (Will be null if isUgc is false).
items.metrics.creationsCountinteger[engagement] Total count of creations for the item. (Will be null if isUgc is false).
items.metrics.likesCountinteger[engagement] Total count of likes for the item. (Will be null if isUgc is false).
items.metrics.sharesCountinteger[enagagement] Total count of shares for the item. (Will be null if isUgc is false).
items.metrics.commentsCountinteger[engagement] Total count of comments for the item. (Will be null if isUgc is false).
items.metrics.watchTimefloat[engagement] Total watch time for the item. (Will be null if isUgc is false). Relevant only for Youtube and will not be populated for /engagement/byRelease?isUgc=true because YT does not have releases.

Consumption (consumption) Examples

Consumption by Artist
Consumption by Country
Consumption by Delivery Type
Consumption by Discovery Type
Consumption by Distributor
Consumption by Label
Consumption by Recording Version
Consumption by Release
Consumption by Track
Consumption by Source of Stream

Engagement (engagement) Examples

Engagement by Artist
Engagement by Country
Engagement by Delivery Type
Consumption by Discovery Type
Engagement by Distributor
Engagement by Label
Engagement by Recording Version
Engagement by Release
Engagement by Track
Engagement by Source of Stream

UGC-Specific Examples

Consumption Analytics by Track (Including UGC: isUgc=true)
Engagement Analytics by Track (Including UGC: isUgc=true)
Engagement Analytics by Distributor (Including UGC: isUgc=true)

Understanding the byDate Aggregation

The byDate aggregation is unique because it returns a single item in the main items array. This single item contains a metrics array, and the structure of this metrics array is determined by the dateGranularity parameter.

When using byDate, the metadata object is not present in the response.

Here’s how each dateGranularity option affects the metrics array within the byDate aggregation:

dateGranularity ValueResulting metrics Array Structure
DailyAn array of objects, one for each day in the requested date range. Each object’s eventDate will be the date of the metrics (e.g., 2024-07-01T00:00:00Z).
WeeklyAn array of objects, one for each week in the requested date range. Each object’s eventDate will be the start of the week (Monday at midnight UTC, e.g., 2024-07-01T00:00:00Z).
MonthlyAn array of objects, one for each month in the requested date range. Each object’s eventDate will be the first day of the month (at midnight UTC, e.g., 2024-07-01T00:00:00Z).
QuarterlyAn array of objects, one for each quarter in the requested date range. Each object’s eventDate will be the first day of the quarter (Jan 1, Apr 1, Jul 1, Oct 1).
YearlyAn array of objects, one for each year in the requested date range. Each object’s eventDate will be the first day of the year (Jan 1).
All, Null, or omittedA single object in the array, containing the aggregated total metrics for the entire specified date range. The eventDate for this object will be null.

byDate Aggregation Examples

Example: Consumption by Date (Daily Granularity)
Example: Engagement by Date (Monthly Granularity)

Artificial Streaming

Artificial streaming endpoints allow you to verify whether streams from client-provided content originate from automated or fraudulent sources (e.g., bots, scripts, or click farms) rather than genuine listener activity.

The fewer artificial streams detected, the healthier the catalog performance and revenue accuracy.


GET /analytics/artificialStreams/{aggregation}

Retrieves artificial streaming data aggregated by various dimensions.


Available Aggregation Dimensions

AggregationDescription
byTrackGrouped by track.
byReleaseGrouped by release.
byArtistGrouped by artist.
byLabelGrouped by label.
byCountryGrouped by listener country.
byDistributorGrouped by DSP.
byDateAggregated by date.
byClientGrouped by client account.

Usage Notes

  1. The byDate endpoint does not include a metadata object in its response items.
  2. When using dateGranularity, results are nested within a metrics array for each item.
  3. When using multiple filters of the same type, separate query parameters must be provided:
    releaseIds=2384320&releaseIds=1628168

Response Fields

The response includes a key value:

  • finesAmount - the total amount withheld from the next royalty run due to artificial streaming detections during the queried period.

This value helps identify the financial impact of detected artificial streaming activity.


Query Params

ParameterTypeDescription
fromDate
optional
stringThe start date for the data range, in YYYY-MM-DD format. If both fromDate and toDate are omitted, the API returns results from the past three months.
toDate
optional
stringThe end date for the data range, in YYYY-MM-DD format. If both fromDate and toDate are omitted, the API returns results from the past three months.
dateGranularity
optional
stringDate granularity for results. Possible values: Monthly, All, Null.
pageSize
optional
integerNumber of items per page.
pageNumber
optional
integerPage number for pagination.
orderByProperty
optional
stringProperty to order results by (e.g., artificialStreamsCount).
orderByDescending
optional
booleanIf true, orders results in descending order.

Filters (also provided as query params)

FilterTypeDescriptionApplicable Aggregations
targetEnterpriseIdintegerFilter by your child enterprise.All
releaseIdsarray of integersFilter by one or more release IDs.All
trackIdsarray of integersFilter by one or more track IDs.All
artistIdsarray of integersFilter by one or more artist IDs.All
labelIdsarray of integersFilter by one or more label IDs.All
distributorIdsarray of integersFilter by one or more distributor IDs.All
excludeDistributorIdsarray of integersExclude specific distributor IDs from the results.All
countryIdsarray of integersFilter by one or more country IDs.All

Response

ParameterTypeDescription
totalsobjectAggregated totals for the entire request.
totals.artificialStreamsCountintegerTotal count for artificial streams.
totals.flaggedAssetsCountintegerTotal count for assets flagged with artificial streams.
totals.finesAmountfloatTotal amount of applied fines.
fromDatestringStart date of the data range (ISO 8601 format).
toDatestringEnd date of the data range (ISO 8601 format).
totalItemsCountintegerTotal number of items in the result set.
pageNumberintegerCurrent page number.
pageSizeintegerNumber of items per page.
itemsarrayResulting array of artificial streams data items.
items.metadataobjectMetadata for the item. This value changes depending on the aggregation dimension (null if byDate aggregation is used).
items.metricsobjectMetrics for the item.
items.metrics.artificialStreamsCountintegerCount for artificial streams.
items.metrics.flaggedAssetsCountintegerCount for flagged assets.
items.metrics.finesAmountfloatTotal amount of fines.
items.metrics.eventDatestringDate of the event (ISO 8601 format; null if dateGranularity = All or Null).

Examples

Artificial Streams by Track
Artificial Streams by Release
Artificial Streams by Artist
Artificial Streams by Label
Artificial Streams by Country
Artificial Streams by Distributor
Artificial Streams by Client

Understanding the byDate Aggregation

The byDate aggregation is unique because it returns a single item in the main items array. This single item contains a metrics array, and the structure of this metrics array is determined by the dateGranularity parameter.

When using byDate, the metadata object is not present in the response.

Here’s how each dateGranularity option affects the metrics array within the byDate aggregation:

dateGranularity ValueResulting metrics Array Structure
MonthlyAn array of objects, one for each month in the requested date range. Each object’s eventDate will be the first day of the month (at midnight UTC, e.g., 2024-07-01T00:00:00Z).
All, Null, or omittedA single object in the array, containing the aggregated total metrics for the entire specified date range. The eventDate for this object will be null.

byDate Aggregation Examples

Example: Artificial Streams by Date (Monthly Granularity)
Example: Artificial Streams by Date (All Granularity)

GET /analytics/artificialStreams/dashboard/byClient

Retrieves artificial streaming data aggregated by client, comparing a specified date range against a previous one.


Comparison Behavior

When comparison parameters are not provided, certain fields in the response will always be 0 or null:

FieldDescription
previousArtificialStreamsCountArtificial stream count for the previous date range.
artificialStreamsChangeAbsolute difference between current and previous counts.
artificialStreamsChangePctPercentage change between current and previous counts.
increaseIndicates whether the change represents an increase (true) or decrease (false).

These values are 0 or null when either:

  • previousFromDate and previousToDate are omitted, or
  • dateGranularity = Monthly is used.

In these cases, there is no valid prior period for comparison, or the data is aggregated at a consolidated level (e.g., “All”), where per-item changes cannot be calculated.


Query Params

ParameterTypeDescription
fromDate
optional
stringStart date for the data current range (YYYY-MM-DD).
toDate
optional
stringEnd date for the data current range (YYYY-MM-DD).
previousFromDate
optional
stringStart date for the previous data range (YYYY-MM-DD).
previousToDate
optional
stringEnd date for the previous data range (YYYY-MM-DD).
dateGranularity
optional
stringDate granularity for results. Possible values: Monthly, All, Null.
pageSize
optional
integerNumber of items per page.
pageNumber
optional
integerPage number for pagination.
orderByProperty
optional
stringProperty to order results by (e.g., artificialStreamsCount).
orderByDescending
optional
booleanIf true, orders results in descending order.

Filters (also provided as query params)

FilterTypeDescription
targetEnterpriseIdintegerFilter by your child enterprise.
releaseIdsarray of integersFilter by one or more release IDs.
trackIdsarray of integersFilter by one or more track IDs.
artistIdsarray of integersFilter by one or more artist IDs.
labelIdsarray of integersFilter by one or more label IDs.
distributorIdsarray of integersFilter by one or more distributor IDs.
excludeDistributorIdsarray of integersExclude specific distributor IDs from the results.
countryIdsarray of integersFilter by one or more country IDs.

Response

ParameterTypeDescription
totalsobjectAggregated totals for the entire request.
totals.artificialStreamsCountintegerTotal count for artificial streams (current period).
totals.previousArtificialStreamsCountintegerTotal count for artificial streams (previous period).
totals.artificialStreamsChangeintegerThe numerical change in artificial streams count (current vs. previous period).
totals.artificialStreamsChangePctfloatThe percentage change in artificial streams count (current vs. previous period).
fromDatestringStart date of the current data range (ISO 8601 format).
toDatestringEnd date of the current data range (ISO 8601 format).
totalItemsCountintegerTotal number of items in the result set.
pageNumberintegerCurrent page number.
pageSizeintegerNumber of items per page.
itemsarrayResulting array of artificial streams data items.
items.metadataobjectMetadata for the item.
items.metadata.idobjectEnterprise ID.
items.metadata.nameobjectEnterprise name.
items.metricsobjectMetrics for the item.
items.metrics.artificialStreamsCountintegerCount for artificial streams (current period).
items.metrics.previousArtificialStreamsCountintegerCount for artificial streams (previous period).
items.metrics.artificialStreamsChangeintegerNumerical change in artificial streams count (current vs. previous period).
items.metrics.artificialStreamsChangePctfloatPercentage change in artificial streams count (current vs. previous period).
items.metrics.increasebooleanIndicates if there was an increase in artificial streams (current vs. previous period).
items.metrics.eventDatestringDate of the event (ISO 8601 format; null if dateGranularity = All or Null).

Examples

Example: Artificial Streams Change (All Granularity)
Example: Artificial Streams Change (Monthly Granularity)