Revelator Logo API

Artificial Streams

Artificial streams are streams that DSPs identify as coming from automated or fraudulent sources—bots, scripts, or click farms—rather than genuine listeners. These endpoints report how many artificial streams were detected, how many assets were flagged, and the fines applied as a result, so you can find and address problem content.

Artificial Streams endpoints are available to organizations only. Client and portal accounts receive 403 Forbidden.

For the date range, pagination, sorting, and shared filters, see the Analytics Overview.

Moving from the V1.0 API? Responses are unchanged—only the route and a few parameters differ. See Migrating from the V1.0 API.

How Artificial Streams Are Reported

Artificial streams are identified and reported by the DSPs, not by Revelator. Their determinations are final—Revelator passes the data on but does not mediate disputes.

  • Coverage: only reports from DSPs that Revelator distributes to on your behalf are included. Streams from deals you hold directly with a DSP are not.
  • Freshness: Deezer reports daily. Spotify, Apple Music, and Amazon Music report monthly, with a delay of about one month, so recent months may be incomplete.

To learn what causes artificial streaming, what the consequences are, and how to avoid it, see What is artificial streaming and how to avoid it. For the dashboard in the Revelator web app, which is built on the same data, see Understanding and using the Artificial Streaming Dashboard.


Metrics

MetricMeaning
artificialStreamsCountNumber of streams the DSPs flagged as artificial.
flaggedAssetsCountNumber of assets (tracks or releases) the DSPs flagged as suspicious.
finesAmountAmount withheld from the next royalty run because of artificial streams detected in the period.

Dimensions

DimensionGroups byPopulated metadata fields
trackTrack.id, name, version, imageId
releaseRelease.id, name, version, imageId
artistArtist.id, name, imageId
labelLabel.id, name, imageId
countryListener country.id, iso2Code
distributorDSP.id, name
clientClient.id, name
dateNothing. Returns totals for the whole range, or a time series with dateGranularity.None

Artificial streams support dateGranularity values monthly and all.

With dimension=date and dateGranularity=monthly, the response has a single item whose metrics array holds one entry per month, and totalItemsCount equals the number of months rather than the number of items. See Pagination.


Sorting

orderByProperty accepts a metric column (artificialstreamscount, flaggedassetscount, or finesamount), eventdate, or a column of the requested dimension. For how sorting works, see the Analytics Overview.

DimensionDimension columns
tracktrackid, trackname, trackversion
releasereleaseid, releasename, releaseversion
artistartistid, artistname
labellabelid, labelname
countrycountryid, iso2code
distributordistributorid, distributorname
clientclientid, clientname
dateNone

Without orderByProperty and dateGranularity, results are ordered by artificialstreamscount, descending.


Get Artificial Streams

GET /analytics/v1/artificial-streams

Retrieves artificial stream counts, flagged assets, and fines grouped by the requested dimension.

Query Parameters

Parameter Description
dimension * string

How to group the results (case-insensitive). See the Dimensions section above.

Examples: track, artist, country, client, date
clientIds integer[]

Restrict to these clients.

countryIds integer[]

Restrict to these listener countries. Retrieved from GET /common/lookup/countries on the V1.0 API.

distributorIds integer[]

Restrict to these DSPs. Use the distributorId from GET /common/lookup/distributors on the V1.0 API, not a store ID.

excludeDistributorIds integer[]

Leave out these DSPs. Use the distributorId from GET /common/lookup/distributors on the V1.0 API, not a store ID.

excludeTikTok boolean

Leave out TikTok. Equivalent to adding TikTok to excludeDistributorIds.

releaseIds integer[]

Restrict to these releases.

trackIds integer[]

Restrict to these tracks.

artistIds integer[]

Restrict to these artists.

labelIds integer[]

Restrict to these labels.

dateGranularity string

With monthly, each row's metrics carry one entry per month in the range (case-insensitive).

Examples: monthly, all
onlyNew boolean

Return only data first loaded today. Cannot be combined with fromDate or toDate.

orderByProperty string

Sort column (case-insensitive). The accepted values depend on dimension; an unsupported value returns 400 with the accepted ones. See the Sorting section above.

Examples: artificialstreamscount, flaggedassetscount, finesamount, eventdate
orderByDescending boolean

Sort in descending order. Defaults to false.

pageSize integer

Items per page. Defaults to 2000, which is also the maximum.

pageNumber integer

1-based page number. Defaults to 1.

fromDate string

Inclusive start date (YYYY-MM-DD). See the date range defaults in the Analytics Overview.

toDate string

Inclusive end date (YYYY-MM-DD). See the date range defaults in the Analytics Overview.

targetEnterpriseId integer

Scope the request to a single client by passing its ID.

Responses

object
artificialStreamsCount integer | null
Total streams flagged as artificial.
flaggedAssetsCount integer | null
Total assets with flagged streams.
finesAmount number | null
Total fines applied.
fromDate string | null
Effective start date (YYYY-MM-DD) after defaults were applied.
toDate string | null
Effective end date (YYYY-MM-DD) after defaults were applied.
totalItemsCount integer
The total number of items available across all pages
pageNumber integer | null
The current page number in the paginated result set (1-indexed)
pageSize integer | null
The number of items per page in the paginated result set
totalPagesCount number
The total number of pages available based on the page size
id integer | null
ID of the entity in the requested dimension (a track ID for track, a client ID for client, and so on).
name string | null
Name of the entity (track or release title, artist, label, DSP, or client name).
version string | null
Version of the track or release.
imageId string | null
File ID of the entity's artwork or image.
iso2Code string | null
ISO 3166-1 alpha-2 country code. Populated for the country dimension.
artificialStreamsCount integer | null
Streams flagged as artificial.
flaggedAssetsCount integer | null
Assets with flagged streams.
finesAmount number | null
Fines applied.
eventDate string (date-time) | null
Start of the month with dateGranularity=monthly; null otherwise.
GET /analytics/v1/artificial-streams
curl -X GET "https://platform.revelator.com/analytics/v1/artificial-streams?dimension=track&orderByProperty=artificialstreamscount&orderByDescending=true&pageSize=2" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Example response 200
{
"totals": {
  "artificialStreamsCount": 4620,
  "flaggedAssetsCount": 156,
  "finesAmount": 0.00
},
"fromDate": "2026-07-22",
"toDate": "2026-10-22",
"totalItemsCount": 156,
"pageNumber": 1,
"pageSize": 2,
"totalPagesCount": 78,
"items": [
  {
    "metadata": {
      "id": 5889901,
      "name": "Track Title",
      "version": null,
      "imageId": null,
      "iso2Code": null
    },
    "metrics": [
      { "artificialStreamsCount": 1137, "flaggedAssetsCount": 1, "finesAmount": 0.00, "eventDate": null }
    ]
  },
  {
    "metadata": {
      "id": 5898129,
      "name": "Another Track",
      "version": null,
      "imageId": null,
      "iso2Code": null
    },
    "metrics": [
      { "artificialStreamsCount": 1128, "flaggedAssetsCount": 1, "finesAmount": 0.00, "eventDate": null }
    ]
  }
]
}

Artificial Streams Dashboard

The dashboard groups artificial streams by client and compares them against an earlier period, so you can see which clients are improving and which are getting worse.

Comparison Period

Pass previousFromDate and previousToDate together to compare against an earlier period. The previous period must start before fromDate and end before toDate. Sending only one of the two returns 400 Bad Request.

The comparison fields (previousArtificialStreamsCount, artificialStreamsChange, artificialStreamsChangePct, and increase) are only calculated when:

  • both previousFromDate and previousToDate are provided, and
  • dateGranularity is omitted or set to all.

Otherwise, they are null on each item and 0 in totals.

Sorting

orderByProperty accepts artificialstreamscount, previousartificialstreamscount, artificialstreamschange, artificialstreamschangepct, eventdate, clientid, and clientname. Without orderByProperty and dateGranularity, results are ordered by artificialstreamscount, descending.

GET /analytics/v1/artificial-streams/dashboard

Retrieves artificial streams per client, optionally compared against a previous period.

Query Parameters

Parameter Description
dimension * string

How to group the results (case-insensitive).

Example: client
previousFromDate string

Start of the comparison period (YYYY-MM-DD). Send together with previousToDate; omit both for no comparison.

previousToDate string

End of the comparison period (YYYY-MM-DD). Send together with previousFromDate.

clientIds integer[]

Restrict to these clients.

countryIds integer[]

Restrict to these listener countries. Retrieved from GET /common/lookup/countries on the V1.0 API.

distributorIds integer[]

Restrict to these DSPs. Use the distributorId from GET /common/lookup/distributors on the V1.0 API, not a store ID.

excludeDistributorIds integer[]

Leave out these DSPs. Use the distributorId from GET /common/lookup/distributors on the V1.0 API, not a store ID.

excludeTikTok boolean

Leave out TikTok. Equivalent to adding TikTok to excludeDistributorIds.

releaseIds integer[]

Restrict to these releases.

trackIds integer[]

Restrict to these tracks.

artistIds integer[]

Restrict to these artists.

labelIds integer[]

Restrict to these labels.

dateGranularity string

With monthly, each row's metrics carry one entry per month in the range, and the comparison is not calculated (case-insensitive).

Examples: monthly, all
onlyNew boolean

Return only data first loaded today. Cannot be combined with fromDate or toDate.

orderByProperty string

Sort column (case-insensitive). See the Sorting section above for the accepted values.

Examples: artificialstreamscount, previousartificialstreamscount, artificialstreamschange, artificialstreamschangepct, eventdate
orderByDescending boolean

Sort in descending order. Defaults to false.

pageSize integer

Items per page. Defaults to 2000, which is also the maximum.

pageNumber integer

1-based page number. Defaults to 1.

fromDate string

Inclusive start date of the current period (YYYY-MM-DD). See the date range defaults in the Analytics Overview.

toDate string

Inclusive end date of the current period (YYYY-MM-DD). See the date range defaults in the Analytics Overview.

targetEnterpriseId integer

Scope the request to a single client by passing its ID.

Responses

object
artificialStreamsCount integer | null
Total artificial streams in the current period.
previousArtificialStreamsCount integer | null
Total artificial streams in the comparison period. 0 when no comparison is calculated.
artificialStreamsChange integer | null
Absolute change between the periods. 0 when no comparison is calculated.
artificialStreamsChangePct number | null
Percentage change between the periods. 0 when no comparison is calculated.
fromDate string | null
Effective start date of the current period (YYYY-MM-DD) after defaults were applied.
toDate string | null
Effective end date of the current period (YYYY-MM-DD) after defaults were applied.
totalItemsCount integer
The total number of items available across all pages
pageNumber integer | null
The current page number in the paginated result set (1-indexed)
pageSize integer | null
The number of items per page in the paginated result set
totalPagesCount number
The total number of pages available based on the page size
id integer | null
ID of the client.
name string | null
Name of the client.
version string | null
Not used by the dashboard; always null.
imageId string | null
Not used by the dashboard; always null.
iso2Code string | null
Not used by the dashboard; always null.
artificialStreamsCount integer | null
Artificial streams in the current period.
previousArtificialStreamsCount integer | null
Artificial streams in the comparison period.
artificialStreamsChange integer | null
Absolute change between the periods.
artificialStreamsChangePct number | null
Percentage change between the periods. null when the comparison period has no artificial streams.
increase boolean | null
true if artificial streams increased, false if they decreased, null when unchanged or not compared.
eventDate string (date-time) | null
Start of the month with dateGranularity=monthly; null otherwise.
GET /analytics/v1/artificial-streams/dashboard
curl -X GET "https://platform.revelator.com/analytics/v1/artificial-streams/dashboard?dimension=client&fromDate=2026-07-01&toDate=2026-09-30&previousFromDate=2026-04-01&previousToDate=2026-06-30&orderByProperty=artificialstreamscount&orderByDescending=true&pageSize=2" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Example response 200
{
"totals": {
  "artificialStreamsCount": 8466,
  "previousArtificialStreamsCount": 13590,
  "artificialStreamsChange": -5124,
  "artificialStreamsChangePct": -37.70
},
"fromDate": "2026-07-01",
"toDate": "2026-09-30",
"totalItemsCount": 29,
"pageNumber": 1,
"pageSize": 2,
"totalPagesCount": 15,
"items": [
  {
    "metadata": {
      "id": 559630,
      "name": "Client Name",
      "version": null,
      "imageId": null,
      "iso2Code": null
    },
    "metrics": [
      {
        "artificialStreamsCount": 5111,
        "previousArtificialStreamsCount": 11936,
        "artificialStreamsChange": -6825,
        "artificialStreamsChangePct": -57.18,
        "increase": false,
        "eventDate": null
      }
    ]
  },
  {
    "metadata": {
      "id": 293319,
      "name": "Another Client",
      "version": null,
      "imageId": null,
      "iso2Code": null
    },
    "metrics": [
      {
        "artificialStreamsCount": 2442,
        "previousArtificialStreamsCount": 1419,
        "artificialStreamsChange": 1023,
        "artificialStreamsChangePct": 72.09,
        "increase": true,
        "eventDate": null
      }
    ]
  }
]
}

Migrating from the V1.0 API

These endpoints replace the V1.0 GET /analytics/artificialStreams/{aggregation} and GET /analytics/artificialStreams/dashboard/byClient routes. The V1.0 routes are deprecated: after November 25, 2026, they are no longer supported and may stop working without prior notice.

The responses are identical, field for field, and you keep using the same access token. Only the route changes: the path is now artificial-streams, and the by… path segment becomes the dimension query parameter.

V1.0V2.0
https://api.revelator.com/analytics/artificialStreams/by{Aggregation}https://platform.revelator.com/analytics/v1/artificial-streams?dimension={dimension}
https://api.revelator.com/analytics/artificialStreams/dashboard/byClienthttps://platform.revelator.com/analytics/v1/artificial-streams/dashboard?dimension=client
V1.0 aggregationdimension
byTracktrack
byReleaserelease
byArtistartist
byLabellabel
byCountrycountry
byDistributordistributor
byClientclient
byDatedate

All other query parameters—fromDate, toDate, previousFromDate, previousToDate, dateGranularity, pagination, sorting, and filters—keep their names and behavior.

- GET https://api.revelator.com/analytics/artificialStreams/byTrack?fromDate=2026-07-01&toDate=2026-09-30
+ GET https://platform.revelator.com/analytics/v1/artificial-streams?dimension=track&fromDate=2026-07-01&toDate=2026-09-30