Data Specification - Radio Stations

If you have actions that can stream content from a broadcast radio station, use the MusicPlaylist type with a creator block to describe the radio station.

Content Markup Properties

Property Expected Type Description
@context Text Required - Always set to http://schema.googleapis.com.
@type Text Required - Always set to MusicPlaylist for radio stations.
@id URL Required - A globally unique ID for the radio station in URI format. The ID should be stable and not change over time. It will be treated as an opaque string and does not have to be a working link. The domain used for the @id value must be owned by your organization.
url URL Required - The canonical URL for the radio station on your site, must be globally unique. This link is used to help accurately reconcile the content in your feed with the content in Google's databases. For playback, the target.urlTemplate detailed in the Action Markup Properties section of the documentation will be used.
name Text Required - The name of the playlist describing the radio station. For example, "WXKS FM". Use an array to mark up the name in multiple languages. An example is available in the "Multiple Language Representation" section of the Listen Action Examples page.
creator RadioStation Required - Describes the radio station that you're streaming.
creator.@type Text Required - Always set to RadioStation.
creator.name Text Required - The common name of the broadcast service itself or its parent network, for example "WXKS FM", or "NPR".
creator.@reverse.broadcastAffiliateOf BroadcastService Required - Container for the broadcast service that describes this radio station.
creator.@reverse.broadcastAffiliateOf.@type Text Required - Always set to BroadcastService.
creator.@reverse.broadcastAffiliateOf.name Text Required - The call sign of the radio station, for example, "WXKS FM".
creator.@reverse.broadcastAffiliateOf.broadcastDisplayName Text Required - The display name of the radio station, for example "Kiss 108"
creator.@reverse.broadcastAffiliateOf.broadcastFrequency BroadcastFrequencySpecification Required - The frequency and band on which the radio station broadcasts.
creator.@reverse.broadcastAffiliateOf.broadcastFrequency.@type Text Required - Always set this to BroadcastFrequencySpecification.
creator.@reverse.broadcastAffiliateOf.broadcastFrequency.broadcastFrequencyValue Text Required - The numerical part of the broadcast frequency.
creator.@reverse.broadcastAffiliateOf.broadcastFrequency.broadcastSignalModulation Text Required - The band/modulation part of the broadcast frequency.
creator.@reverse.broadcastAffiliateOf.areaServed AdministrativeArea Required - The area that this radio station serves. Note that while areaServed can also be of type schema.org/Place, schema.org/GeoShape or schema.org/Text, we highly recommend using schema.org/AdministrativeArea format to denote the service area that users are likely to associate with the radio station.
creator.@reverse.broadcastAffiliateOf.areaServed.@type Text Required - Always set this to a subtype of AdministrativeArea eg City.
creator.@reverse.broadcastAffiliateOf.areaServed.name Text Required - The common name of the area.
creator.@reverse.broadcastAffiliateOf.sameAs URL Recommended - URL to a reference web page that unambiguously identifies the radio station.
potentialAction ListenAction Required - Listen action(s) for the playlist. See ListenAction Properties for details.

Note: If you have deeplinks into your media content available in multiple regions, use an array to mark up the potentialAction for each region. An example is available in the "Multiple Language Representation" section of the Listen Action Examples page.
keywords Text Recommended - A list of keywords ("rock", "pop"), moods ("happy", "morose"), activities ("exercise", "chillin' like Magellan"), or other terms related to the radio station.
description Text Optional - A brief description of the radio station. Please limit to 300 characters. Use an array to mark up the description in multiple languages. An example is available in the "Multiple Language Representation" section of the Listen Action Examples page.
isFamilyFriendly Boolean Recommended - Indicates whether this content is family friendly (content that is considered to be suitable for all members of a family with children). Google products may use isFamilyFriendly when determining a song to play.

Quick Checks

  • For the entity level url property, please ensure that you are providing the canonical URL. The URL you provide should be unique for each entity, for example do not use the same URL for a MusicRecording as you would for a MusicAlbum.
  • @id is intended to be a unique ID for an entity across your entire catalog and should comply with the following guidelines:
    • Does not ever change
    • Unique per content type and across content types. For example, you may not use the same @id for a MusicRecording and a MusicAlbum
    • The same @id should be used throughout your structured data wherever the entity is referenced, for example the partOfSeries.@id for a TVEpisode should match the @id used for the main TVSeries definition
    • Must be in the form of a URI (does not need to be a working URL).
    • The domain used for the @id value must be owned by your organization.

In general we recommend that you use the same value for url and @id as long as the URL for the entity is unique across your catalog.

Action Markup Properties

Your Action markup specifies:

  • The deeplink(s) to use for a given piece of content on each of your platforms (e.g. iOS, Cast)
  • The availability information (e.g. geo-restrictions, availability windows) for a given piece of content on your service

For music content, Action markup takes the form of a ListenAction. These are nested/marked up in the potentialAction block of the Content markup.


You must supply a deeplink for every platform where you are able to serve content.
Property Expected type Description
potentialAction.@type Text Required - Always set to `ListenAction` for a listen actions.
target EntryPoint Required - A container for the action target.
target.@type Text Required - Always set to `EntryPoint` for the target container.
target.urlTemplate URL Required - This is the link that will be used to initiate playback of your content on your app. For voice-activated speaker integrations, for example, this link will be passed to the receiver app on the voice-activated speaker. See Deeplink Requirements for detailed requirements.
target.actionPlatform Text Required - The platform(s) on which the link works. One or more of the following:
  • http://schema.org/DesktopWebPlatform: Works on desktop web browsers.
  • http://schema.org/MobileWebPlatform: Works on mobile web browsers.
  • http://schema.org/AndroidPlatform: Works on Android native app.
  • http://schema.org/IOSPlatform: Works on iOS native app.
  • http://schema.googleapis.com/GoogleVideoCast: Works on a Chromecast device.
  • http://schema.googleapis.com/GoogleAudioCast: Works on a Chromecast Audio only device.
Note: If a link you're providing also works on your AndroidTV app, also include http://schema.org/AndroidTVPlatform in the list of platforms for that link. Do not use this type to provide a distinct link for AndroidTV that's different from your Android mobile or universal link.
expectsAcceptanceOf Offer Required - A container for the action conditions.
expectsAcceptanceOf.@type Text Required - Always set to `Offer` for the target container.
expectsAcceptanceOf.category Text Required - One of the following values:
  • nologinrequired: The action is available to the user with no purchase or login to access content.
  • free: The action is available with no purchase or paid subscription required of the user. The action does require a user to login.
  • subscription: The action is included with a paid subscription to your service.
expectsAcceptanceOf.availabilityStarts Date Optional - Date after which the action is available, in ISO 8601 format (including timezone). Can be a date in the future. Use this property to limit action availability by date/time. If not included, we will assume that action has no time limitation.
expectsAcceptanceOf.availabilityEnds Date Optional - Date after which the action is no longer available, in ISO 8601 format (including timezone). Use this property to limit action availability by date/time. If not included, we will assume that action has no time limitation.
expectsAcceptanceOf.eligibleRegion Country Required - Countries in which the action is available.
expectsAcceptanceOf.eligibleRegion.@type Text Required - Always set to `Country` for the eligibleRegion block.
expectsAcceptanceOf.eligibleRegion.name Text Required - The ISO 3166 country code.
  • Please adhere to the following restrictions for deeplink styles by platform:
    • For iOS and Chromecast, universal links are required.
    • For Android, universal links are recommended. If you do not yet support the universal link format on Android, the old style android-app://{package_id}/{scheme}/{path}/... URL format can be used.
  • We highly recommend that you implement universal links across all your platforms. For instructions on implementing Universal Links, see: iOS Documentation | Android Documentation.
  • Deeplinks do not need to be canonical
  • Deeplinks may include parameters/tags (e.g. for tracking purposes).

General Action Markup Guidelines

  • You may have an array of targets when you have different deeplinks for different platforms, and you may also have an array of offers when there are multiple ways to access the content. However, if your intent is to have different offers across different platforms, you should break those up into different ListenAction blocks.
  • Consolidate to as few ListenAction blocks as possible. For example, if all properties are the same across platforms (other than the deeplink), you should use a single action block.
  • To allow for freshness and processing time, we highly recommend that you provide ListenActions in advance of your content being available to users by using availabilityStarts to indicate when we can start serving.

If you encounter a scenario not discussed here, please reach out to your Google contact for assistance.

Example

The following example shows the markup for a radio station. For more music actions examples, see here.

<script type="application/ld+json">
{
  "@context":"http://schema.googleapis.com/",
  "@type":"MusicPlaylist",
  "@id":"http://www.example.com/radio/Kiss108-Boston/",
  "url":"http://www.example.com/radio/Kiss108-Boston/",
  "name":"Kiss 108FM",
  "creator": {
     "@type": "RadioStation",
     "name": "iHeartMedia",
     "@reverse": {
       "broadcastAffiliateOf": {
         "@type": "BroadcastService",
         "name": "WXKS-FM",
         "broadcastDisplayName": "Kiss 108",
         "broadcastFrequency":"108 FM",
         "sameAs":"https://en.wikipedia.org/wiki/WXKS-FM",
         "description":"Kiss 108 -- Boston's hit music station",
         "areaServed": {
           "@type": "City",
           "name": "Boston, MA"
        }
      }
    }
  },
  "potentialAction":{
    "@type":"ListenAction",
    "target": {
      "@type":"EntryPoint",
      "urlTemplate":"http://www.example.com/radio/Kiss108-Boston?autoplay=true",
      "actionPlatform":[
        "http://schema.org/DesktopWebPlatform",
        "http://schema.org/IOSPlatform",
        "http://schema.org/AndroidPlatform",
        "http://schema.googleapis.com/GoogleAudioCast",
        "http://schema.googleapis.com/GoogleVideoCast"
      ]
    },
    "expectsAcceptanceOf":{
      "@type":"Offer",
      "category":"NoLoginRequired",
      "eligibleRegion": {
        "@type":"Country",
        "name":"US"
      }
    }
  }
  "description":"Kiss 108 -- Boston's hit music station",
  "keywords": [
   "rock",
    "hits"
  ]
}
</script>